为什么 svchost 的命令行属性.exe WIN32_Process为空
本文关键字:WIN32 Process 为空 exe 属性 svchost 命令行 为什么 | 更新日期: 2023-09-27 18:33:20
我尝试使有时打开程序时似乎 100% 运行的系统进程静音;我并不是要修复该系统进程,而只是要使其静音。我尝试的是:
ManagementObjectSearcher searcher = new ManagementObjectSearcher
( "select CommandLine,ProcessId from Win32_Process where Name='svchost.exe'" );
ManagementObjectCollection retObjectCollection = searcher.Get( );
foreach( ManagementObject retObject in retObjectCollection )
if( ( ( string )retObject[ "CommandLine" ] ).Contains( "-k NetworkService" ) ) { // <-- exception
var process = Process.GetProcessById( int.Parse( retObject[ "ProcessId" ].ToString( ) ) );
process.PriorityClass = ProcessPriorityClass.Idle;
process.ProcessorAffinity = new IntPtr( 1 );
}
retObjectCollection.Dispose( );
此代码似乎引发空异常。
当我在 if 的条件中添加retObject[ "CommandLine" ] != null &&
并调试它时,从表达式 retObject[ "CommandLine" ]
生成的所有值都只是null
.
当我将scvhost.exe
更改为notepad.exe
时,它们会产生非null
值。
为什么会这样以及如何修复它以获取系统进程的命令行?
正如您发现的 svchost 的 Win32_Process 类上的命令行属性为空。这是因为 svchost.exe 不是从命令行启动的(这就解释了为什么搜索记事本.exe确实有效)
要获取要执行危险操作的信息,还需要查询Win32_Service。
using(var searcher = new ManagementObjectSearcher(
"select CommandLine,ProcessId from Win32_Process where Name='svchost.exe'" ))
{
using(var retObjectCollection = searcher.Get( ))
{
foreach(var proc in retObjectCollection)
{
using(var procSearch = new ManagementObjectSearcher(
String.Format(
"select * from Win32_Service where ProcessId='{0}'",
proc["ProcessId"])))
{
using(var procResult = procSearch.Get( ))
{
foreach(var svc in procResult)
{
if( ((string)svc["PathName"]).Contains( "-k NetworkService" ))
{
// do nasty things with the info
svc.Dump();
}
}
}
}
}
}
}
我使用了Chris O'Prey的Technet博客中的信息来得出这个答案。
理论上,您可以在一个 wmi-query 中执行此操作,但WIN32_Service响应速度很慢,因此首先获取您感兴趣的进程,然后查询WIN32_Service,性能更好。
我认为你得到空的原因是因为你没有必要的权限。以管理员身份运行该程序,您将获得 svchost.exe 的命令行。这是我系统的列表:
C:'Windows'system32'svchost.exe -k DcomLaunch
C:'Windows'system32'svchost.exe -k RPCSS
C:'Windows'System32'svchost.exe -k NetworkService
C:'Windows'system32'svchost.exe -k LocalSystemNetworkRestricted
C:'Windows'System32'svchost.exe -k LocalServiceNetworkRestricted
C:'Windows'system32'svchost.exe -k netsvcs
C:'Windows'system32'svchost.exe -k LocalServiceAndNoImpersonation
C:'Windows'system32'svchost.exe -k LocalService
C:'Windows'system32'svchost.exe -k LocalServiceNoNetwork
C:'Windows'system32'svchost.exe -k apphost
C:'Windows'System32'svchost.exe -k utcsvc
C:'Windows'system32'svchost.exe -k imgsvc
C:'Windows'system32'svchost.exe -k iissvcs
C:'Windows'system32'svchost.exe -k appmodel
C:'Windows'system32'svchost.exe -k NetworkServiceNetworkRestricted
C:'Windows'system32'svchost.exe -k UnistackSvcGroup
如果不以管理员身份运行,我也null
。