其他用户的启动快捷方式

时间:2011-06-07 08:04:54

标签: nsis

我正在某些客户端计算机上使用PsExecute进行强制远程安装。我遇到的问题是我作为本地管理员执行安装程序,但我想为特定用户添加一个启动程序。在nsis中,我只能在用户(本地管理员)或所有环境之间进行选择。如何向User1的启动文件夹添加快捷方式?

1 个答案:

答案 0 :(得分:0)

如果您知道用户密码,可以调用LogonUser + SHGetFolderPath,但我认为您不知道密码。

如果您不知道密码且用户未登录,则使用某些未记录的注册表位置是唯一的选择:

您需要NSIS wiki和此辅助宏的EnumUsersRegGetUserShellFolderFromRegistry头文件的一部分:

!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!您还需要是管理员和&gt; = Win2000。