升级PowerShell 7后Win32_Process方法失效,如何恢复PS5使用方式?
解决PowerShell 7中Win32_Process丢失GetOwner方法的问题
问题根源
PowerShell 7里Get-WmiObject返回的是Deserialized.System.Management.ManagementObject类型对象,这类对象是序列化后的副本,丢失了原生WMI对象的方法(包括GetOwner和GetOwnerSID)。而PowerShell 5返回的是原生System.Management.ManagementObject,保留了所有WMI方法。由于你的环境未开启WinRM,无法切换到Get-CimInstance,只能通过原生.NET WMI API绕过这个问题。
解决方案:直接使用System.Management原生API
通过直接实例化System.Management命名空间下的类来连接远程WMI,获取原生的Win32_Process对象,这样就能正常调用GetOwner方法。示例代码如下:
# 目标远程计算机名 $targetComputer = "RemotePC01" # 构建WMI连接配置(如需身份验证可添加凭据) $connOptions = [System.Management.ConnectionOptions]@{ # Username = "DOMAIN\AdminUser" # Password = "YourPassword" } # 建立WMI连接范围 $wmiScope = [System.Management.ManagementScope]::new("\\$targetComputer\root\cimv2", $connOptions) $wmiScope.Connect() # 构造Win32_Process查询 $processQuery = [System.Management.ObjectQuery]::new("SELECT * FROM Win32_Process") $searcher = [System.Management.ManagementObjectSearcher]::new($wmiScope, $processQuery) $processes = $searcher.Get() # 遍历进程并获取所有者信息 foreach ($proc in $processes) { $ownerResult = $proc.GetOwner() if ($ownerResult.ReturnValue -eq 0) { # ReturnValue=0表示获取成功 [PSCustomObject]@{ ProcessID = $proc.ProcessId ProcessName = $proc.Name OwnerDomain = $ownerResult.Domain OwnerUser = $ownerResult.User } } }
原理说明
这种方式直接调用.NET框架的WMI原生接口,绕过了PowerShell 7中Get-WmiObject的序列化逻辑,获取到的是完整的System.Management.ManagementObject实例,因此GetOwner、GetOwnerSID等方法都能正常使用,和PowerShell 5中的行为一致。
内容的提问来源于stack exchange,提问作者tdubs86
相关产品推荐
相关产品推荐

