2011-06-07 53 views
0

我在某些客戶端計算機上使用PsExecute進行強制遠程安裝。我遇到的問題是我作爲本地管理員執行安裝程序,但我想爲特定用戶添加啓動shoortcut。在nsis中,我只能選擇用戶(本地管理員)或所有環境。我如何添加一個快捷方式到User1的啓動文件夾?其他用戶的啓動快捷方式

回答

0

如果您知道用戶密碼,則可以調用LogonUser + SHGetFolderPath,但我認爲您不知道密碼。

使用一些無證註冊表位置是唯一的選擇,如果你不知道密碼和用戶沒有登錄:

您需要EnumUsersRegGetUserShellFolderFromRegistry頭文件的部分從NSIS wiki和這個輔助宏:

!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。

+0

好吧,它似乎是一個不是很穩定的解決方案。我會看看我能否以其他方式做到這一點 – Johan 2011-06-08 12:54:50

相關問題