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()方法有关,但不知道如何。
任何人都可以帮忙吗?提前致谢!
答
你可以尝试一种更简单的方式,安装PowerShell v4和使用
获取进程-name 记事本-IncludeUserName
听起来像它的花费很长的时间来解决的SID帐户名称。我怀疑它已经锁定在遥远的银河系的一个DC上。在任何情况下,您都可以尝试从.GetOwner()切换到Get-OwnerSID(),然后在本地解析SIDS。 – mjolinor
@ mjolinor谢谢你的回答。你是如何找出这台服务器锁定到哪个DC的?在命令行中“echo%logonserver%”?这个有问题的服务器的结果与其他好的服务器相同。 – bookends
@mjolinor,我试图使用getOwnerSID(),但它不会改善性能。我试图使用“Get-WmiObject Win32_Process -filter”name ='notepad.exe'“|选择processid,processname | ft”,性能不同。在有问题的机器上,它总是需要大约40秒。而在其他机器上,需要1秒。你知道为什么吗? – bookends