ฉันจะรับชื่อผู้ใช้ปัจจุบันใน. NET โดยใช้ C # ได้อย่างไร
ฉันจะรับชื่อผู้ใช้ปัจจุบันใน. NET โดยใช้ C # ได้อย่างไร
คำตอบ:
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Environment.UserName
จะส่งคืนผู้ใช้ "RunAs"
MessageBox.Show(Environment.UserName);
ใส่สิ่งนี้ไว้ในwindow_loaded
กิจกรรมของคุณและรันโดยใช้ RunAs ....
Domain\Username
นี้ ฉันจะรับชื่อที่เชื่อมโยงกับชื่อผู้ใช้ได้อย่างไร
หากคุณอยู่ในเครือข่ายผู้ใช้ชื่อผู้ใช้จะแตกต่างกัน:
Environment.UserName
- Will Display format : 'Username'
ค่อนข้างมากกว่า
System.Security.Principal.WindowsIdentity.GetCurrent().Name
- Will Display format : 'NetworkName\Username'
เลือกรูปแบบที่คุณต้องการ
Environment.UserDomainName + "\\" + Environment.UserName
System.Security.Principal.WindowsIdentity.GetCurrent().Name
ตอนนี้อะไรคือสิ่งที่คุณถาม ... ฉันไม่แน่ใจ
System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
ToArray()
หลังจากSplit
ก่อนโทรLast()
ToArray()
จำเป็น คุณจะต้องusing System.Linq;
แม้ว่า
Environment.UserName
ลองสถานที่:
string userName = Environment.UserName;
Environment.UsernName
ให้ชื่อบัญชีที่ลงชื่อเข้าใช้ แต่WindowsIdentity.GetCurrent().Name
กลับชื่อบัญชีที่แอปพลิเคชันทำงานอยู่
เอกสารสำหรับ Environment.UserName ดูเหมือนจะขัดแย้งกันเล็กน้อย:
คุณสมบัติ Environment.UserName
ในหน้าเดียวกันมันบอกว่า:
รับชื่อผู้ใช้ของบุคคลที่เข้าสู่ระบบปฏิบัติการ Windows ในปัจจุบัน
และ
แสดงชื่อผู้ใช้ของบุคคลที่เริ่มต้นเธรดปัจจุบัน
หากคุณทดสอบ Environment.UserName โดยใช้ RunAs จะทำให้ชื่อบัญชีผู้ใช้ RunAs ไม่ใช่ชื่อผู้ใช้ที่ล็อกออนเข้าสู่ Windows
ฉันสองคำตอบอื่น ๆ โดยสิ้นเชิง แต่ฉันต้องการที่จะเน้นวิธีการอีกหนึ่งที่บอกว่า
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
(ในขณะที่เรียกใช้แอปพลิเคชันบนเซิร์ฟเวอร์ภายใน)
Request
ใช้งานได้เฉพาะถ้าคุณเป็นเว็บแอปพลิเคชัน มันเป็นตัวอย่างของSystem.Web.HttpRequest
ใช้:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
นั่นจะเป็นชื่อเข้าสู่ระบบ
คุณอาจต้องการลองใช้:
Environment.UserName;
แบบนี้...:
string j = "Your WindowsXP Account Name is: " + Environment.UserName;
หวังว่านี่จะเป็นประโยชน์
ฉันลองชุดค่าผสมหลายตัวจากคำตอบที่มีอยู่ แต่พวกเขาก็ให้ฉัน
DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool
ฉันลงเอยด้วยการใช้
string vUserName = User.Identity.Name;
ซึ่งให้ชื่อผู้ใช้โดเมนจริงกับฉันเท่านั้น
String myUserName = Environment.UserName
สิ่งนี้จะให้ผลลัพธ์กับคุณ - your_user_name
ใช้System.Windows.Forms.SystemInformation.UserName
สำหรับผู้ใช้ที่เข้าสู่ระบบตามจริงในขณะที่ Environment.UserName
ยังคงส่งคืนบัญชีที่ถูกใช้โดยกระบวนการปัจจุบัน
ในกรณีที่มีคนค้นหาชื่อที่แสดงของผู้ใช้ซึ่งตรงข้ามกับชื่อผู้ใช้เช่นฉัน
นี่คือการรักษา:
System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName
เพิ่มการอ้างอิงถึงSystem.DirectoryServices.AccountManagement
ในโครงการของคุณ
ฉันได้ลองคำตอบก่อนหน้านี้ทั้งหมดแล้วและพบคำตอบใน 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 ส่งคืนผู้ใช้ที่เข้าสู่ระบบ สิ่งที่ต้องระวัง
นี่คือรหัส (แต่ไม่ใช่ใน 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;
}
}
ลองนี้
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];
ตอนนี้มันดูดีขึ้น
รับชื่อผู้ใช้ Windows ปัจจุบัน:
using System;
class Sample
{
public static void Main()
{
Console.WriteLine();
// <-- Keep this information secure! -->
Console.WriteLine("UserName: {0}", Environment.UserName);
}
}
สำหรับแอพ 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;
}
}
}
ในกรณีที่เป็นประโยชน์กับผู้อื่นเมื่อฉันอัปเกรดแอปจาก c # .net 3.5 แอพเป็น Visual Studio 2017 บรรทัดของรหัสUser.Identity.Name.Substring(4);
นี้โยนข้อผิดพลาดนี้ " startIndex ไม่สามารถมีขนาดใหญ่กว่าความยาวของสตริง " (ไม่หยุดก่อน)
มีความสุขเมื่อฉันเปลี่ยนเป็นSystem.Security.Principal.WindowsIdentity.GetCurrent().Name
แต่ฉันลงเอยด้วยการใช้Environment.UserName;
เพื่อเข้าสู่ระบบผู้ใช้ Windows และไม่มีส่วนโดเมน
ฉันได้รับคำตอบส่วนใหญ่ที่นี่และไม่มีใครให้ชื่อผู้ใช้ที่ถูกต้องแก่ฉัน
ในกรณีของฉันฉันต้องการรับชื่อผู้ใช้ที่เข้าสู่ระบบในขณะที่เรียกใช้แอปของฉันจากผู้ใช้อื่นเช่นเมื่อกด Shift + คลิกขวาที่ไฟล์และ "เรียกใช้ในฐานะผู้ใช้ที่แตกต่างกัน"
คำตอบที่ฉันพยายามให้ชื่อผู้ใช้ 'อื่น'
บล็อกนี้แสดงวิธีรับชื่อผู้ใช้ที่ลงชื่อเข้าใช้ซึ่งทำงานได้แม้ในสถานการณ์ของฉัน:
https://smbadiwe.github.io/post/track-activities-windows-service/
มันใช้ Wtsapi
Environment.UserName
อย่างไร