私からの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);
出典
2012-01-14 17:49:02
arx
申し訳ありませんが、私はどのように追加/ポスターの元のコードから何かを変更して表示されません。 ** Warlib **のコードを利用する方法を私に見せようとしているかのように見えます。 いずれにしても、プロセスを実行している他のユーザーの名前は表示されません。 * sampleuser *という名前のユーザーを作成し、メモ帳を実行してrun-asをクリックし、* sampleuser *が表示されているかどうかを確認します。 – BoggleKing
"Warlibが投稿したコードをどのように利用するかを私に見せようとしているかのように見えます。はい、そうです。コードは私のために働いたが、あなたのために働かなかったので、私が行ったことを投稿した。それは役に立たないのでしょうか? "sampleuserというユーザーを作成し、メモ帳をShiftキーを押しながらクリックして実行し、sampleuserが表示されているかどうかを確認してください。 sampleuserのSIDが表示されますが、「sampleuser」は表示されません。これがコードの機能です。 SIDをユーザー名に変換する方法を知りたければ、別の質問を投稿してください。 – arx
http://www.codeproject.com/Questions/314697/Csharp-query-for-process-owner-Windows-7-x64 私のコードを掲載しました。 SIDをユーザー名に変換できることがわかります。私はまだ、私が実行するときに、サンプルユーザーとしてプロセス(例えば、メモ帳)を見ることができない理由を理解する助けが必要です。 Warlibが投稿した内容を繰り返し書きますが、何も追加していないことは役に立ちません。 – BoggleKing