进程所有者的C#查询(Windows 7 x64)

时间:2012-01-14 07:02:28

标签: c# winapi wmi process owner

我想知道如何在(或通过)C#中查询进程的所有者。我在http://www.codeproject.com/KB/cs/processownersid.aspx尝试了这个例子。

WMI: 可以查询所有进程及其所有者,但速度太慢。

WIN32: 很快,但在查询任何进程的所有者时我得到了一个权限被拒绝的异常,但是我自己的。

我试图实现模拟来解决WIN32问题,不行。我也试过以管理员身份运行已编译的.exe,不用了。我只用了几个月就进入了这个C#的东西,所以放轻松。

2 个答案:

答案 0 :(得分:0)

好像我先误解了这个问题,对不起。刚刚找到了关于这个主题的interesting topic,可能对您有帮助。

答案 1 :(得分:0)

我将以下内容添加到Win32示例中:http://www.codeproject.com/KB/cs/processownersid.aspx

static void ProcessSID(Process process)
{
    string sid;
    ExGetProcessInfoByPID(process.Id, out sid);
    Console.WriteLine("{0} {1} {2}", process.Id, process.ProcessName, sid);
}

static void Main(string[] args)
{
    foreach (Process process in Process.GetProcesses())
    {
        ProcessSID(process);
    }
}

当我以管理员身份运行它时,它会成功打印所有进程的SID(系统和受保护的进程除外,如audiodg)。它不会产生访问被拒绝的错误。

此代码是否适合您?

我也在使用Windows 7 x64。

<强>更新

这适用于除RunAs进程之外的所有进程。问题是Process.Handle的内部,它要求太多的权限。

如果用

替换对Process.Handle的调用
IntPtr procHandle=OpenProcess(ProcessAccessFlags.QueryInformation, false, PID);

并添加以下定义,然后代码也适用于RunAs进程。

[Flags]
enum ProcessAccessFlags : uint
{
    All = 0x001F0FFF,
    Terminate = 0x00000001,
    CreateThread = 0x00000002,
    VMOperation = 0x00000008,
    VMRead = 0x00000010,
    VMWrite = 0x00000020,
    DupHandle = 0x00000040,
    SetInformation = 0x00000200,
    QueryInformation = 0x00000400,
    Synchronize = 0x00100000,
    ReadControl = 0x00020000
}

[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);