Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查询作为网络服务运行的进程时,OpenProcessToken失败_C#_Winapi_Pinvoke - Fatal编程技术网

C# 查询作为网络服务运行的进程时,OpenProcessToken失败

C# 查询作为网络服务运行的进程时,OpenProcessToken失败,c#,winapi,pinvoke,C#,Winapi,Pinvoke,我有一些代码需要查询几个进程的进程令牌(特别是SID),其中至少有一个进程作为内置网络服务帐户运行。我使用.NET获取进程ID,然后p/invoke到advapi32方法打开进程和令牌。所有这些代码都以管理员身份在计算机上运行 问题是每次我都从OpenProcessToken获得错误\u访问\u拒绝(返回代码5) 我做错了什么?这必须是可能的(例如,Process Explorer显示目标进程的SID和其他令牌信息),所以我想我遗漏了一些东西。一个想法是,也许我需要塞德布格特权。(编辑:不起作用

我有一些代码需要查询几个进程的进程令牌(特别是SID),其中至少有一个进程作为内置网络服务帐户运行。我使用.NET获取进程ID,然后p/invoke到advapi32方法打开进程和令牌。所有这些代码都以管理员身份在计算机上运行

问题是每次我都从OpenProcessToken获得错误\u访问\u拒绝(返回代码5)

我做错了什么?这必须是可能的(例如,Process Explorer显示目标进程的SID和其他令牌信息),所以我想我遗漏了一些东西。一个想法是,也许我需要塞德布格特权。(编辑:不起作用--在当前线程上设置SeDebugPrivilege的doing Process.EnterDebugMode不会更改行为)

我的代码如下所示:

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\u ALL\u访问


编辑:还有一点,查询与本地受限访问用户运行的相同进程可以很好地工作。

您有没有弄明白这一点?我正试图解决一个类似的问题,其中对OpenProcessToken()的调用总是返回0;