我想知道如何在(或通过)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(系统和受保护的进程,如 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);
好像我首先误解了这个问题,对不起。刚刚发现了一个有趣的主题,可能会对您有所帮助。