我希望获取当前用户%APPDATA%
文件夹的路径。
注意:我知道变量$APPDATA
但是如果您使用RequestExecutionLevel admin
运行安装程序,那么$APPDATA
将指向管理员漫游文件夹而不是当前用户的应用数据文件夹。
我需要查找当前用户%APPDATA%路径,以便将文件写入其漫游目录。有谁知道我怎么能找到这个?
RequestExecutionLevel admin
Section "Main"
MessageBox MB_OK "AppData is: $APPDATA" # knowtice that its the path to the admins folder not the current user's
SectionEnd
答案 0 :(得分:2)
术语"当前用户"是不明确的,你的意思是:
WTSQueryUserToken()
获得的用户? (WinLogon的)GetShellWindow()
)如果您正在玩runas,那么所有这些用户都可以是不同的用户!
来自Harry Johnston的评论现场点亮,一旦您开始混合%ProgramFiles%和%AppData%和/或HKLM和HKCU,您的设置就会在多用户场景中被破坏。当其他用户启动应用程序时会发生什么?他们不会在%AppData%中包含您的文件。
如果在全球位置安装/注册插件,您可以安装AppData"模板" %ProgramFiles%,%CommonProgramFiles%或%ALLUSERSPROFILE%中的文件,当你的addin作为特定用户运行时,你第一次将文件复制到%AppData%。
Active Setup可以用作替代方案,但可能需要注销/登录周期。
如果由于某种原因无法实施延迟复制/安装,则会留下像UAC plugin这样的黑客,这样可以让您对启动安装程序的用户有一些访问权限...
答案 1 :(得分:0)
好的,感谢您的建议,但我找到了nice plugin告诉我所有用户目录的位置。我仍然无法确定哪个用户当前登录但我可以找出所有非管理用户非常有用。
!include "NTProfiles.nsi"
!macro HandleUserProfiles
!define NTProfilePaths::IgnoreLocal
!ifndef __UNINSTALL__
${EnumProfilePaths} HandleUserProfile
!else
${EnumProfilePaths} un.HandleUserProfile
!endif
!macroend
!macro HandleUserProfile prefix
Function ${prefix}HandleUserProfile
Pop $R9
!ifndef __UNINSTALL__
# Copy files to user dir
SetOutPath "$R9\AppData\Roaming\Autodesk\Revit\Addins\2013" # $APPDATA = C:\ProgramData
FILE /r "${INSTALLFILEDIR}\Addins\Revit_2013\myAddin.addin"
!else
Delete "$R9\AppData\Roaming\Autodesk\Revit\Addins\2013\myAddin.addin"
!endif
# Continue Enumeration
Continue:
Push ""
Return
# Stop Enumeration
Stop:
Push "~" # Any value other than an empty string will abort the enumeration
FunctionEnd
!macroend
!insertmacro HandleUserProfile ""
!insertmacro HandleUserProfile "un."