Come ottengo il nome e il cognome dell’utente loggato in Windows?

Come posso ottenere il cognome del mio nome con c # nel mio sistema (logging in windows con nome utente e pass di Active Directory)?

È ansible farlo senza andare al AD?

Se stai usando .Net 3.0 o versioni successive, c’è una bella libreria che lo fa praticamente da solo. System.DirectoryServices.AccountManagement ha un object UserPrincipal che ottiene esattamente ciò che stai cercando e non devi fare confusione con LDAP o lasciar cadere le chiamate di sistema per farlo. Ecco tutto ciò che occorre:

Thread.GetDomain().SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); WindowsPrincipal principal = (WindowsPrincipal)Thread.CurrentPrincipal; // or, if you're in Asp.Net with windows authentication you can use: // WindowsPrincipal principal = (WindowsPrincipal)User; using (PrincipalContext pc = new PrincipalContext(ContextType.Domain)) { UserPrincipal up = UserPrincipal.FindByIdentity(pc, principal.Identity.Name); return up.DisplayName; // or return up.GivenName + " " + up.Surname; } 

Nota: non hai effettivamente bisogno dell’elemento principale se hai già il nome utente, ma se stai utilizzando il contesto degli utenti, è altrettanto facile farlo da lì.

C’è un modo più semplice per farlo:

 using System.DirectoryServices.AccountManagement; UserPrincipal userPrincipal = UserPrincipal.Current; String name = userPrincipal.DisplayName; 

inserisci la descrizione dell'immagine qui

Questa soluzione non ha funzionato per me, ma questa funzione ha funzionato alla grande:

 public static string GetUserFullName(string domain, string userName) { DirectoryEntry userEntry = new DirectoryEntry("WinNT://" + domain + "/" + userName + ",User"); return (string)userEntry.Properties["fullname"].Value; } 

Dovresti chiamarlo in questo modo:

 GetUserFullName(Environment.UserDomainName, Environment.UserName); 

(Trovato qui ).

Il problema con la risposta approvata è che se hai una politica di Cognome, Nome in posizione, DisplayName restituisce Smith, John, non John Smith. Esistono due modi per ottenere il modulo corretto, la proprietà userPrincipal.Name contiene “John Smith (jsmith1)” in modo da poter utilizzare questo e solo string.Stringa su “(“. O utilizzare quanto segue:

 private string ConvertUserNameToDisplayName(string currentSentencedByUsername) { string name = ""; using (var context = new PrincipalContext(ContextType.Domain)) { var usr = UserPrincipal.FindByIdentity(context, currentSentencedByUsername); if (usr != null) name = usr.GivenName+" "+usr.Surname; } if (name == "") throw new Exception("The UserId is not present in Active Directory"); return name; } 

Questo darebbe la forma richiesta “John Smith” come richiesto dal poster originale.