簡體   English   中英

C#查詢進程所有者(Windows 7 x64)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM