【问题标题】:Access a specific user environment variable on windows server访问 Windows 服务器上的特定用户环境变量
【发布时间】:2026-02-13 08:25:03
【问题描述】:

有没有办法使用 Powershell 访问特定的用户环境变量?

在服务器机器上,我们有 50 个用户。 我想知道特定用户(例如 user1)是否对环境变量 PYTH_HOME_LOG 使用不同的值。

这个系统变量指向C:\PYTHON\LOG,我想通过配置一个用户环境变量PYTH_HOME_LOG来查看是哪个用户改变了这个位置。

【问题讨论】:

  • 我认为这里的答案会为您指明正确的方向:*.com/questions/10737401/…
  • @gvee :这允许您将环境设置为系统或用户,但不能访问其他用户环境变量。
  • 您发布了一个答案(已删除),说 Mathias 的 this answer 解决了您的问题。如果是这样,请更新您的问题以表明您只想检查已加载配置文件 (ntuser.dat) 的用户,无论是来自活动登录还是(暂时)来自先前登录的延迟。

标签: windows powershell environment-variables window-server


【解决方案1】:

如果您是本地管理员组的成员,您可以简单地浏览所有用户注册表配置单元并在那里搜索 Environment 变量:

$AllUserHives = Get-ChildItem Registry::HKEY_USERS\ |Where Name -like "HKEY_USERS\S-1-5-21*[0-9]"
foreach($UserHive in $AllUserHives){
  if(Get-ItemProperty -Path "$UserHive\Environment" -Name PYTH_HOME_LOG -EA SilentlyContinue){
    # User is overriding %PYTH_HOME_LOG%
  }
}

您可以通过搜索USERNAME env 变量从Volatile Environment 注册表子树中获取相应的用户名,也可以使用IdentityReference.Translate()

$SID = [System.Security.Principal.SecurityIdentifier]"S-1-5-21-436246-18267386-368368356-356777"
$Username = $SID.Translate([System.Security.Principal.NTAccount]).Value

或者,在这种情况下:

$SID = ($UserHive -split '\\')[-1] -as [System.Security.Principal.SecurityIdentifier]
$Username = $SID.Translate([System.Security.Principal.NTAccount]).Value

【讨论】:

  • 您没有加载用户配置文件,因此这只检查在加载配置文件的情况下登录的帐户。
  • "\Registry\User"(预定义句柄 HKEY_USERS)是加载用户配置文件配置单元的动态键(例如 "%USERPROFILE%\NTUSER.DAT" 和 "%LOCALAPPDATA%\Microsoft\ Windows\UsrClass.dat")。配置文件通过LoadUserProfile 加载,这对用户配置文件服务进行 RPC。调用者必须具有备份和恢复管理员权限。该服务获取帐户的 SID 字符串并在“Software\Microsoft\Windows NT\CurrentVersion\ProfileList”中相对于“\Registry\Machine”(预定义句柄HKEY_LOCAL_MACHINE)查找“ProfileImagePath”,并通过@987654332 加载密钥@.