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

本文关键字:Windows x64 查询 所有者 进程 | 更新日期: 2023-09-27 18:20:28

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

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

WIN32:速度很快,但在查询除我自己的进程之外的任何进程的所有者时,我都会遇到拒绝权限的异常。

我已经尝试过实现模拟来解决WIN32问题,没有成功。我也试过以管理员身份运行编译后的.exe,不可以。我对C#的研究才几个月,所以要放松。

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

我在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。

更新

这适用于除运行方式进程之外的所有进程。问题出在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);

对不起,我似乎首先误解了这个问题。刚刚发现了一个有趣的话题,可能对你有所帮助。