2012-08-28 13 views
8

Wiem, że poniższa funkcja zwraca bieżącą nazwę użytkownika systemu Windows w formacie domain \ nazwa_użytkownika.Jak uzyskać nazwę bieżącego użytkownika systemu Windows w formacie nazwa_użytkownika @ domena?

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

Ale jak mogę uzyskać nazwę użytkownika w formacie [email protected]?

EDIT:

mam reagować w tej edycji, jak każdy, kto odpowiedział posiada taką samą podstawową ideę.

Z tego, co rozumiem, przetwarzanie nazwy z formatu domain\username i tworzenie jej jako [email protected] nie jest bezpieczne ani zalecane. Uważam, że tak jest, ponieważ nie ma gwarancji, że te dwie nazwy domen są takie same w różnych formatach. Na przykład w firmie, w której pracuję, część formatu domain formatu domain\username opiera się na wyodrębnianiu, ale w [email protected] jest to nazwa firmy. Jest to coś, co wymaga wyszukiwania DNS.

Miałem nadzieję, że istnieje interfejs API, który wykonał to wyszukiwanie DNS. Sądzę, że powinienem umieścić te informacje w moim pierwotnym pytaniu. Przepraszam.

+0

Używam C# w mojej aplikacji. –

+0

Właściwość, której szukasz, to główna nazwa użytkownika (UPN). –

+1

Spróbuj wyliczyć WindowsIdentity.GetCurrent(). Żądania, UPN mogą być dołączone. Jeśli nie, użyj P/Invoke, aby wywołać funkcję TranslateName. –

Odpowiedz

3

Cały kod do podjęcia nazwę w formacie Domain\user name i analizować to nie będzie działać w każdej sytuacji. Odpowiedź brzmi: musisz wykonywać połączenia z usługą Active Directory, aby uzyskać główną nazwę użytkownika. Okazuje się, że nie mogę polegać na instalowaniu Active Directory na pulpicie, ponieważ wiele departamentów policji nie instaluje katalogu na swoich laptopach w przypadku, gdy zostanie skradziony, gdy policjanta nie ma w samochodzie. (Porozmawiajmy o odwadze, kradnąc komputer z pojazdu policyjnego!)

Opracowaliśmy własne rozwiązanie dla naszej sytuacji. Przechowujemy nazwy użytkowników w naszej bazie danych w formacie Domain\user name. Po uruchomieniu programu sprawdza, czy bieżąca nazwa użytkownika Windows (w tym samym formacie) znajduje się w bazie danych. Jeśli tak, program używa tego użytkownika jako bieżącego użytkownika i działa. Jeśli bieżący użytkownik systemu Windows nie znajduje się w naszej bazie danych, program powraca do poprzedniego kodu.

W ten sposób użytkownik może zalogować się do urządzenia za pomocą dowolnego formatu dla swojej nazwy użytkownika i uwierzytelnia się w systemie Windows. Nasz program zawsze otrzymuje nazwę użytkownika w tym samym formacie i zawsze sprawdza nazwę użytkownika w tym formacie. System Windows uwierzytelnia użytkownika, a nie nas.

+1

Dla rekordu, Active Directory jest komponentem serwera, więc jest nigdy "zainstalowane na pulpicie". Prawdopodobnie problem polegał na tym, że nie można było polegać na łączach sieciowych z kontrolerami domeny. –

+0

Tak, dokładnie tak. Laptopy są w samochodach policyjnych. Nie wszystkie z nich mają łączność podczas podróży, a te, które działają, mogą być niewiarygodne. –

+0

Więc mówisz nam zasadniczo: "departament policji nie chce, aby nazwy użytkowników były przechowywane lokalnie ze względów bezpieczeństwa, ale ignoruję ten wymóg, aby mój program działał"? – Sam

3

Mógłbyś podzielić nazwę za pomocą \ jako ogranicznik, a następnie odwrócić kolejność tak:

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; 

Ważne jest, aby pamiętać, że podwójny backslash \\ jest wymagane, ponieważ ukośnik jest znakiem specjalnym. Dodajemy drugi ukośnik odwrotny w powyższym przykładzie, aby uciec od znaku specjalnego i użyć go jako zwykłego znaku.

+0

Przepraszam za odpowiedź na dupę - wyglądałeś tak samo jak ja. – Kevin

+0

Bez obaw @Kevin, chociaż musiałem dodać kontrolę warunkową, aby spróbować i od ciebie: -P. – Sam

3
var input = WindowsIdentity.GetCurrent().Name ; 
string[] tab = input.Split('\\'); 
var result = tab[1] + "@" + tab[0]; 
+0

Dwa razy używasz karty [1], która zwróci nazwę użytkownika @ nazwa użytkownika. – Sam

+0

Dziękuję Sam za uwagi, dziękuję –

9

Coś jak to powinno działać ...

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

Coś wzdłuż tych linii.

var nameParts = WindowsIdentity.GetCurrent().Name.Split(@"\"); 
string name = nameParts.Length == 1 
    ? nameParts 
    : string.format("{0}@{1}",nameParts[1],nameParts[0]); 
+0

Twój format kodu został pomieszany. Ponadto, dlaczego twój kod zakłada, że ​​'nameParts.Length == 1' oznacza bezpieczne korzystanie z tablicy, która powinna mieć długość ** co najmniej ** (i prawdopodobnie nie więcej niż) 2. W twoim założeniu może to być bardziej odpowiednie do sprawdzenia UpperBound, tak jak to '(nameParts.GetUpperBound (0) == 1)' – Sam

+0

Twój kod nie będzie się kompilował. nie można przypisać 'nameParts', które jest ciągiem znaków do łańcucha. Również 'string.format' nie istnieje, jest to' string.Format'. Wreszcie, 'Split (@" \ ")' nie jest możliwe, ponieważ Split nie akceptuje ciągu znaków (akceptuje jednak ciąg []) – Sam

+0

dzięki za uwagę –

2

Zastosowanie

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName 

ta zwraca UPN bieżącego użytkownika. Wymaga odniesienia do System.DirectoryServices.AccountManagement.

Powiązane problemy