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

标签 c# winapi wmi process owner

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

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

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

我已经尝试实现模拟来解决 WIN32 问题,但不行。我也试过以管理员身份运行编译后的 .exe,不行。我才接触 C# 几个月,所以放轻松。

最佳答案

我将以下内容添加到 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(除了系统和 protected 进程,如 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);

关于C# 查询进程所有者 (Windows 7 x64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8860723/

相关文章:

winapi - 如何(以编程方式)获取 Windows UAC 虚拟化文件的位置?

java - 如何在java中使用SetWindowsHookEx函数?

winapi - MFCreateAudioRenderer所需的带有Guid 1082E6C2-7660-4945-8E78-228A3B3329F6的怪异属性

windows - WQL 中的 IN 运算符

C# system.management 未加载

c# - Scintilla 编辑器多语法高亮显示

c# - 在 ASP.Net 问题的 UpdatePanel 内显示 JavaScript 警报消息

c# - 如何从 C# 后面的代码提供 'data-toggle="模态"'

c# - 清除没有子元素的 xdt 元素

python - C++ WMI对象的执行方法