ฉันจะรับชื่อผู้ใช้ปัจจุบันใน. NET โดยใช้ C # ได้อย่างไร


606

ฉันจะรับชื่อผู้ใช้ปัจจุบันใน. NET โดยใช้ C # ได้อย่างไร

คำตอบ:


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

96
สิ่งนี้แตกต่างEnvironment.UserNameอย่างไร
Sam Harwell

59
@SimonGillbee สิ่งนี้ผิดEnvironment.UserNameจะส่งคืนผู้ใช้ "RunAs"
Bolu

5
เพื่อยืนยัน .... MessageBox.Show(Environment.UserName);ใส่สิ่งนี้ไว้ในwindow_loadedกิจกรรมของคุณและรันโดยใช้ RunAs ....
Bolu


4
ผลตอบแทนDomain\Usernameนี้ ฉันจะรับชื่อที่เชื่อมโยงกับชื่อผู้ใช้ได้อย่างไร
SearchForKnowledge

325

หากคุณอยู่ในเครือข่ายผู้ใช้ชื่อผู้ใช้จะแตกต่างกัน:

Environment.UserName
- Will Display format : 'Username'

ค่อนข้างมากกว่า

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

เลือกรูปแบบที่คุณต้องการ


7
คุณสามารถใช้เพื่อให้ได้ดูเหมือนผลเช่นเดียวกับEnvironment.UserDomainName + "\\" + Environment.UserName System.Security.Principal.WindowsIdentity.GetCurrent().Nameตอนนี้อะไรคือสิ่งที่คุณถาม ... ฉันไม่แน่ใจ
Gutblender

9
ฉันต้องการให้ผู้ใช้เรียกใช้แอปมากกว่าผู้ที่ลงชื่อเข้าใช้ (Environment.UserName ไม่ใช่สิ่งที่ฉันต้องการ) ดังนั้นฉันจึงได้ดำเนินการดังต่อไปนี้เพื่อตัดโดเมน: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
thehelix

คุณต้องเพิ่มToArray()หลังจากSplitก่อนโทรLast()
codenamezero

1
@codenamezero ไม่ToArray()จำเป็น คุณจะต้องusing System.Linq;แม้ว่า
TheSoftwareJedi

112

Environment.UserNameลองสถานที่:


5
หรือstring userName = Environment.UserName;
โดนัท

10
ข้อควรระวัง: เช่น Simon Gillbee ที่กล่าวถึงในความคิดเห็นของคำตอบที่ยอมรับEnvironment.UsernNameให้ชื่อบัญชีที่ลงชื่อเข้าใช้ แต่WindowsIdentity.GetCurrent().Nameกลับชื่อบัญชีที่แอปพลิเคชันทำงานอยู่
Gerwald

5
@leo: ข้อควรระวัง: ข้อมูลที่ยังไม่ถูกต้องเห็นได้ชัดดูการตอบกลับของ Bolu :-)
TJ Crowder

อย่าใช้กับ ASP.NET docs.microsoft.com พูดว่า: "หากแอปพลิเคชัน ASP.NET ทำงานในสภาพแวดล้อมการพัฒนาคุณสมบัติชื่อผู้ใช้จะส่งคืนชื่อผู้ใช้ปัจจุบันในแอปพลิเคชัน ASP.NET ที่เผยแพร่คุณสมบัตินี้จะส่งคืนชื่อบัญชีแอปพลิเคชันพูล ( เช่น Default AppPool) "
feihoa

28

เอกสารสำหรับ Environment.UserName ดูเหมือนจะขัดแย้งกันเล็กน้อย:

คุณสมบัติ Environment.UserName

ในหน้าเดียวกันมันบอกว่า:

รับชื่อผู้ใช้ของบุคคลที่เข้าสู่ระบบปฏิบัติการ Windows ในปัจจุบัน

และ

แสดงชื่อผู้ใช้ของบุคคลที่เริ่มต้นเธรดปัจจุบัน

