簡體   English   中英

您如何獲取進程所有者的用戶名?

[英]How do you get the UserName of the owner of a process?

我正在嘗試獲取當前用戶當前擁有的進程列表( Environment.UserName )。 不幸的是, Process類無法獲取擁有進程的用戶的UserName。

如何使用Process類獲取用戶的用戶名,該用戶是進程的所有者,因此我可以將其與Environment.UserName進行比較?

如果您的解決方案需要pinvoke ,請提供代碼示例。

謝謝,您的回答使我走上了正確的道路。 對於那些需要代碼示例的人:

public class App
{
    public static void Main(string[] Args)
    {
        Management.ManagementObjectSearcher Processes = new Management.ManagementObjectSearcher("SELECT * FROM Win32_Process");

        foreach (Management.ManagementObject Process in Processes.Get()) {
            if (Process["ExecutablePath"] != null) {
                string ExecutablePath = Process["ExecutablePath"].ToString();

                string[] OwnerInfo = new string[2];
                Process.InvokeMethod("GetOwner", (object[]) OwnerInfo);

                Console.WriteLine(string.Format("{0}: {1}", IO.Path.GetFileName(ExecutablePath), OwnerInfo[0]));
            }
        }

        Console.ReadLine();
    }
}

Warlib的CodeProject文章“ 如何獲取進程所有者ID和當前用戶SID”描述了如何同時使用WMI和通過PInvoke使用Win32 API來執行此操作。

WMI代碼要簡單得多,但是執行起來較慢。 您的問題並未表明哪種方案更適合您的方案。

向安德魯·摩爾(Andrew Moore)提出答案,我只是格式化它,因為它沒有在C#3.5中編譯。

private string GetUserName(string procName)
{
    string query = "SELECT * FROM Win32_Process WHERE Name = \'" + procName + "\'";
    var procs = new System.Management.ManagementObjectSearcher(query);
    foreach (System.Management.ManagementObject p in procs.Get())
    {
        var path = p["ExecutablePath"];
        if (path != null)
        {
            string executablePath = path.ToString();
            string[] ownerInfo = new string[2];
            p.InvokeMethod("GetOwner", (object[])ownerInfo);
            return ownerInfo[0];
        }
    }
    return null;
}

您可能會使用System.Management(WMI)。 這樣,您可以查詢Win32_Process樹。

這是標記為“ Win32_Process類的GetOwner方法”的MS鏈接

如果沒有計算機管理員,您將很難獲得用戶名。

除非您是管理員,否則使用WMI,通過OpenProcess或使用WTSEnumerateProcesses的方法都不會為您提供用戶名。 嘗試啟用SeDebugPrivilege等也不起作用。 我仍然需要查看無需管理員即可工作的代碼。

如果有人在沒有管理員身份的情況下知道如何獲取此信息,請寫該怎么做,因為我還沒有找到如何對服務用戶啟用該級別的訪問權限。

您需要添加對System.Management.dll的引用才能使其正常工作。

這就是我最終使用的內容。 它適用於.NET 3.5:

using System.Linq;
using System.Management;

class Program
{
    /// <summary>
    /// Adapted from https://www.codeproject.com/Articles/14828/How-To-Get-Process-Owner-ID-and-Current-User-SID
    /// </summary>
    public static void GetProcessOwnerByProcessId(int processId, out string user, out string domain)
    {
        user = "???";
        domain = "???";

        var sq = new ObjectQuery("Select * from Win32_Process Where ProcessID = '" + processId + "'");
        var searcher = new ManagementObjectSearcher(sq);
        if (searcher.Get().Count != 1)
        {
            return;
        }
        var process = searcher.Get().Cast<ManagementObject>().First();
        var ownerInfo = new string[2];
        process.InvokeMethod("GetOwner", ownerInfo);

        if (user != null)
        {
            user = ownerInfo[0];
        }
        if (domain != null)
        {
            domain = ownerInfo[1];
        }
    }

    public static void Main()
    {
        var processId = System.Diagnostics.Process.GetCurrentProcess().Id;
        string user;
        string domain;
        GetProcessOwnerByProcessId(processId, out user, out domain);
        System.Console.WriteLine(domain + "\\" + user);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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