PowerShell 7远程执行Get-Service时UserName字段缺失问题求助
问题原因分析
- 权限与属性获取逻辑差异:本地执行
Get-Service时,当前登录用户拥有足够权限,系统会自动调用Windows底层API读取服务的安全配置,从而填充UserName字段。但通过Invoke-Command远程执行时,默认远程会话权限受限,Get-Service返回的ServiceController对象不会主动加载UserName这个扩展属性——该属性实际需要从Win32_ServiceCIM实例中读取,而远程场景下Get-Service未触发这一读取流程。 - PowerShell 6+的架构调整:PowerShell 6.0转向跨平台架构后,移除了
Get-Service原Windows专属的-ComputerName参数,同时精简了Windows特有的服务属性绑定逻辑,导致远程执行时无法自动获取UserName字段。 - 对象序列化限制:远程执行产生的
ServiceController对象会被序列化后传输回本地,而UserName属于动态扩展属性,序列化过程中不会被保留,即便远程会话能获取到该值,也无法正常传递回来。
可行的替代方案
若需获取远程服务的运行账号,可直接在远程脚本块中使用CIM命令,示例如下:
Invoke-Command -ComputerName 'remoteServerName' -ScriptBlock { Get-CimInstance Win32_Service | Select-Object Name, StartName | Format-Table }
上述命令中的StartName字段,与本地Get-Service返回的UserName对应。
内容的提问来源于stack exchange,提问作者tb1
相关产品推荐
相关产品推荐

