Ярлык запуска для другого пользователя - PullRequest
0 голосов
/ 07 июня 2011

Я делаю принудительную удаленную установку с PsExecute на некоторых клиентских компьютерах.У меня проблема в том, что я запускаю установщики как локальный администратор, но я хотел бы добавить стартовый ярлык для конкретного пользователя.В nsis я могу выбирать только между пользователями (локальным администратором) или всей средой.Как добавить ярлык в папку автозагрузки User1?

1 Ответ

0 голосов
/ 07 июня 2011

Если вы знаете пароль пользователя, вы можете вызвать LogonUser + SHGetFolderPath, но я предполагаю, что вы не знаете пароль.

Использование некоторых недокументированных расположений реестра - единственная альтернатива, если вы не знаетепароль и пользователь не вошел в систему:

Вам нужны части заголовочных файлов EnumUsersReg и GetUserShellFolderFromRegistry из вики NSIS и этого вспомогательного макроса:

!macro EnumUsersRegX_LoadRegFromSID SID CallbackFunc Subkey
System::Store S
ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\${SID}" "ProfileImagePath"
ExpandEnvStrings $R1 $R1
GetFunctionAddress $0 ${CallbackFunc}
!insertmacro _EnumUsersReg_Load "$R1\NTUSER.DAT" $0 "${Subkey}"
System::Store L
!macroend

Затем используйте его следующим образом:

Function MyEnumUsersRegCallback
Pop $0
!insertmacro GetUserShellFolderFromRegistry "Startup" $0 $1
DetailPrint Startup=$1 ;$1 could be "" if there is some sort of error
;Call CreateShortcut here
FunctionEnd

Section
!insertmacro _EnumUsersReg_AdjustTokens
StrCpy $R1 "User1" ;username goes here
System::Call 'ADVAPI32::LookupAccountName(i0,t "$R1",i0,*i0r1,i0,*i0r2,*i)'
System::Call '*(&i$1,&t$2)i.r3'
IntOp $4 $3 + $1
${If} $3 <> 0
    System::Call 'ADVAPI32::LookupAccountName(i0,t "$R1",i $3,*ir1,i $4,*ir2,*i)i.r0'
    ${If} $0 <> 0
        System::Call 'ADVAPI32::ConvertSidToStringSid(ir3,*i.r2)i.r0' ;Win2000+
        ${If} $0 <> 0
            System::Call '*$2(&t${NSIS_MAX_STRLEN}.r1)'
            System::Call 'kernel32::LocalFree(i $2)'
            !insertmacro EnumUsersRegX_LoadRegFromSID "$1" MyEnumUsersRegCallback temp.key
        ${EndIf}
    ${EndIf}
    System::Free $3
${EndIf}
SectionEnd

Если вы знаете SID пользователей, вы можете напрямую вызвать макрос EnumUsersRegX_LoadRegFromSID, не вызывая LookupAccountName.

Примечания: Этот код использует недокументированные вещи и поэтому может сломаться в следующей версии Windows!Вы также должны быть администратором и> = Win2000.

...