查看csrss.exe的访问控制列表
以csrss.exe进程为例。在Process Explorer中双击该csrss.exe进程,在打开的属性对话框里切换到“Security”标签页。然后单击其右下角的“Permission”按钮,即可查看csrss.exe进程的访问权限设置。可以看到该进程只允许Local System帐户访问。单击打开对话框上的“高级”按钮,还可以查看Local System帐户具有的详细权限,(如图3)所示。
图3
这样就可以解释为什么无法查看csrss.exe进程信息,原来只有Local System帐户才有权限访问csrss.exe进程,而系统进程的访问令牌里并不包含Local System帐户。
查看svchost.exe的访问控制列表
接下来查看三个详细信息不可用的svchost.exe进程的访问控制列表。
在“系统信息”窗口里记下这三个svchost.exe进程的PID,然后在Process Explorer窗口里打开该进程的属性对话框,查看其安全权限,(如图4)所示。
图4
和csrss.exe进程相比,除了Local System帐户外,svchost.exe进程的访问控制列表中还包含了一个未知SID(本例是S-1-5-5-0-35860),实际上这是该svchost进程的Logon SID,也就是该svchost进程所在登录会话的SID。也就是说,只要是在同一个登录会话里运行的进程,就可以访问该svchost.exe进程的信息。
和图2作比较,会发现“系统信息”进程的Logon SID是S-1-5-5-0-40881,和svchost.exe进程的Logon SID不同,所以“系统信息”无法访问这些svchost.exe进程的详细信息。
用同样的方法,可以找到alg和wdfmgr.exe的进程信息不可用的原因。
用subinacl.exe命令行工具查看进程的访问控制列表
我们还可以利用subinacl.exe命令行工具,查看进程的访问控制列表,这里以csrss.exe进程为例。打开命令提示符窗口,运行以下命令:
subinacl /process csrss.exe /display=dacl
命令的部分结果类似如下显示:
=========================
+Process csrss.exe - 940
=========================
/perm. ace count =1
/pace =system ACCESS_ALLOWED_ACE_TYPE-0x0 AccessMask=0x20c79
命令结果表明csrss.exe进程仅允许SYSTEM帐户访问,所以“系统信息”组件无法获得该进程的详细信息。
解决方案
对于system和system idle process这两个进程来说,由于它们并非真正的进程,所以无需解决办法。而对于其他详细信息“不可用”的进程,可以用以下两种方法解决:
方法1:以Local System帐户身份启动“系统信息”组件
由于详细信息“不可用”的进程,都允许Local System帐户访问其进程信息,所以这里我们尝试用Local System帐户的身份启动“系统信息”进程,然后查看是否可以正常显示进程的信息。
要以Local System帐户身份启动进程,可以借助PsExec,可以在CMD窗口运行以下命令,以Local System帐户的身份启动“系统信息”进程:
PsExec -d -i -s "%CommonProgramFiles%\Microsoft Shared\MSInfo\msinfo32.exe"
可以看到,现在可以访问几乎所有进程的信息(除system和system idle process之外),(如图5)所示。
图5
方法2:修改进程的访问控制列表
用Process Explorer修改进程访问权限
这里以csrss.exe进程为例进行介绍。在Process Explorer程序窗口里双击打开csrss.exe进程的属性对话框,并切换到“Security”标签页。然后单击其右下角的“Permission”按钮,打开该进程的安全权限设置对话框,单击其上的“添加”按钮,添加当前的登录帐户(假设是Admin)。回到安全权限设置对话框,单击其上的“高级”按钮,在打开的权限项目对话框里,确保勾选以下三个权限项目,(如图6)所示:Read Memory、Query Information和Read Permission。依次单击确定按钮,保存所作的设置。
图6
现在应该可以在系统信息窗口看到csrss.exe进程的详细信息。然后可以用类似的方法,修改其他进程的访问权限。