如何在.NET中从Windows服务中获取当前登录的用户名?

15 浏览
0 Comments

如何在.NET中从Windows服务中获取当前登录的用户名?

我有一个需要当前登录用户名的Windows服务。我尝试过使用System.Environment.UserName、Windows身份和Windows窗体认证,但是所有这些方法都返回正在运行的我的服务的用户为\"System\",因为我的服务具有系统权限。有没有一种方法可以在不更改我的服务账户类型的情况下获取当前登录的用户名?

0
0 Comments

问题的原因是,在使用ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem")获取当前登录的用户名时,如果服务是通过远程桌面连接启动的,这种方法将不起作用。为了解决这个问题,可以通过获取一个始终在计算机上运行的交互式进程(explorer.exe)的所有者用户名来获取当前登录的Windows用户名。

解决方法如下:

foreach (System.Management.ManagementObject Process in Processes.Get())
{
    if (Process["ExecutablePath"] != null && 
        System.IO.Path.GetFileName(Process["ExecutablePath"].ToString()).ToLower() == "explorer.exe" )
    {
        string[] OwnerInfo = new string[2];
        Process.InvokeMethod("GetOwner", (object[])OwnerInfo);
        Console.WriteLine(string.Format("Windows Logged-in Interactive UserName={0}", OwnerInfo[0]));
        break;
    }
}

但是,如果同时有多个用户登录(例如,在Windows 10中切换到另一个用户),这种方法将不起作用,因为每个用户都会运行一个explorer.exe实例。为了解决这个问题,可以使用以下代码来获取explorer.exe的正确副本:

ManagementObjectSearcher Processes = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Process");

为了确保获取到正确的explorer.exe副本,可以获取当前进程的会话ID,并将其与找到的explorer.exe的SessionID属性值进行比较,然后从该explorer.exe中获取用户信息。

当然,一个Windows服务可能在没有UI或没有在其会话中运行explorer.exe的情况下运行,所以你可能需要采取其他方法。但是,在Windows桌面应用程序中使用这种方法效果很好。

0
0 Comments

在一个用户网络中,如果你想获取当前已登录的用户名,你可以使用以下两种方法:

方法一:

Environment.UserName

这种方法返回的格式为:'用户名'

方法二:

System.Security.Principal.WindowsIdentity.GetCurrent().Name

这种方法返回的格式为:'网络名\用户名'

你可以根据自己的需求选择其中一种格式。

然而,当你的应用程序作为一个服务运行时,以上两种方法都会返回服务账户名,而不是已登录的用户的用户名。所以以上解决方法对于服务运行环境并不适用。

0
0 Comments

问题的出现原因:\n用户在Windows服务中想要获取当前登录的用户名,但是通常的获取用户名的方法在运行服务时不起作用,因为存在系统账户的问题。\n解决方法:\n通过使用WMI查询来获取用户名。需要手动添加对System.Management的引用。以下是获取用户名的代码示例:\n

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];

\n这个解决方法适用于在Windows 10 20H2的系统账户下运行的服务应用程序。\n需要注意的是,这个WMI查询在远程(RDP)会话中不起作用。如果其他人在将来阅读这篇文章时,要让他们更容易看到这个注意事项。

0