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