Я пытаюсь получить имя пользователя Windows, вошедшего в систему в данный момент, в формате «Джон Доу». Я не уверен, существует ли для этого общепринятый термин, но подумайте, это имя, которое вы видите, когда открываете меню "Пуск", а не строку, которую вы пишете для входа в систему.
Я начал с просмотра ответов на этот вопрос, но, похоже, они полностью озабочены поиском имени пользователя. Сначала я рассматривал такой обходной путь:
Код: Выделить всё
string GetName(string userName) => string.Join(' ', Regex.Split(userName, @"[A-Z]"));
string name = GetName(Environment.UserName);
Но понял, что это не совсем хорошее универсальное решение, поскольку имена пользователей не имеют формата ^[A-Z]([^A-Z]*)[ A-Z]([^A-Z]*)$ будет форматироваться неправильно или вообще не будет форматироваться.
Код: Выделить всё
GetName("doejohn") // "doejohn"
GetName("RonaldMcDonald") // "Ronald Mc Donald"
Моя следующая остановка была здесь, чтобы посмотреть, смогу ли я найти способ получить значение напрямую из системы, а не вычислять его самостоятельно, и я продвинулся еще дальше: System.DirectoryServices.AccountManagement Теоретически .UserPrincipal.Current.DisplayName кажется именно тем, что мне нужно, и хотя это может работать, а может и не работать в других сценариях, в моем он, похоже, не работает из-за того, что я являюсь частью группы.< /p>
Код: Выделить всё
var name1 = System.Security.Principal.WindowsIdentity.GetCurrent().Name; // "AzureAD\JohnDoe"
var name2 = UserPrincipal.Current.DisplayName;
// System.Exception:
// Unable to cast object of type 'System.DirectoryServices.AccountManagement.GroupPrincipal'
// to type 'System.DirectoryServices.AccountManagement.UserPrincipal'.
Моя лучшая идея сейчас, хотя я и зашел в тупик, — использовать GroupPrincipal, если UserPrincipal не работает, но я открыт для других решений, если это неправильно. или против лучших практик.
Подробнее здесь:
https://stackoverflow.com/questions/787 ... is-part-of