2011-08-15 4 views
2

管理者アカウントでWindowsサービスを実行していますが、現在ログインしているユーザーは誰ですか?これは、WindowServiceが現在実行中のアカウントとは異なります。 C#から簡単に入手できますか?WindowsServiceからC#の現在ログインしているユーザーを見つける方法はありますか?

それはないです。 System.Security.Principal.WindowsIdentity.GetCurrent() どちら System.Environment.UserName

おかげ

編集

私が興味を持って、現在ありますコンソールセッションでログインしました。ありがとうjadarnel27

これは私の場合のシナリオではないので、他のリモートセッションには興味がありません。あなたはCassiaで見たいと思うかもしれません

+2

ログインしたユーザーは1人だけだと思いますか?ターミナルサービス/リモートデスクトップのような高速ユーザースイッチングでは、複数のログインセッションが存在する可能性があります。 –

+0

複数のユーザーが同時にログインしている可能性があります。たとえば、リモートデスクトップを介して。 –

+1

おそらく、ログインしているすべてのユーザーのリストを知っていて、「コンソール」セッションを持っているユーザーがいると便利でしょう。 – jadarnel27

答えて

6

1)CassiaのことができるようになりRDCを含む現在ログインしているユーザーのリストを表示します。 SO answer

foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions()) 
{ 
    // sess.SessionId 
    // sess.UserName 
} 

2)WMI()WTSEnumerateSessions

4) "explorer.exeの" のすべてのインスタンスを列挙してのPInvokeを使用して所有者を取得する

Select * from Win32_LogonSession 

3)のPInvoke(OpenProcessHandle) 。

Process[] processes = Process.GetProcessesByName("explorer"); 

これは少しハッキーです。 WMIもこれに使用できます。

WMIを使用するソリューションを使用することに決めた場合は、winmgmtをサービスの依存関係として設定することをお勧めします。

+0

私はこのソリューションが本当に好きです。ありがとう。 –

2

カシアは、ネイティブのWindowsターミナルサービスAPI(今のリモートデスクトップサービスAPI)にアクセスするための.NETライブラリです。これは、C#、Visual Basic.NET、またはその他の.NET言語から使用できます。

と:

端末セッションを列挙し、接続状態、ユーザー名、クライアント名、クライアントの表示内容を含むセッション情報を報告...

0

これを試してみて、

http://www.codeproject.com/KB/vb/Windows_Service.aspx

非常にシンプルなアイデアは、単に「explorer.exeの」を見つけるために、アクティブなプロセスをループし、ユーザーが下にその実行のthats示しています。複数のユーザーがいる場合は調整する必要があります。

0

現在のコンソールセッションにログインしているユーザーのリストは、WMI経由で取得することができます。 System.Management.dllへの参照を追加する必要があります。

public static List<string> GetLoggedOnUsers(CacheLevel level) 
{ 
    const int ConsoleSession = 2; 

    string logonQuery = "SELECT * FROM Win32_LogonSession WHERE LogonType = " + ConsoleSession; 

    ManagementObjectSearcher searcher = new ManagementObjectSearcher(logonQuery); 

    List<string> userNames = new List<string>(); 

    foreach (ManagementBaseObject logon in searcher.Get()) 
    { 
     string logonId = logon.Properties["LogonId"].Value.ToString(); 

     string userQuery = "ASSOCIATORS OF {Win32_LogonSession.LogonId=" + logonId + "} " 
          + "WHERE AssocClass=Win32_LoggedOnUser Role=Dependent"; 

     ManagementObjectSearcher searcher2 = new ManagementObjectSearcher(userQuery); 

     foreach (ManagementBaseObject user in searcher2.Get()) 
     { 
      string name = user.Properties["FullName"].Value.ToString(); 

      userNames.Add(name); 
     } 
    } 

    return userNames.Distinct().ToList(); 
} 
関連する問題