Как получить текущее имя пользователя Windows в формате username@domain?

Я знаю, что следующая функция возвращает имя текущего пользователя Windows в формате домен\имя пользователя.

Convert.ToString( WindowsIdentity.GetCurrent().Name );

Но как мне получить имя пользователя в формате username@domain?

РЕДАКТИРОВАТЬ:

Я отвечаю в этом редактировании, поскольку все, кто ответил, имеют одну и ту же основную идею.

Из того, что мне дали понять, разбор имени из формата domain\username и построение его как username@domain небезопасен и не рекомендуется. Я считаю, что это так, потому что нет никакой гарантии, что два доменных имени будут одинаковыми в разных форматах. Например, в компании, где я работаю, часть domain формата domain\username основана на отделе, а в username@domain это название компании. Это то, что требует поиска DNS.

Я надеялся, что существует API, который выполняет этот поиск DNS. Думаю, я должен был поместить эту информацию в свой первоначальный вопрос. Извиняюсь.


person Tony Vitabile    schedule 28.08.2012    source источник
comment
Я использую С# в своем приложении.   -  person Tony Vitabile    schedule 28.08.2012
comment
Свойство, которое вы ищете, — это имя участника-пользователя (UPN).   -  person Harry Johnston    schedule 29.08.2012
comment
Попробуйте перечислить WindowsIdentity.GetCurrent().Claims, может быть включено имя участника-пользователя. Если нет, используйте P/Invoke для вызова функции TranslateName.   -  person Harry Johnston    schedule 29.08.2012
comment
Я не могу найти свойство WindowsIdentity.GetCurrent().Claims.   -  person Tony Vitabile    schedule 29.08.2012
comment
@TonyVitabile, ты можешь попробовать WindowsIdentity.GetCurrent().Name   -  person Cullub    schedule 26.09.2014
comment
Вы можете попробовать использовать Environment.UserDomainName и Environment.UserName   -  person Pavel Cermak    schedule 29.09.2014


Ответы (6)


Что-то вроде этого должно работать...

string[] temp = Convert.ToString(WindowsIdentity.GetCurrent().Name).Split('\\');
string userName = temp[1] + "@" + temp[0];
person Kevin    schedule 28.08.2012

Весь код для получения имени в формате Domain\user name и его разбора будет работать не во всех ситуациях. Ответ заключается в том, что вы должны звонить в Active Directory, чтобы получить основное имя пользователя. Получается, что я не могу полагаться на то, что Active Directory будет установлен на рабочем столе, так как многие полицейские управления не устанавливают каталог на свои ноутбуки на случай, если его украдут, пока полицейского нет в машине. (Поговорим о смелости, краже компьютера из полицейской машины!)

Мы придумали собственное решение для нашей ситуации. Мы храним имена пользователей в нашей базе данных в формате Domain\user name. Когда программа запускается, она проверяет, есть ли текущее имя пользователя Windows (в том же формате) в базе данных. Если это так, программа использует этого пользователя как текущего пользователя и запускается. Если текущего пользователя Windows нет в нашей базе данных, программа возвращается к нашему предыдущему коду.

Таким образом, пользователь может войти в систему, используя любой формат имени пользователя, и пройти аутентификацию в Windows. Наша программа всегда получает имя пользователя в одном и том же формате и всегда проверяет имя пользователя в этом формате. Windows аутентифицирует пользователя, а не нас.

person Tony Vitabile    schedule 11.09.2012
comment
Напомним, что Active Directory — это серверный компонент, поэтому он никогда не устанавливается на рабочий стол. Вероятно, проблема заключалась в том, что вы не могли полагаться на сетевое подключение к контроллерам домена. - person Harry Johnston; 12.09.2012
comment
Да, это точно. Ноутбуки в полицейских машинах. Не все из них имеют какое-либо подключение в дороге, а те, которые есть, могут быть ненадежными. - person Tony Vitabile; 13.09.2012
comment
Итак, вы говорите нам в основном: the police department doesn't want usernames stored locally for security reasons, but I'm ignoring that requirement to make my program work? - person StoriKnow; 05.10.2012
comment
Нет, это неправильно. Как уже отмечалось, активный каталог работает на сервере как служба. Компьютер находится в автомобиле и может не иметь надежного соединения с сервером Active Directory, даже если на нем установлена ​​сотовая карта. Все, что у меня есть, это список пользователей, которые имеют доступ к приложению. Я не знаю ни их паролей, ни даже их адресов электронной почты, только их имена пользователей и их привилегии. Это единственный способ убедиться, что пользователь, вошедший в систему, имеет доступ ко всему. - person Tony Vitabile; 05.10.2012

Использовать

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName

Это возвращает имя участника-пользователя текущего пользователя. Требуется ссылка на System.DirectoryServices.AccountManagement.

person Simon Giles    schedule 23.09.2015

Вы можете разделить имя, используя \ в качестве разделителя, а затем изменить порядок следующим образом:

string[] splitName = WindowsIdentity.GetCurrent().Name.Split('\\');
//check that splitName contains at least 2 values before using
string name = (splitName.Length > 1) ? splitName[1] + "@" + splitName[0] : null;

Важно отметить, что двойная обратная косая черта \\ требуется, поскольку обратная косая черта является специальным символом. Мы добавляем вторую обратную косую черту в приведенном выше примере, чтобы избежать специального символа и использовать его как обычный символ.

person StoriKnow    schedule 28.08.2012
comment
Извините за ответ-обманку - вы, по-видимому, печатали его в то же время, что и я. - person Kevin; 29.08.2012
comment
Не беспокойтесь @Kevin, хотя мне пришлось добавить условную проверку, чтобы попытаться превзойти вас :-P. - person StoriKnow; 29.08.2012

Что-то в этом духе.

var nameParts = WindowsIdentity.GetCurrent().Name.Split(@"\");
string name = nameParts.Length == 1 
    ? nameParts  
    : string.format("{0}@{1}",nameParts[1],nameParts[0]);
person Evangelos Skianis    schedule 28.08.2012
comment
Ваш формат кода перепутался. Кроме того, почему ваш код предполагает, что nameParts.Length == 1 означает безопасное использование массива, который должен иметь длину не менее (и, вероятно, не более) 2. В вашем предположении может быть более подходящим проверить Верхняя граница вот так (nameParts.GetUpperBound(0) == 1) - person StoriKnow; 29.08.2012
comment
Ваш код не будет компилироваться. вы не можете назначить nameParts, который является строковым массивом, строке. Кроме того, string.format не существует, это string.Format. Наконец, Split(@"\") невозможно, так как Split не принимает строку (однако он принимает строку []) - person StoriKnow; 29.08.2012

person    schedule
comment
Вы используете tab[1] дважды, что вернет username@username. - person StoriKnow; 29.08.2012