我尝试沉默系统进程,有时我的程序开启时似乎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
值。
为什么这样以及如何修复它以获取系统进程的命令行?
答案 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
。