在以SYSTEM身份运行的RMM软件PowerShell中获取实际登录用户
获取Windows实际交互式登录用户名(解决RMM脚本SYSTEM权限问题)
你的问题核心是RMM脚本以SYSTEM权限运行,导致[Environment]::UserName和$env:USERNAME都返回SYSTEM,而非实际登录的交互式用户。以下是两种可靠的解决方案:
方法1:通过Win32_ComputerSystem直接获取(简单高效)
Win32_ComputerSystem的UserName属性会直接返回当前活跃的交互式登录用户(即使脚本以SYSTEM身份执行),格式通常为域\用户名,我们可以拆分提取纯用户名:
# 获取当前交互式登录用户 $loggedOnUser = Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -ExpandProperty UserName # 提取用户名部分(处理域\用户格式) $benutzer = if ($loggedOnUser) { $loggedOnUser.Split('\')[-1] } else { [Environment]::UserName } # 执行代理重命名操作 Set-ItemProperty -Path "HKLM:\Software\MMSOFT Design\PC Monitor" -Name ComputerName -Value "$env:USERDOMAIN - $env:Computername - $benutzer"
方法2:筛选交互式登录会话(更精准)
如果机器存在多个登录会话(比如远程桌面+本地登录),可以通过Win32_LoggedOnUser筛选出交互式会话(LogonType为2=本地交互式,10=远程交互式):
# 筛选活跃的交互式登录用户 $loggedOnUser = Get-CimInstance Win32_LoggedOnUser | Where-Object { $_.Antecedent -match 'Name="(.*?)"' -and $_.Dependent.LogonType -in 2, 10 } | ForEach-Object { $matches[1] } | Select-Object -First 1 # 兜底逻辑:无活跃用户时用SYSTEM $benutzer = $loggedOnUser ?? [Environment]::UserName # 执行代理重命名操作 Set-ItemProperty -Path "HKLM:\Software\MMSOFT Design\PC Monitor" -Name ComputerName -Value "$env:USERDOMAIN - $env:Computername - $benutzer"
注意事项
- 如果机器处于无人登录状态(比如服务器),两种方法都会返回null,这时候脚本会自动用SYSTEM作为兜底值,避免报错。
Get-CimInstance是PowerShell 3.0及以上版本的推荐命令,比旧的Get-WmiObject性能更好且更稳定。
内容的提问来源于stack exchange,提问作者Sascha Hofmann
相关产品推荐
相关产品推荐

