2012-01-14 12 views
2

C#で(または経由して)プロセスの所有者を照会する方法を知りたいと思います。私はhttp://www.codeproject.com/KB/cs/processownersid.aspxの例を試した。プロセス所有者のC#クエリ(Windows 7 x64)

WMI: すべてのプロセスとその所有者に問い合わせることはできますが、処理が遅すぎます。

WIN32: 高速ですが、自分自身以外のプロセスの所有者を検索する際に、許可が拒否されました。

私はWIN32の問題を解決するために偽装を実装しようとしましたが、行っていません。私はまた、コンパイルされた.exeを管理者として実行しようとしました。私はこのC#の事に数ヶ月しかないので、簡単に行くことができます。

答えて

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

と私は管理者として実行するときには、正常(システムや、audiodgなどの保護のプロセスを除く)すべてのプロセスのSIDを出力します。アクセス拒否エラーは発生しません。

このコードは機能しますか?

私はWindows 7 x64も使用しています。

更新

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

あなたは

IntPtr procHandle=OpenProcess(ProcessAccessFlags.QueryInformation, false, PID); 

でProcess.Handleへの呼び出しを交換し、次の定義を追加した場合、コードはまた、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); 
+0

申し訳ありませんが、私はどのように追加/ポスターの元のコードから何かを変更して表示されません。 ** Warlib **のコードを利用する方法を私に見せようとしているかのように見えます。 いずれにしても、プロセスを実行している他のユーザーの名前は表示されません。 * sampleuser *という名前のユーザーを作成し、メモ帳を実行してrun-asをクリックし、* sampleuser *が表示されているかどうかを確認します。 – BoggleKing

+0

"Warlibが投稿したコードをどのように利用するかを私に見せようとしているかのように見えます。はい、そうです。コードは私のために働いたが、あなたのために働かなかったので、私が行ったことを投稿した。それは役に立たないのでしょうか? "sampleuserというユーザーを作成し、メモ帳をShiftキーを押しながらクリックして実行し、sampleuserが表示されているかどうかを確認してください。 sampleuserのSIDが表示されますが、「sampleuser」は表示されません。これがコードの機能です。 SIDをユーザー名に変換する方法を知りたければ、別の質問を投稿してください。 – arx

+0

http://www.codeproject.com/Questions/314697/Csharp-query-for-process-owner-Windows-7-x64 私のコードを掲載しました。 SIDをユーザー名に変換できることがわかります。私はまだ、私が実行するときに、サンプルユーザーとしてプロセス(例えば、メモ帳)を見ることができない理由を理解する助けが必要です。 Warlibが投稿した内容を繰り返し書きますが、何も追加していないことは役に立ちません。 – BoggleKing

0

私はまず質問を誤解したようですが、ごめんなさい。あなたに役立つ可能性のある件名にinteresting topicが見つかりました。

+0

彼は、プロセスを所有するユーザーで、親プロセスは望んでいません。 – arx

+0

@arxありがとうございました!私の悪い、これは私が最初に思ったよりも難しい問題として判明します。 – Bazurbat

関連する問題