3
SystemEvents.SessionSwitchイベントを使用して、プロセスを実行しているユーザーがロックされているかどうかを確認していますが、ロック/ロック解除されたユーザーをイベントで知らせることはできません。 この情報は(権限の低いユーザが所有するプロセスから)どのように入手できますかSystemEvents.SessionSwitchどのユーザーがロック/ロック解除されましたか
SystemEvents.SessionSwitchイベントを使用して、プロセスを実行しているユーザーがロックされているかどうかを確認していますが、ロック/ロック解除されたユーザーをイベントで知らせることはできません。 この情報は(権限の低いユーザが所有するプロセスから)どのように入手できますかSystemEvents.SessionSwitchどのユーザーがロック/ロック解除されましたか
部分的に信頼できるコードはありません。アプリケーションまたはその一部を完全信頼サービスにすることができる場合は、the answer〜related questionに指定されているようにセッションIDを取得できます。
[DllImport ("advapi32.dll", SetLastError = true)]
static extern bool OpenProcessToken (IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);
[DllImport ("kernel32.dll", SetLastError = true)]
[return: MarshalAs (UnmanagedType.Bool)]
static extern bool CloseHandle (IntPtr hObject);
static uint TOKEN_QUERY = 0x0008;
// ...
public static WindowsIdentity GetUserFromSession(int sessionId)
{
return Process.GetProcesses()
.Where(p => p.SessionId == sessionId)
.Select(GetUserFromProcess)
.FirstOrDefault();
}
public static WindowsIdentity GetUserFromProcess(Process p)
{
IntPtr ph;
try
{
OpenProcessToken (p.Handle, TOKEN_QUERY, out ph);
return new WindowsIdentity(ph);
}
catch (Exception e)
{
return null;
}
finally
{
if (ph != IntPtr.Zero) CloseHandle(ph);
}
}
:
は、次にセッションIDを与え、あなたは(Getting Windows Process Owner Nameから抽象化)実際のユーザを取得するには、そのセッションIDを持つ任意のプロセスを見つけることができます