我的代码需要查询多个进程的进程令牌(特别是SID),其中至少有一个进程作为内置的NETWORK SERVICE帐户运行。我使用.NET获取进程ID,然后p / invoke to advapi32方法来打开进程和令牌。所有这些代码都以机器管理员身份运行。
问题是我每次都从OpenProcessToken获得ERROR_ACCESS_DENIED(返回代码5)。
我做错了什么?这必须是可能的(例如,Process Explorer显示目标进程的SID和其他令牌信息),所以我想我错过了什么。一个想法是,也许我需要SeDebugPrivilege。 (编辑:没有用 - 做Process.EnterDebugMode在当前线程上设置SeDebugPrivilege不会改变行为)。
我的代码如下所示:
Process[] procs = Process.GetProcessesByName("processname");
Process process = procs[0];
IntPtr processHandle = NativeMethods.OpenProcess(
ProcessAccessFlags.QueryInformation,
false,
process.Id);
if (
!NativeMethods.OpenProcessToken(
processHandle,
(uint)(TokenAccessLevels.Read),
out tokenHandle))
{
int err = Marshal.GetLastWin32Error();
// fails with err = 5
throw new Win32Exception(err, "Failed to get process token. Error: " + err);
}
注意:我在本机调用上尝试了一些其他访问标志组合,包括使用PROCESS_ALL_ACCESS。
编辑:另外一点,查询与本地有限访问用户一样运行的进程正常工作。