获取当前用户%APPDATA%路径而不是管理员

时间:2014-03-17 23:33:52

标签: windows installer nsis

我希望获取当前用户%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

2 个答案:

答案 0 :(得分:2)

术语"当前用户"是不明确的,你的意思是:

  • 您从WTSQueryUserToken()获得的用户? (WinLogon的)
  • shell的任务栏运行的用户是? (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."