我有一个Windows服务,该服务始终为所有登录的用户运行WPF应用程序,并且运行良好,现在在WPF应用程序中,我无法获得当前的用户名,即Environment.UserName;返回“ SYSTEM”,这是可以理解的。所以我想是找到可以由Process.GetCurrentProcess()。SessionId检索的当前进程的会话ID,然后获取登录到该计算机并循环遍历的所有用户的列表,以找到与进程会话匹配的会话ID id和后来的用户名。
但我不知道如何获取所有已登录用户的列表,或者如果有人可以帮助我,我将不胜感激。
我通过在WPF应用程序中执行powershell命令“ quser”来解决该问题,该命令返回所有已登录的用户,然后迭代查找其中应用程序正在使用用户会话ID运行的会话ID,然后检索其名称。以下是通过传递用户名ID来获取用户名的函数
private string GetUserName(int SessionId)
{
try
{
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript("Quser");
pipeline.Commands.Add("Out-String");
Collection<PSObject> results = pipeline.Invoke();
runspace.Close();
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in results)
{
stringBuilder.AppendLine(obj.ToString());
}
foreach (string User in stringBuilder.ToString().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Skip(1))
{
string[] UserAttributes = User.Split(new string[]{" "},StringSplitOptions.RemoveEmptyEntries);
if (int.Parse(UserAttributes[2].Trim()) == SessionId)
{
return UserAttributes[0].Replace(">", string.Empty).Trim();
}
}
return stringBuilder.ToString();
}
catch (Exception ex)
{
}
return string.Empty;
}
该函数可以通过以下方式调用
string CurrentUser = GetUserName(Process.GetCurrentProcess().SessionId);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句