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

问题描述 投票:0回答:6

我正在管理员帐户下运行 Windows 服务,我想找出当前登录的用户是谁。它与当前运行服务的帐户不同。 有没有简单的方法可以从 C# 获取它?

那些似乎不起作用:

  • System.Security.Principal.WindowsIdentity.GetCurrent()
  • System.Environment.UserName

我对当前使用控制台会话登录的人感兴趣。

我对其他远程会话不感兴趣,因为这不是我的案例场景。

c# .net windows-services
6个回答
6
投票

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

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

2)WMI(所以答案

Select * from Win32_LogonSession

3) PInvoke 到 WTSEnumerateSessions

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

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

这有点hacky。 WMI 也可以用于此目的。

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


2
投票

您可能想看看Cassia

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

和:

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


0
投票

试试这个,

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

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


0
投票

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

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


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

0
投票

这是另一种无需安装任何软件包的方法。 ManagementObjectSearcher 和 Powershell 在我的案例中引起了问题(.NET Core)。

public static List<string> GetLoggedInUsers() {
    Process process = new Process {
        StartInfo = new ProcessStartInfo(
            Path.Combine(Environment.SystemDirectory, @"WindowsPowerShell\v1.0\powershell.exe"), 
            "(Get-Process -IncludeUserName -name \"Explorer\").UserName|Sort|Get-Unique") {
            WorkingDirectory = Environment.CurrentDirectory,
            RedirectStandardOutput = true,
            CreateNoWindow = true,
        }
    };
    process.Start();
    StreamReader reader = process.StandardOutput;
    string result = reader.ReadToEnd();
    return result.Split(Environment.NewLine).ToList();
}
© www.soinside.com 2019 - 2024. All rights reserved.