[英]C# query for process owner (Windows 7 x64)
我想知道如何在(或通過)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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.