为什么 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 的命令行属性.exe WIN32_Process为空

正如您发现的 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