0
我在某些客戶端計算機上使用PsExecute進行強制遠程安裝。我遇到的問題是我作爲本地管理員執行安裝程序,但我想爲特定用戶添加啓動shoortcut。在nsis中,我只能選擇用戶(本地管理員)或所有環境。我如何添加一個快捷方式到User1的啓動文件夾?其他用戶的啓動快捷方式
我在某些客戶端計算機上使用PsExecute進行強制遠程安裝。我遇到的問題是我作爲本地管理員執行安裝程序,但我想爲特定用戶添加啓動shoortcut。在nsis中,我只能選擇用戶(本地管理員)或所有環境。我如何添加一個快捷方式到User1的啓動文件夾?其他用戶的啓動快捷方式
如果您知道用戶密碼,則可以調用LogonUser + SHGetFolderPath,但我認爲您不知道密碼。
使用一些無證註冊表位置是唯一的選擇,如果你不知道密碼和用戶沒有登錄:
您需要EnumUsersReg和GetUserShellFolderFromRegistry頭文件的部分從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。
好吧,它似乎是一個不是很穩定的解決方案。我會看看我能否以其他方式做到這一點 – Johan 2011-06-08 12:54:50