หากคุณทดสอบ Environment.UserName โดยใช้ RunAs จะทำให้ชื่อบัญชีผู้ใช้ RunAs ไม่ใช่ชื่อผู้ใช้ที่ล็อกออนเข้าสู่ Windows


24

ฉันสองคำตอบอื่น ๆ โดยสิ้นเชิง แต่ฉันต้องการที่จะเน้นวิธีการอีกหนึ่งที่บอกว่า

String UserName = Request.LogonUserIdentity.Name;

วิธีการดังกล่าวกลับมาให้ฉันชื่อผู้ใช้ในรูปแบบ: DomainName \ ชื่อผู้ใช้ ตัวอย่างเช่น EUROPE \ ชื่อผู้ใช้

ซึ่งแตกต่างจาก:

String UserName = Environment.UserName;

ซึ่งแสดงในรูปแบบ: ชื่อผู้ใช้

และในที่สุดก็:

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

ซึ่งให้: NT AUTHORITY\IUSR(ในขณะที่เรียกใช้แอปพลิเคชันบนเซิร์ฟเวอร์ IIS) และDomainName\UserName(ในขณะที่เรียกใช้แอปพลิเคชันบนเซิร์ฟเวอร์ภายใน)


เนมสเปซใดที่จำเป็นในการใช้ "คำขอ"
TK-421

1
@ TK-421 Requestใช้งานได้เฉพาะถ้าคุณเป็นเว็บแอปพลิเคชัน มันเป็นตัวอย่างของSystem.Web.HttpRequest
Gerardo Grignoli


11

คุณอาจต้องการลองใช้:

Environment.UserName;

แบบนี้...:

string j = "Your WindowsXP Account Name is: " + Environment.UserName;

หวังว่านี่จะเป็นประโยชน์


11

ฉันลองชุดค่าผสมหลายตัวจากคำตอบที่มีอยู่ แต่พวกเขาก็ให้ฉัน

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

ฉันลงเอยด้วยการใช้

string vUserName = User.Identity.Name;

ซึ่งให้ชื่อผู้ใช้โดเมนจริงกับฉันเท่านั้น


ยอดเยี่ยม ฉันยังได้รับข้อมูลประจำตัวของแอพเท่านั้น แต่รหัสของคุณแก้ไขปัญหาของฉันได้ ขอบคุณมาก.
SuryaKavitha

ดูเหมือนว่าคุณต้องการชื่อผู้ใช้ของผู้ใช้ที่ส่งคำขอฉันเดาตัวควบคุม MVC หรือ Web API ซึ่งแตกต่างจากชื่อผู้ใช้ที่กระบวนการทำงานภายใต้
Ben Aaronson

@BenAaronson คำถามไม่ได้พูดอะไรเกี่ยวกับชื่อผู้ใช้ที่กำลังดำเนินการอยู่ ฉันต้องการชื่อผู้ใช้โดเมนที่เข้าสู่ระบบในปัจจุบันและการค้นหานำฉันมาที่หน้านี้รหัสนี้ทำให้ฉันได้ในสิ่งที่ฉันต้องการ
Daniel E.


9

ใช้System.Windows.Forms.SystemInformation.UserNameสำหรับผู้ใช้ที่เข้าสู่ระบบตามจริงในขณะที่ Environment.UserNameยังคงส่งคืนบัญชีที่ถูกใช้โดยกระบวนการปัจจุบัน


ขอบคุณสำหรับการแบ่งปันโปรดดู: System.Windows.Forms.SystemInformation.UserDomainName
Ashish Singh

9

ในกรณีที่มีคนค้นหาชื่อที่แสดงของผู้ใช้ซึ่งตรงข้ามกับชื่อผู้ใช้เช่นฉัน

นี่คือการรักษา:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

เพิ่มการอ้างอิงถึงSystem.DirectoryServices.AccountManagementในโครงการของคุณ


