从提升的脚本访问用户环境变量?

Access user environment variables from elevated script?

我有一个使用 $env:appdata 的脚本,结果是 C:\Users\username\AppData\Roaming。如果我手动 运行 脚本,即使在“管理”提示符下,这也很有效。但是,当它 运行 作为“SYSTEM”下具有“最高权限”的计划任务的一部分时,它会输出 c:\windows\system32\config\system.

我可以使用 (Get-CimInstance CIM_ComputerSystem).Username 获取登录用户名。如何获取其他环境变量,尤其是 AppData 路径?

这里的问题是,SYSTEM下的运行ning是,SYSTEM其实是你能达到的最高权限的内置机器账号。这是一个甚至可以取代内置本地管理员的帐户。如果您 运行 正在使用 SYSTEM,它的用户配置文件是 C:\Windows\System32\config\system。这一切都运行符合预期和设计。

如果您需要 运行 在另一个用户的上下文中,最好的解决方案是创建以该用户身份执行的任务,并将权限适当地委派给委托人。事实上,运行 将某些东西设置为 SYSTEM 几乎从来都不是正确的解决方案,除非你需要执行它在默认情况下可以单独执行的特定功能之一(对于这些功能,通常不建议委托那些权限)。

如果它需要 运行 在 SYSTEM 下,好吧,你知道 SYSTEM 配置文件在哪里,所以适当地播种它的 AppData 或在任务后检索工件从那里完成。但听起来您真的想 运行 作为另一个用户,这就是您应该将任务配置为 运行 的原因。


我不建议从 SYSTEM 用户执行此操作,但如果您出于某些其他原因需要查看其他用户的环境变量,只要另一个进程不这样做,您就可以加载他们的注册表配置单元打开配置单元(如果该用户正在使用 regedit.exe 或加载它,就像我要向您展示的那样):

首先要做两件事:

  1. 您需要知道他们的用户个人资料的位置才能执行此操作

  2. PowerShell 无法自行加载其他用户的配置单元,因此我们必须使用 reg.exe 命令来执行此操作

    • 注册表提供程序仍然可以访问数据,只是无法加载它。
    reg load HKEY_Users\username "C:\Users\username\NTUSER.DAT"
    
    # If we can't load it then no point continuing
    if( $? ) {
      try {
        # Read envvars into variable
        $uservars = Get-ItemProperty HKEY_Users:\Environment
      } finally {
        reg unload HKEY_Users\username
    
        if ( !$? ) {
          Write-Warning "Unable to unload userhive, see previous error message for details"
        }
      }
    
      # Do what you need here
      # $uservars is a `PSCustomObject` containing the other user's
      # environment variables.
    } else {
      throw "Unable to load userhive, logon script could not complete"
    }