Відповіді:
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 Properties
На цій же сторінці написано:
Отримує ім’я користувача особи, яка зараз увійшла в операційну систему Windows.
І
відображає ім'я користувача людини, яка розпочала поточну нитку
Якщо ви протестуєте Environment.UserName за допомогою RunAs, він дасть вам ім'я облікового запису користувача RunAs, а не той користувач, який спочатку увійшов у Windows.
Я повністю друкую інші відповіді, але я хотів би виділити ще один метод, який говорить
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
(під час запуску програми на локальному сервері).
Request
працює, лише якщо ви веб-додаток. Це екземплярSystem.Web.HttpRequest
Використання:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Це буде ім'я для входу.
Я спробував кілька комбінацій із існуючих відповідей, але вони мені давали
DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool
Я закінчив використовувати
string vUserName = User.Identity.Name;
Що дало мені лише власне ім’я користувача домену.
String myUserName = Environment.UserName
Це дасть вам вихід - ваше_користувач
Використовуйте System.Windows.Forms.SystemInformation.UserName
для фактично зареєстрованого користувача, оскільки він як і Environment.UserName
раніше повертає обліковий запис, використовуваний у поточному процесі.
Я спробував усі попередні відповіді і знайшов відповідь на MSDN після того, як жоден із них не працював на мене. Дивіться "UserName4" для правильного для мене.
Я після входу Користувача , як показує:
<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 повертається "" (порожня рядок), але UserName3 та UserName5 повертають зареєстрований Користувач. Просто чого слід остерігатися.
Ось код (але не в 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 та без частини домену.
Я переглянув більшість відповідей тут, і жодна з них не дала мені правильного імені користувача.
У моєму випадку я хотів отримати ім’я користувача, який увійшов під час роботи свого додатка від іншого користувача, як, наприклад, при зміні + клацання правою кнопкою миші на файлі та "Запустити як інший користувач".
Відповіді, які я спробував, дали мені "інше" ім'я користувача.
Ця публікація в блозі пропонує спосіб отримати ім’я користувача, який увійшов, що працює навіть у моєму сценарії:
https://smbadiwe.github.io/post/track-activities-windows-service/
Тут використовується Wtsapi
Environment.UserName
?