如何在C#中获取当前登录的用户名?

如何在C#中获取当前登录的用户名?,c#,C#,可能重复: C#应用程序可以直接执行(双击exe)或以管理员身份执行(以管理员身份运行) 我需要以管理员身份运行我的应用程序(以管理员身份运行),即使是在简单的用户帐户中 我想使用C#获取当前登录的用户名(但我获取的用户名是admin) 我尝试了许多选项,如:Environment.Username、windowsindential类等。它给我的用户名是admin(因为我以admin的身份运行了exe),而不是当前登录的用户名 这是一个在.NET3.5上开发的winForm应用程序。应用程序可

可能重复:

C#应用程序可以直接执行(双击exe)或以管理员身份执行(以管理员身份运行)

我需要以管理员身份运行我的应用程序(以管理员身份运行),即使是在简单的用户帐户中

我想使用C#获取当前登录的用户名(但我获取的用户名是admin)

我尝试了许多选项,如:Environment.Username、windowsindential类等。它给我的用户名是admin(因为我以admin的身份运行了exe),而不是当前登录的用户名

这是一个在.NET3.5上开发的winForm应用程序。应用程序可执行文件通过vb脚本在管理员登录时执行。vb脚本在用户登录时立即执行

在这个fourm中有许多类似的查询,但是所有的答案都提供了管理员的用户名,而不是当前登录的用户用户名。因此我发布了这个问题


请回答我的问题。先谢谢你

您可以尝试查询会话列表

通过查找非管理会话的活动会话,可以确定当前登录的实际用户


有关于如何从C#调用本机方法的信息。

这里有几个答案:


我想先试试Win32 api。你可以使用
System.Security.Principal.WindowsIdentity.GetCurrent().Name并将其分配给
字符串

例如:

string username = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

这应该可以解决问题-

AppDomain appDomain = Thread.GetDomain();
appDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsPrincipal windowsPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;

Console.WriteLine(windowsPrincipal.Identity.Name); 

如果不了解应用程序的任何其他信息,比如什么类型的身份验证、什么框架、如何处理登录和会话,那么几乎不可能给出任何有意义的回答?WinForms?网络表单?银灯?WPF?这不是否决答案的好理由。NET是一个托管框架,不应该公开这种低级功能。除了使用P/Invoke访问它之外,别无选择。要么你知道并恶意否决,要么你不知道这意味着你没有否决投票的道德权利。OP想要一个C#答案。即使可以使用非托管代码,也有可用的托管方法。为什么事情过于复杂?不管怎样,直到OP更详细地更新了他的问题,我们才知道哪个方法是正确的答案。首先,我不知道有任何托管方法可以提供OS用户会话列表等。第二,即使有更好的解决方案涉及调用托管方法,也不会使我的答案不正确;从C#调用本机函数是一种标准做法。这很公平。如果你修改你的答案,我可以删除我的反对票。谢谢。顺便说一句,C.M.答案中的链接确实指向一个只有C#的解决方案可用的页面,因此得到了我的支持(不过它使用WMI)。但是,不确定我的建议或该建议是否适用于OP的情况。不,这将返回应用程序作为银行运行的用户名,以供回复。这将给出我执行exe时使用的管理员用户名。不,如果您是
machine\UserLimited
,并且在“运行身份”框中输入UserAdmin的凭据,它将返回
machine\UserAdmin
,我以为您想做其他事情。通过右键单击->以管理员身份运行,从“admin”运行应用程序,但如果您使用右键单击->以管理员身份运行,并且当前用户不是管理员组的成员,则会要求您使用其他帐户。如果发生这种情况,您的代码将显示第二个帐户。感谢您的回复。这将提供管理员的用户名,我将使用该用户名执行exe。