使用相同的ProcessName区分Windows服务

时间:2015-06-08 12:08:14

标签: powershell memory windows-services monitoring powershell-v3.0

我正在调整监控系统,该系统检查服务是否正在运行。它通过检查进程名称及其内存消耗来实现。一旦低于1 MB,就会触发警报。我还使用内存使用值将其显示在图表中。所以检查和通知不是唯一的目的。

目前我有5个使用相同ProcessName的Windows服务,我不知道如何让我的脚本区分它们。每个服务的ServiceName当然是不同的,也是可执行文件的路径。 当我运行get-process时,我看到了所有这些,但我没有看到一个选项来区分它们。使用get-service也没有多大帮助,因为它返回名称,显示的名称和状态。不知何故,我想结合条目来查看服务名称的内存使用情况,而不是进程名称。

1 个答案:

答案 0 :(得分:3)

你说可执行文件的路径是不同的 - 这样你就可以通过查询path属性来区分进程。如果它们相等,您还可以查询进程的StartInfo对象以获取Arguments属性以便彼此辨别。但是获取正确流程实例的最佳方法是查询类型为Win32_Service的WMI对象以过滤您的服务,这样您就可以找到其中一个也被停止,然后通过传递WMI服务对象的ProcessId属性。对于运行服务,PID将有效。一个示例(仅按服务名称过滤):

gwmi win32_service | ? {$_.name -eq "wsearch"} | % {get-process -id $_.processid}

请注意,一个进程可能会处理多个服务,这称为"共享服务进程"并且在Get-Service输出中显示为返回服务的ServiceType属性,值Win32SharedProcess(0x20)表示可以共享基础PID,尽管情况并非总是如此。最着名的共享服务进程是svchost.exe,它还有一种命名空间,用于确定哪个进程应该托管某个服务,并作为命令行参数传递给它。