我如何获得当前用户名在。net使用c# ?


当前回答

我看了这里的大部分答案,没有一个给我正确的用户名。

在我的情况下,我想获得登录用户名,同时运行我的应用程序从不同的用户,就像shift+右键单击文件和“作为不同的用户运行”。

我尝试的答案给了我“其他”用户名。

这篇博文提供了一种获取登录用户名的方法,即使在我的场景中也能工作: https://smbadiwe.github.io/post/track-activities-windows-service/

它使用Wtsapi

编辑:博客文章中的基本代码,以防它消失

将此代码添加到从ServiceBase继承的类中

[DllImport("Wtsapi32.dll")]
private static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WtsInfoClass wtsInfoClass, out IntPtr ppBuffer, out int pBytesReturned);
[DllImport("Wtsapi32.dll")]
private static extern void WTSFreeMemory(IntPtr pointer);
 
private enum WtsInfoClass
{
    WTSUserName = 5, 
    WTSDomainName = 7,
}
 
private static string GetUsername(int sessionId, bool prependDomain = true)
{
    IntPtr buffer;
    int strLen;
    string username = "SYSTEM";
    if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSUserName, out buffer, out strLen) && strLen > 1)
    {
        username = Marshal.PtrToStringAnsi(buffer);
        WTSFreeMemory(buffer);
        if (prependDomain)
        {
            if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSDomainName, out buffer, out strLen) && strLen > 1)
            {
                username = Marshal.PtrToStringAnsi(buffer) + "\\" + username;
                WTSFreeMemory(buffer);
            }
        }
    }
    return username;
}

如果你还没有,给类添加一个构造函数;并添加这一行:

CanHandleSessionChangeEvent = true;

编辑: 每个评论请求,这是我如何获得会话ID -这是活动控制台会话ID:

[DllImport("kernel32.dll")]
private static extern uint WTSGetActiveConsoleSessionId();

var activeSessionId = WTSGetActiveConsoleSessionId();
if (activeSessionId == INVALID_SESSION_ID) //failed
{
    logger.WriteLog("No session attached to console!");    
}

其他回答

获取当前Windows用户名:

using System;

class Sample
{
    public static void Main()
    {
        Console.WriteLine();

        //  <-- Keep this information secure! -->
        Console.WriteLine("UserName: {0}", Environment.UserName);
    }
}

如果你在一个用户网络中,那么用户名将是不同的:

Environment.UserName
- Will Display format : 'Username'

而不是

System.Security.Principal.WindowsIdentity.GetCurrent().Name
- Will Display format : 'NetworkName\Username'

选择您想要的格式。

String myUserName = Environment.UserName

这将为您提供输出- your_user_name

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

我完全赞同其他的答案,但我想强调另一个方法,它说

String UserName = Request.LogonUserIdentity.Name;

上述方法返回的用户名格式为:DomainName\ username。例如,EUROPE\UserName

这不同于:

String UserName = Environment.UserName;

显示格式为:UserName

最后:

String UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

它给出:NT AUTHORITY\IUSR(在IIS服务器上运行应用程序时)和DomainName\UserName(在本地服务器上运行应用程序时)。