目前,我正在pipe理基于Windows Server 2008 R2的Citrix服务器场系统。 过去,我使用Powershell脚本检查正在运行的用户进程,并在必要时重新启动它们。
我使用了带有附加参数的工具“tasklist.exe”来检查定义的进程是否在login用户下运行。 不幸的是,tasklist.exe已经停止工作了几天了。 重新启动会导致错误信息:
“错误:未find”或“错误:无效的类”。
由于服务器在德国,我已经把信息从德文翻译成英文。 在德国服务器上,它被称为
“Fehler:Nicht gefunden”和“Fehler:Ungultige Klasse”。
所以,我不确定翻译成英文是否正确。 事件日志中没有错误日志。
由于这是一个生产系统,没有更新,如更新和没有互联网连接。
有没有可能是一个DLL注册丢失? 我已经检查与“depends.exe”的任何可能是错误的,但我无法识别工作服务器和非工作服务器之间的任何区别。
我也检查了启动“dcomcnfg”时是否有错误,但一切正常。
来自工作服务器的tasklist.exe的全新副本不起作用。 问题与可执行的本身无关。
这个链接提供的提示是用非正式结果检查的。
regsvr32%Windir%\ system32 \ wbem \ fastprox.dll
regsvr32%Windir%\ system32 \ wbem \ wbemprox.dll
regsvr32%Windir%\ system32 \ wbem \ wbemsvc.dll
病毒码是最新的(McAfee VDS 8.8 + ASE 8.8)。
有没有人有任何build议,我怎样才能让“tasklist.exe”再次运行? 或者,我想用一个Powershell命令的解决scheme来帮助重build“tasklist.exe”的function – 这不是一件容易的事情,因为我不是最好的scripter。
在此先感谢您的帮助,提示或build议!
编辑:
事实上,这个问题与WMI有关。 Ryan Ries的提示来检查WMI
“WBEMTEST”
导致尝试连接时出现类似的错误。
在这种情况下,我收到了一个错误代码,我可以在Microsoft TechNet上find解决scheme。
该页面中列出的脚本对我而言并不适用于我,而是命令
“Winmgmt / salvagerepository”
没有。
所以,感谢Ryan提供的WMI提示,并感谢r.tanner.f提供的解决方法,以防其他情况无法正常工作。
尽pipe可能使用除tasklist.exe之外的其他内容来获取系统上正在运行的进程的列表,但是令我担心tasklist.exe突然停止工作。 这是系统的一个基本的,基本的过程,它停止工作的事实可能是数据损坏或其他问题的迹象,只会变得更糟。
不要试图找出造成这种情况的原因,即使您能够使用Powershell或WMIC或其他可执行文件解决此问题,就像用电子胶带覆盖汽车仪表板上的“Check Oil”指示灯一样。 这并不意味着底层的问题不存在。
此外,tasklist.exe似乎利用WMI来获取信息,因此如果tasklist.exe不工作,这可能表示您的计算机上存在WMI的系统问题,因此使用依赖于WMI的其他工具可能不会工作要么…
这是你如何解决这个问题。 从Sysinternals获取进程监视器。 捕获工作机器上的事件,并捕获非工作机器上的事件。 运行时,在tasklist.exe上筛选。 现在把这两个跟踪文件并排放在一起,看看它们有什么不同。 工作机器上的哪些事件正在返回SUCCESS,其中非工作机器上的相同事件正在返回NAME NOT FOUND或其他一些不成功的代码?
由于您提到的错误消息提到了一个无效的类,我敢打赌,在registry项HKCR\CLSID\{GUID}\ , \HKLM\Software\Classes等中发生的事件将显示两条迹线之间的一些确定的差异文件。
编辑:另外,如果你想testingWMI本身,你可以使用的一种方法是运行wbemtest 。 单击Connect... ,并使用root\cimv2作为命名空间。 您应该能够保留一切空白或默认。 然后,单击表示Query的button,然后在select * from win32_process键入select * from win32_process作为查询,然后单击Apply 。 你应该得到一堆有效的进程句柄,没有错误信息。
祝你好运…
用一个小小的PowerShellreplace你的tasklist.exe的使用可能会比较容易,而不是跟踪tasklist.exe出了什么问题。 尽pipe如此,请看Ryan Ries的回答。 他提出了一些关于为什么跟踪这个问题非常重要的一些要点,而且WMI可能会被破坏,并且无法正常工作(在这种情况下,您会遇到更大的问题)。 为了什么是值得的,我更喜欢他的答案。
在PowerShell中检查当前用户运行的进程是否足够简单:
Get-WMIObject win32_process | Where {$_.ProcessName -eq "foo.exe"} | ForEach-Object {$_.GetOwner()} | Where {$_.User -eq [Environment]::Username}
Get-WMIObject显然获得一个WMI对象,在这种情况下是win32_process。 将其传入Where-Object并过滤与foo.exe不等的内容。 然后遍历每个对象并运行GetOwner()方法。 最后,过滤不等于当前用户的任何用户名。
为了可读性,我在pipe道之后添加了一个返回值(在脚本中也是有效的),但是也可以用一些别名来减less它们,并坚持一行:
gwmi win32_process | ?{$_.ProcessName -eq "smartclient.exe"} | %{$_.GetOwner()} | ?{$_.User -eq [Environment]::UserName}
PowerShell是友好的,不咬人。 你不需要做一个好的脚本来获得你所需要的东西,所以不要害怕尝试使用它。