我正在管理员帐户下运行 Windows 服务,我想找出当前登录的用户是谁。它与当前运行服务的帐户不同。 有没有简单的方法可以从 C# 获取它?
那些似乎不起作用:
System.Security.Principal.WindowsIdentity.GetCurrent()
System.Environment.UserName
我对当前使用控制台会话登录的人感兴趣。
我对其他远程会话不感兴趣,因为这不是我的案例场景。
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 设置为服务的依赖项可能是个好主意。
您可能想看看Cassia:
Cassia 是一个用于访问本机 Windows 终端服务 API(现在的远程桌面服务 API)的 .NET 库。它可以在 C#、Visual Basic.NET 或任何其他 .NET 语言中使用。
和:
枚举终端会话并报告会话信息,包括连接状态、用户名、客户端名称、客户端显示详细信息...
试试这个,
http://www.codeproject.com/KB/vb/Windows_Service.aspx
非常简单的想法,只需循环遍历活动进程来查找“explorer.exe”并列出其运行的用户。如果您有多个用户,可能需要调整。
使用本地安全机构枚举 .NET 中的用户会话 http://www.codeproject.com/KB/system/LSAEnumUserSessions.aspx
WTSQuerySessionInformation函数 http://msdn.microsoft.com/en-us/library/aa383838%28v=vs.85%29.aspx
可以通过 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();
}
这是另一种无需安装任何软件包的方法。 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();
}