Làm cách nào để có được tên người dùng hiện tại trong .NET bằng C #?


606

Làm cách nào để có được tên người dùng hiện tại trong .NET bằng C #?

Câu trả lời:


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

96
Điều này khác với Environment.UserNamenhư thế nào?
Sam Harwell

59
@SimonGillbee, điều này là sai, Environment.UserNamesẽ trả về người dùng "RunAs".
Bolu

5
Để xác minh .... MessageBox.Show(Environment.UserName);đặt điều này trong window_loadedsự kiện của bạn và chạy nó bằng RunAs ....
Bolu


4
Điều này trở lại Domain\Username. Làm cách nào tôi có thể nhận được Tên được liên kết với tên người dùng?
SearchForKnowledge

325

Nếu bạn đang ở trong một mạng người dùng, thì tên người dùng sẽ khác:

Environment.UserName
- Will Display format : 'Username'

thay vì

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

Chọn định dạng bạn muốn.


7
Bạn có thể sử dụng Environment.UserDomainName + "\\" + Environment.UserNameđể có được kết quả tương tự như System.Security.Principal.WindowsIdentity.GetCurrent().Name. Bây giờ, sự khác biệt là gì, bạn hỏi ... Tôi không chắc chắn.
Gutblender

9
Tôi cần phải khiến người dùng chạy ứng dụng thay vì người đăng nhập (Môi trường. Tên người dùng không phải là thứ tôi muốn), vì vậy tôi đã làm như sau để loại bỏ tên miền: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
thercix 21/1/2015

Bạn cần thêm ToArray()sau Splitkhi gọiLast()
codenamezero

1
@codenamezero Không ToArray()cần thiết. Bạn sẽ cần using System.Linq;mặc dù.
TheSoftwareJedi

112

Hãy thử tài sản : Environment.UserName.


5
Hoặc,string userName = Environment.UserName;
Donut

10
Thận trọng: như Simon Gillbee đã đề cập trong các nhận xét của câu trả lời được chấp nhận, Environment.UsernNamecung cấp tên tài khoản đã đăng nhập, nhưng WindowsIdentity.GetCurrent().Nameđang trả lại tên tài khoản mà ứng dụng đang chạy.
Gerwald

5
@leo: Thận trọng: Thông tin đó rõ ràng cũng không chính xác, xem câu trả lời của Bolu . :-)
TJ Crowder

KHÔNG sử dụng nó với ASP.NET. docs.microsoft.com nói: "Nếu một ứng dụng ASP.NET chạy trong môi trường phát triển, thuộc tính UserName trả về tên của người dùng hiện tại. Trong một ứng dụng ASP.NET đã xuất bản, thuộc tính này trả về tên của tài khoản nhóm ứng dụng ( chẳng hạn như AppPool mặc định). "
feihoa

28

Tài liệu về Môi trường.UserName có vẻ hơi mâu thuẫn:

Môi trường.UserName Tài sản

Trên cùng một trang có ghi:

Lấy tên người dùng của người hiện đang đăng nhập vào hệ điều hành Windows.

hiển thị tên người dùng của người bắt đầu chuỗi hiện tại

Nếu bạn kiểm tra Môi trường.UserName bằng RunAs, nó sẽ cung cấp cho bạn tên tài khoản người dùng RunAs, chứ không phải người dùng ban đầu đăng nhập vào Windows.


24

Tôi hoàn toàn thứ hai các câu trả lời khác, nhưng tôi muốn làm nổi bật thêm một phương pháp trong đó nói

String UserName = Request.LogonUserIdentity.Name;

Phương thức trên trả về cho tôi tên người dùng theo định dạng: DomainName \ UserName . Ví dụ: CHÂU ÂU \ Tên người dùng

Khác với:

String UserName = Environment.UserName;

Hiển thị ở định dạng: Tên người dùng

Và cuối cùng:

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

đã cho: NT AUTHORITY\IUSR(trong khi chạy ứng dụng trên máy chủ IIS) và DomainName\UserName(trong khi chạy ứng dụng trên máy chủ cục bộ).


Không gian tên nào là bắt buộc để sử dụng "Yêu cầu."?
TK-421

1
@ TK-421 Requestchỉ hoạt động nếu bạn là một ứng dụng web. Đó là một ví dụ củaSystem.Web.HttpRequest
Gerardo Grignoli

22

Sử dụng:

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

Đó sẽ là tên đăng nhập.


11

Bạn cũng có thể muốn thử sử dụng:

Environment.UserName;

Như thế này...:

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

Hy vọng điều này đã được hữu ích.


11

Tôi đã thử một số kết hợp từ các câu trả lời hiện có, nhưng chúng đã cho tôi

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

Tôi đã kết thúc bằng cách sử dụng

string vUserName = User.Identity.Name;

Mà chỉ cho tôi tên người dùng tên miền thực tế.


Thông minh. Tôi cũng chỉ nhận được danh tính nhóm ứng dụng. Nhưng mã của bạn đã giải quyết vấn đề của tôi. Cảm ơn bạn rất nhiều.
SuryaKavitha

Có vẻ như bạn muốn tên người dùng của người dùng đưa ra yêu cầu, tôi đoán là bộ điều khiển MVC hoặc Web API. Điều đó khác với tên người dùng mà quy trình đang chạy theo
Ben Aaronson

