2

C#で(またはC#を介して)プロセスの所有者を照会する方法を知りたいです。私はhttp://www.codeproject.com/KB/cs/processownersid.aspxで例を試しました。

WMI:すべてのプロセスとその所有者にクエリを実行できますが、速度が遅すぎます。

WIN32:高速ですが、自分以外のプロセスの所有者を照会すると、アクセス許可が拒否された例外が発生します。

WIN32の問題を解決するために、なりすましを実装しようとしました。また、コンパイルされた.exeを管理者として実行してみました。私はこのC#のことを始めて数か月しか経っていないので、気楽に行ってください。

4

2 に答える 2

0

最初に質問を誤解したようです、ごめんなさい。あなたを助けるかもしれない主題に関する興味深いトピックをちょうど見つけました。

于 2012-01-14T08:57:10.687 に答える
0

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);
    }
}

管理者として実行すると、すべてのプロセス(Systemおよびaudiodgなどの保護されたプロセスを除く)のSIDが正常に出力されます。アクセス拒否エラーは発生しません。

このコードはあなたのために働きますか?

私もWindows7x64を使用しています。

アップデート

これは、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);
于 2012-01-14T17:49:02.577 に答える