查询作为NETWORK SERVICE运行的进程时,OpenProcessToken失败

时间:2014-04-21 13:36:07

标签: c# winapi pinvoke

我的代码需要查询多个进程的进程令牌(特别是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。

编辑:另外一点,查询与本地有限访问用户一样运行的进程正常工作。

0 个答案:

没有答案