Ответы:
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, кажется, немного противоречива:
На той же странице написано:
Получает имя пользователя, который в данный момент вошел в операционную систему Windows.
А ТАКЖЕ
отображает имя пользователя, который запустил текущую тему
Если вы протестируете Environment.UserName с помощью RunAs, он даст вам имя учетной записи пользователя RunAs, а не пользователя, который первоначально вошел в Windows.
Я полностью поддерживаю другие ответы, но я хотел бы выделить еще один метод, который говорит
String UserName = Request.LogonUserIdentity.Name;
Приведенный выше метод вернул мне имя пользователя в формате: имя_домена \ имя_пользователя . Например, EUROPE \ UserName
Который отличается от:
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
Это будет имя для входа.
Я попробовал несколько комбинаций из существующих ответов, но они давали мне
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 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;
}
}
}
Получить текущее имя пользователя Windows:
using System;
class Sample
{
public static void Main()
{
Console.WriteLine();
// <-- Keep this information secure! -->
Console.WriteLine("UserName: {0}", Environment.UserName);
}
}
В случае, если это полезно для других, когда я обновил приложение с приложения на 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?