为什么svchost.exe WIN32_Process的CommandLine属性为null?

时间:2014-12-07 09:55:47

标签: c# nullreferenceexception

我尝试沉默系统进程,有时我的程序开启时似乎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( );

此代码似乎引发了null异常。

当我在if条件中添加retObject[ "CommandLine" ] != null &&并对其进行调试时,表达式retObject[ "CommandLine" ]生成的所有值都只是null

当我将scvhost.exe更改为notepad.exe时,会产生非null值。

为什么这样以及如何修复它以获取系统进程的命令行?

2 个答案:

答案 0 :(得分:1)

当您发现svchost的Win32_Process类上的CommandLine属性为null时。这是因为svchost.exe没有从命令行启动(这解释了为什么搜索notepad.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的info from this Technet blog来提出这个答案。

理论上你可以在一个wmi查询中执行此操作,但WIN32_Service的响应速度很慢,因此首先获取您感兴趣的进程然后查询WIN32_Service会更好的性能。

答案 1 :(得分:0)

我认为你获得null的原因是因为你没有必要的权限。以管理员身份运行该程序,您将获得svchost.exe的CommandLine。这是我系统中的列表:

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