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

Windows 获取当前用户%APPDATA%路径,而不是管理员,windows,installation,nsis,Windows,Installation,Nsis,我正在查找当前用户%APPDATA%文件夹的路径 注意:我知道变量$APPDATA,但是如果您使用RequestExecutionLevel admin运行安装程序,则$APPDATA将指向管理员漫游文件夹,而不是当前用户的应用程序数据文件夹 我需要找出当前用户%APPDATA%的路径,以便将文件写入他们的漫游目录。有人知道我怎样才能找到答案吗 RequestExecutionLevel admin Section "Main" MessageBox MB_OK "AppData i

我正在查找当前用户
%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
术语“当前用户”不明确,您的意思是:

  • 您从
    WTSQueryUserToken()
    获得的用户?(WinLogon)
  • shell的任务栏作为哪个用户运行?(
    GetShellWindow()
  • 启动安装过程的用户(父进程)
如果你对runas感兴趣,那么所有这些都可以是不同的用户

来自的评论是即时的,一旦您开始混合%ProgramFiles%和%AppData%和/或HKLM和HKCU,您的设置将在多用户场景中中断。当不同的用户启动应用程序时会发生什么?他们不会在其%AppData%中包含您的文件

如果加载项是在全局位置安装/注册的,则可以在%ProgramFiles%、%CommonProgramFiles%或%ALLUSERSPROFILE%中安装AppData“模板”文件,并且当您的加载项第一次以特定用户身份运行时,可以将文件复制到%AppData%

可以用作替代方案,但可能需要注销/登录周期


如果您由于某种原因无法执行延迟的复制/安装,您将面临类似的黑客攻击,这将使您能够访问启动安装程序的用户…

好的,谢谢您的建议,但我发现了一个通知,它告诉我所有用户目录的位置。我仍然无法确定哪个用户当前登录,但我可以确定所有非管理员用户,这非常有用

!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."

嗯,不,通过UAC提示符获得管理员权限的安装程序仍然使用非提升用户的appdata文件夹运行。对于需要管理员访问权限才能写入当前用户的应用程序数据文件夹的安装程序来说,这是没有意义的。有两种情况:第一种是为所有用户安装,在这种情况下,安装程序不应负责写入应用程序数据文件夹,因为这样应用程序对其他用户的行为就不会相同。而是在第一次运行时从应用程序本身写入数据。第二种情况是,您只为当前用户安装,在这种情况下,您不需要管理员权限。@HansPassant是否运行了我的示例代码?对我来说,它显示了管理员%APPDATA%的路径。如果没有,你能解释一下你是怎么做到的吗?您的用户是管理员还是普通用户user@HarryJohnston虽然没有意义,但Autodesk Revit会同时安装到ProgramData、程序文件、%APPDATA%和%LOCALAPPDATA%。我正在安装Revit加载项,因此我需要安装到ProgramData,程序文件,%APPDATA%。这很公平。我相当肯定Hans说的是正确的,Windows Installer通常会向您提供非提升用户的文件夹,但NSIS的实现方式可能有所不同。一个想法是:许多MSI安装程序包装在一个EXE文件中,在这种情况下,除非EXE有一个明确要求在没有提升的情况下运行的清单,否则它将无法工作。也许这就是你的设想?