2011-10-30 12 views
3

SystemEvents.SessionSwitchイベントを使用して、プロセスを実行しているユーザーがロックされているかどうかを確認していますが、ロック/ロック解除されたユーザーをイベントで知らせることはできません。 この情報は(権限の低いユーザが所有するプロセスから)どのように入手できますかSystemEvents.SessionSwitchどのユーザーがロック/ロック解除されましたか

答えて

1

部分的に信頼できるコードはありません。アプリケーションまたはその一部を完全信頼サービスにすることができる場合は、the answerrelated 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を持つ任意のプロセスを見つけることができます

関連する問題