You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:47:40