Obtain Current Users %APPDATA% Path and not Admins

谁说我不能喝 提交于 2020-01-23 03:40:27

问题


I am looking to get the path to the current users %APPDATA% folder.

Note: I am aware of the variable $APPDATA BUT if you run your installer with RequestExecutionLevel admin then $APPDATA will point to the admins roaming folder and NOT the current user's app data folder.

I need to find out the current users %APPDATA% path so I can write files to their roaming directory. Does anyone know how I can find this out?

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

回答1:


The term "Current User" is ambiguous, do you mean:

  • The user you get from WTSQueryUserToken()? (WinLogon)
  • The user that the shell's taskbar is running as? (GetShellWindow())
  • The user (parent process) that started your setup process?

All of those can be different users if you are having fun with runas!

The comment from Harry Johnston is spot on and once you start mixing %ProgramFiles% and %AppData% and/or HKLM and HKCU your setup is broken in multi-user scenarios. What happens when a different user starts the application? They are not going to have your files in their %AppData%.

If the addin is installed/registered in a global location you can install the AppData "template" files in %ProgramFiles%, %CommonProgramFiles% or %ALLUSERSPROFILE% and when your addin runs as a specific user for the first time you copy the files to %AppData%.

Active Setup could be used as a alternative but it will probably require a log-off/log-on cycle.

If you cannot implement the delayed copy/install for some reason you are left with hacks like the UAC plugin which gives you some access to the user that started your installer...




回答2:


Ok, thanks for the advice but I found a nice plugin that tells me the location of all User directories. I still cant figure out which user is currently logged in but I can figure out all non-admin users which is very useful.

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


来源:https://stackoverflow.com/questions/22467566/obtain-current-users-appdata-path-and-not-admins

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!