从提升的脚本访问用户环境变量?
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
或加载它,就像我要向您展示的那样):
首先要做两件事:
您需要知道他们的用户个人资料的位置才能执行此操作
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"
}
我有一个使用 $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
或加载它,就像我要向您展示的那样):
首先要做两件事:
您需要知道他们的用户个人资料的位置才能执行此操作
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" }