Win32_Process.Getowner()在特定的机器上非常慢

问题描述:

我试图通过运行在PowerShell中的WMI查询来获取一个进程的所有者:Win32_Process.Getowner()在特定的机器上非常慢

$processes = Get-WmiObject Win32_Process |where{$_.name -like "*notepad*"} 
$objcol = @() 
foreach ($process in $processes) 
{ 
    $owner = $process.GetOwner().User 
    #$owner = $process.ProcessId 
    $obj = New-Object System.Object 
    $obj |Add-Member -MemberType NoteProperty -Name Owner -Value ($owner) 
    $obj |Add-Member -MemberType NoteProperty -Name pid -Value $process.ProcessId 
    $owner = "" 
    $objcol += $obj 
} 
$objcol | ft owner, pid -AutoSize |Out-String -Width 300 

但不知何故,在特定的机器(Windows Server 2008上),需要30分钟来完成这个简短的脚本。如果我删除了“$ owner = $ process.GetOwner()。User”行,并将其替换为“$ owner = $ process.ProcessId”,则查询可以在几秒钟内完成。但在其他机器上(Windows Server 2003,2008,2012),没有这样的问题。所以我认为它与这个Win32_Process.Getowner()方法有关,但不知道如何。

任何人都可以帮忙吗?提前致谢!

+0

听起来像它的花费很长的时间来解决的SID帐户名称。我怀疑它已经锁定在遥远的银河系的一个DC上。在任何情况下,您都可以尝试从.GetOwner()切换到Get-OwnerSID(),然后在本地解析SIDS。 – mjolinor

+0

@ mjolinor谢谢你的回答。你是如何找出这台服务器锁定到哪个DC的?在命令行中“echo%logonserver%”?这个有问题的服务器的结果与其他好的服务器相同。 – bookends

+0

@mjolinor,我试图使用getOwnerSID(),但它不会改善性能。我试图使用“Get-WmiObject Win32_Process -filter”name ='notepad.exe'“|选择processid,processname | ft”,性能不同。在有问题的机器上,它总是需要大约40秒。而在其他机器上,需要1秒。你知道为什么吗? – bookends

你可以尝试一种更简单的方式,安装PowerShell v4和使用

获取进程-name 记事本-IncludeUserName