从WindowsService如何从C#中找到当前登录的用户?

时间:2011-08-15 13:36:13

标签: c# windows-services

我在管理员帐户下运行Windows服务,我想知道谁是当前登录的用户。它将与当前运行的WindowService帐户不同。 有没有简单的方法从c#中获取它?

不是: System.Security.Principal.WindowsIdentity.GetCurrent() 也不 System.Environment.UserName

感谢

修改

我感兴趣的是当前使用控制台会话登录的用户。谢谢jadarnel27

我对其他远程会话不感兴趣,因为这不是我的情况。

5 个答案:

答案 0 :(得分:6)

1)Cassia应该能够为您提供当前登录用户的列表,包括RDC。

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

2)WMI(SO answer

Select * from Win32_LogonSession

3)PInvoke to WTSEnumerateSessions

4)枚举“explorer.exe”的所有实例,并使用PInvoke(OpenProcessHandle)获取所有者。

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

这有点黑客。 WMI也可用于此目的。

如果您决定使用使用WMI的解决方案,那么将winmgmt设置为服务的依赖项可能是个好主意。

答案 1 :(得分:2)

您可能需要查看Cassia

  

Cassia是一个用于访问本机Windows终端服务API(现在是远程桌面服务API)的.NET库。它可以在C#,Visual Basic.NET或任何其他.NET语言中使用。

  

枚举终端会话和报告会话信息,包括连接状态,用户名,客户端名称,客户端显示详细信息......

答案 2 :(得分:0)

试试这个,

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

非常简单的想法,只需通过活动进程循环找到'explorer.exe'并列出其运行的用户。如果您有多个用户,可能需要进行调整。

答案 3 :(得分:0)

使用本地安全机构在.NET中枚举用户会话 http://www.codeproject.com/KB/system/LSAEnumUserSessions.aspx

WTSQuerySessionInformation函数 http://msdn.microsoft.com/en-us/library/aa383838%28v=vs.85%29.aspx

答案 4 :(得分: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();
}