Câu trả lời:
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Environment.UserName
sẽ trả về người dùng "RunAs".
MessageBox.Show(Environment.UserName);
đặt điều này trong window_loaded
sự kiện của bạn và chạy nó bằng RunAs ....
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?
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.
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.
System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
ToArray()
sau Split
khi gọiLast()
ToArray()
cần thiết. Bạn sẽ cần using System.Linq;
mặc dù.
Hãy thử tài sản : Environment.UserName
.
string userName = Environment.UserName;
Environment.UsernName
cung 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.
Tài liệu về Môi trường.UserName có vẻ hơi mâu thuẫ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.
VÀ
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.
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ộ).
Request
chỉ hoạt động nếu bạn là một ứng dụng web. Đó là một ví dụ củaSystem.Web.HttpRequest
Sử dụng:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Đó sẽ là tên đăng nhập.
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ế.
String myUserName = Environment.UserName
Điều này sẽ cung cấp cho bạn đầu ra - your_user_name
Sử dụng System.Windows.Forms.SystemInformation.UserName
cho người dùng thực sự đã đăng nhập vì Environment.UserName
vẫn trả về tài khoản đang được sử dụng bởi quy trình hiện tại.
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.AccountManagement
trong dự án của bạn.
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.
Đâ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;
}
}
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
Đố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;
}
}
}
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);
}
}
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().Name
tuy 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.
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
Environment.UserName
như thế nào?