@BenAaronson Câu hỏi không nói gì về tên người dùng đang chạy một quy trình. Tôi cần tên người dùng hiện đang đăng nhập và một tìm kiếm đã đưa tôi đến trang này, mã này cuối cùng đã cho tôi những gì tôi cần.
Daniel E.

11
String myUserName = Environment.UserName

Điều này sẽ cung cấp cho bạn đầu ra - your_user_name


9

Sử dụng System.Windows.Forms.SystemInformation.UserNamecho người dùng thực sự đã đăng nhập vì Environment.UserNamevẫn trả về tài khoản đang được sử dụng bởi quy trình hiện tại.


Cảm ơn bạn đã chia sẻ, cũng xem: System.Windows.Forms.SystemIn information.UserDomainName
Ashish Singh

9

Chỉ trong trường hợp ai đó đang tìm kiếm Tên hiển thị của người dùng trái ngược với Tên người dùng , như tôi.

Đây là điều trị:

System.DirectoryService.AccountQuản lý.UserPrincipal.C Hiện.DisplayName

Thêm tài liệu tham khảo System.DirectoryServices.AccountManagementtrong dự án của bạn.


6

Tôi đã thử tất cả các câu trả lời trước đó và tìm thấy câu trả lời trên MSDN sau khi không có câu trả lời nào phù hợp với tôi. Xem 'UserName4' để biết chính xác cho tôi.

Tôi sau Người dùng đã đăng nhập , như được hiển thị bởi:

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

Đây là một chức năng nhỏ tôi đã viết để thử tất cả. Kết quả của tôi là trong các ý kiến ​​sau mỗi hàng.

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;
}

Gọi hàm này trả về tên người dùng đã đăng nhập bằng cách trả lại.

Cập nhật: Tôi muốn chỉ ra rằng việc chạy mã này trên phiên bản máy chủ cục bộ của tôi cho tôi thấy rằng Username4 trả về "" (một chuỗi trống), nhưng UserName3 và UserName5 trả về Người dùng đã đăng nhập. Chỉ cần một cái gì đó để cẩn thận.


Trang web của tôi đang sử dụng IIS nhưng khi tôi truy cập trang từ một máy tính khác trong mạng, tôi vẫn thấy "Dịch vụ mạng" là tên người dùng. Tôi đã thử tất cả các tùy chọn khác nhau nhưng nó không cho tôi người dùng đã đăng nhập đang xem trang. Bất kỳ ý tưởng?
Si8

3
LƯU Ý: Không rõ ràng, nhưng ví dụ trên áp dụng trong ngữ cảnh của một ứng dụng web đang chạy trong IIS, trong đó một vài trong số chúng sẽ hiển thị tên của tài khoản windows máy chủ thực thi nhóm ứng dụng ASP.Net. Nếu chạy như một chương trình tương tác hoặc dịch vụ windows, thì một từ HTTPContext sẽ không khả dụng và một trong những cái khác sẽ được sử dụng để tìm tài khoản mà theo đó quá trình thực thi.
Oskar Berggren

4

Đây là mã (nhưng không có trong 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

Đây là mã (bây giờ cũng trong 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;
    }
}

Giả sử được trả lời trong C #
Shivam Bharadwaj

4

thử cái này

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

bây giờ có vẻ tốt hơn


2

Đối với một ứng dụng Windows Forms được phân phối cho nhiều người dùng, nhiều người đăng nhập qua vpn, tôi đã thử một số cách mà tất cả đều hoạt động để kiểm tra máy cục bộ của tôi nhưng không phải cho người khác. Tôi đã xem qua một bài viết của Microsoft mà tôi thích nghi và làm việc.

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

Lấy tên người dùng Windows hiện tại:

using System;

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

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

Trang web của tôi đang sử dụng IIS nhưng khi tôi truy cập trang từ một máy tính khác trong mạng, tôi vẫn thấy "Dịch vụ mạng" là tên người dùng. Tôi đã thử tất cả các tùy chọn khác nhau nhưng nó không cho tôi người dùng đã đăng nhập đang xem trang. Bất kỳ ý tưởng?
Si8

1

Trong trường hợp nó hữu ích với những người khác, khi tôi nâng cấp một ứng dụng từ ứng dụng c # .net 3.5 lên Visual Studio 2017, dòng mã User.Identity.Name.Substring(4);này đã gây ra lỗi này " start Index không thể lớn hơn độ dài của chuỗi " (trước đây không phải là baulk).

Thật hạnh phúc khi tôi đổi nó thành System.Security.Principal.WindowsIdentity.GetCurrent().Nametuy nhiên cuối cùng tôi đã sử dụng Environment.UserName;để có được người dùng Windows đã đăng nhập và không có phần tên miền.


Cảm ơn @doreen bạn thấy nó hữu ích.
Shivam Bharadwaj

0

Tôi đã xem qua hầu hết các câu trả lời ở đây và không ai trong số họ đưa cho tôi tên người dùng phù hợp.

Trong trường hợp của tôi, tôi muốn lấy tên người dùng đã đăng nhập, trong khi chạy ứng dụng của mình từ một người dùng khác, như khi shift + nhấp chuột phải vào một tệp và "Chạy như một người dùng khác".

Các câu trả lời tôi đã thử cho tôi tên người dùng 'khác'.

Bài đăng trên blog này cung cấp một cách để có được tên người dùng đã đăng nhập, hoạt động ngay cả trong kịch bản của tôi:
https://smbadiwe.github.io/post/track-activities-windows-service/

Nó sử dụng Wtsapi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.