質問

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

また、管理者として実行すると、すべてのプロセスのSIDSを正常に印刷します(AudioDGなどのシステムと保護されたプロセスを除く)。アクセスが除去されたエラーは発生しません。

このコードはあなたのために機能しますか?

Windows 7 X64も使用しています。

アップデート

これは、Runasプロセスを除くすべてのプロセスで機能します。問題は、Process.Handleの内部であり、あまりにも多くの権限を要求します。

Process.handle to 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帰属
所属していません StackOverflow
scroll top