6

ฉันได้ลองคำตอบก่อนหน้านี้ทั้งหมดแล้วและพบคำตอบใน MSDN หลังจากที่ไม่มีคำตอบเหล่านี้มาให้ฉัน ดู 'ชื่อผู้ใช้ 4' สำหรับสิ่งที่ถูกต้องสำหรับฉัน

ฉันหลังจากที่เข้าสู่ระบบผู้ใช้ตามที่แสดงโดย:

<asp:LoginName ID="LoginName1" runat="server" />

นี่เป็นฟังก์ชั่นเล็ก ๆ น้อย ๆ ที่ฉันเขียนให้ลองทั้งหมด ผลลัพธ์ของฉันอยู่ในความคิดเห็นหลังจากแต่ละแถว

protected string GetLoggedInUsername()
{
    string UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; // Gives NT AUTHORITY\SYSTEM
    String UserName2 = Request.LogonUserIdentity.Name; // Gives NT AUTHORITY\SYSTEM
    String UserName3 = Environment.UserName; // Gives SYSTEM
    string UserName4 = HttpContext.Current.User.Identity.Name; // Gives actual user logged on (as seen in <ASP:Login />)
    string UserName5 = System.Windows.Forms.SystemInformation.UserName; // Gives SYSTEM
    return UserName4;
}

การเรียกใช้ฟังก์ชันนี้ส่งคืนชื่อผู้ใช้ที่ล็อกอินโดยส่งคืน

อัปเดต: ฉันต้องการจะชี้ให้เห็นว่าการใช้รหัสนี้ในอินสแตนซ์เซิร์ฟเวอร์ในพื้นที่ของฉันแสดงให้ฉันเห็นว่า Username4 ส่งคืน "" (สตริงว่าง) แต่ชื่อผู้ใช้ 3 และชื่อผู้ใช้ 5 ส่งคืนผู้ใช้ที่เข้าสู่ระบบ สิ่งที่ต้องระวัง


เว็บไซต์ของฉันใช้ IIS แต่เมื่อฉันไปที่หน้าจากคอมพิวเตอร์เครื่องอื่นภายในเครือข่ายฉันเห็น "บริการเครือข่าย" เป็นชื่อผู้ใช้ ฉันลองใช้ตัวเลือกอื่นทั้งหมด แต่ไม่ได้ให้ผู้ใช้ที่เข้าสู่ระบบที่กำลังดูหน้านี้อยู่ ความคิดใด ๆ
Si8

3
หมายเหตุ: มันไม่ชัดเจน แต่ตัวอย่างข้างต้นนำไปใช้ในบริบทของเว็บแอปพลิเคชันที่ทำงานใน IIS ซึ่งหลายคนจะแสดงชื่อของบัญชี windows windows ของเซิร์ฟเวอร์ที่ดำเนินการพูลโปรแกรม ASP.Net หากใช้เป็นโปรแกรมแบบโต้ตอบหรือบริการ windows ส่วนหนึ่งจาก HttpContext จะไม่สามารถใช้งานได้และควรใช้อันอื่นอย่างใดอย่างหนึ่งเพื่อค้นหาบัญชีที่กระบวนการดำเนินการ
Oskar Berggren

4

