AlekseyPopovv,
В первом случае сложностей не вижу
Во втором случае вижу пару особенностей в виде необходимости получения SID и преобразования буквы диска в имя устройства
Для получения SID текущено пользователя можно применить макрос GetCurrentUserSID
GetCurrentUserSID
Код:
![Выделить весь код](images/misc/selectcode.png)
!define GetCurrentUserSID `!insertmacro GetCurrentUserSID `
!macro GetCurrentUserSID out_SID
Push $0 ; fn ret / out_SID
Push $1 ; SID struct
Push $2 ; tmp
System::Call "advapi32::GetUserName(t.s, *i${NSIS_MAX_STRLEN}) i.r0"
StrCmp $0 0 +5
System::Call 'advapi32::LookupAccountName(i0, ts, @r1, *i${NSIS_MAX_STRLEN}, t .r2, *i ${NSIS_MAX_STRLEN}, *i .r2 ) i.r0'
StrCmp $0 0 +3
System::Call 'advapi32::ConvertSidToStringSid(pr1, *t.r0 )'
Goto +2
StrCpy $0 ''
Pop $2
Pop $1
Exch $0
Pop ${out_SID}
!macroend
Пример использования:
Код:
![Выделить весь код](images/misc/selectcode.png)
${GetCurrentUserSID} $0
DetailPrint 'SID = [$0]'
Если надо пройтись по всем пользователям, то можно использовать макрос
EnumUsersReg EnumUsersRegEx (
пример).
Для преобразования пути в простейшем случае (c:\path -> \Device\HarddiskVolume3\path) можно использовать такой макрос:
Скрытый текст
Код:
![Выделить весь код](images/misc/selectcode.png)
!define GetPathWithDeviceName `!insertmacro GetPathWithDeviceName `
!macro GetPathWithDeviceName out_DevPath in_DOSPath
Push '${in_DOSPath}'
Exch $0
Push $1
Push $2
StrLen $1 $0
StrCmp $1 1 0 +3
StrCpy $1 $0:
Goto +2
StrCpy $1 $0 2
System::Call 'kernel32::QueryDosDevice(tr1, t.r2, i${NSIS_MAX_STRLEN} ) i.r3'
StrCmp $3 0 0 +3
StrCpy $0 ''
Goto +3
StrCpy $0 $0 '' 2
StrCpy $0 $2$0
Pop $2
Pop $1
Exch $0
Pop ${out_DevPath}
!macroend
Пример использования:
Код:
![Выделить весь код](images/misc/selectcode.png)
${GetPathWithDeviceName} $0 "C:\path\to\file"
DetailPrint 'path = [$0]'