我在管理员帐户下运行Windows服务,我想知道谁是当前登录的用户。它将与当前运行的WindowService帐户不同。 有没有简单的方法从c#中获取它?
不是: System.Security.Principal.WindowsIdentity.GetCurrent() 也不 System.Environment.UserName
感谢
修改
我感兴趣的是当前使用控制台会话登录的用户。谢谢jadarnel27
我对其他远程会话不感兴趣,因为这不是我的情况。
答案 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();
}