นี่คือรหัส (แต่ไม่ใช่ใน C #):

Private m_CurUser As String

Public ReadOnly Property CurrentUser As String
    Get
        If String.IsNullOrEmpty(m_CurUser) Then
            Dim who As System.Security.Principal.IIdentity = System.Security.Principal.WindowsIdentity.GetCurrent()

            If who Is Nothing Then
                m_CurUser = Environment.UserDomainName & "\" & Environment.UserName
            Else
                m_CurUser = who.Name
            End If
        End If
        Return m_CurUser
    End Get
End Property

นี่คือรหัส (ตอนนี้ยังอยู่ใน C #):

private string m_CurUser;

public string CurrentUser
{
    get
    {
        if(string.IsNullOrEmpty(m_CurUser))
        {
            var who = System.Security.Principal.WindowsIdentity.GetCurrent();
            if (who == null)
                m_CurUser = System.Environment.UserDomainName + @"\" + System.Environment.UserName;
            else
                m_CurUser = who.Name;
        }
        return m_CurUser;
    }
}

สมมติว่าเป็นคำตอบใน C #
Shivam Bharadwaj

4

ลองนี้

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

ตอนนี้มันดูดีขึ้น


3

รับชื่อผู้ใช้ Windows ปัจจุบัน:

using System;

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

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

เว็บไซต์ของฉันใช้ IIS แต่เมื่อฉันไปที่หน้าจากคอมพิวเตอร์เครื่องอื่นภายในเครือข่ายฉันเห็น "บริการเครือข่าย" เป็นชื่อผู้ใช้ ฉันลองใช้ตัวเลือกอื่นทั้งหมด แต่ไม่ได้ให้ผู้ใช้ที่เข้าสู่ระบบที่กำลังดูหน้านี้อยู่ ความคิดใด ๆ
Si8

2

สำหรับแอพ Windows Forms ที่จะแจกจ่ายให้กับผู้ใช้หลายคนซึ่งหลายคนลงชื่อเข้าใช้ผ่าน VPN ฉันได้ลองหลายวิธีซึ่งทั้งหมดนี้ใช้สำหรับการทดสอบเครื่องในท้องถิ่นของฉัน แต่ไม่ใช่สำหรับผู้อื่น ฉันเจอบทความ Microsoft ที่ดัดแปลงและใช้งานได้

using System;
using System.Security.Principal;

namespace ManageExclusion
{
    public static class UserIdentity

    {
        // concept borrowed from 
        // https://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity(v=vs.110).aspx

        public static string GetUser()
        {
            IntPtr accountToken = WindowsIdentity.GetCurrent().Token;
            WindowsIdentity windowsIdentity = new WindowsIdentity(accountToken);
            return windowsIdentity.Name;
        }
    }
}

1

ในกรณีที่เป็นประโยชน์กับผู้อื่นเมื่อฉันอัปเกรดแอปจาก c # .net 3.5 แอพเป็น Visual Studio 2017 บรรทัดของรหัสUser.Identity.Name.Substring(4);นี้โยนข้อผิดพลาดนี้ " startIndex ไม่สามารถมีขนาดใหญ่กว่าความยาวของสตริง " (ไม่หยุดก่อน)

มีความสุขเมื่อฉันเปลี่ยนเป็นSystem.Security.Principal.WindowsIdentity.GetCurrent().Nameแต่ฉันลงเอยด้วยการใช้Environment.UserName;เพื่อเข้าสู่ระบบผู้ใช้ Windows และไม่มีส่วนโดเมน


ขอบคุณ @doreen คุณพบว่ามีประโยชน์
Shivam Bharadwaj

0

ฉันได้รับคำตอบส่วนใหญ่ที่นี่และไม่มีใครให้ชื่อผู้ใช้ที่ถูกต้องแก่ฉัน

ในกรณีของฉันฉันต้องการรับชื่อผู้ใช้ที่เข้าสู่ระบบในขณะที่เรียกใช้แอปของฉันจากผู้ใช้อื่นเช่นเมื่อกด Shift + คลิกขวาที่ไฟล์และ "เรียกใช้ในฐานะผู้ใช้ที่แตกต่างกัน"

คำตอบที่ฉันพยายามให้ชื่อผู้ใช้ 'อื่น'

บล็อกนี้แสดงวิธีรับชื่อผู้ใช้ที่ลงชื่อเข้าใช้ซึ่งทำงานได้แม้ในสถานการณ์ของฉัน:
https://smbadiwe.github.io/post/track-activities-windows-service/

มันใช้ Wtsapi

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.