2010-07-04 4 views
36

In .NET ci sono diversi modi per ottenere il nome utente corrente di Windows. Tre dei quali sono:Ottieni il nome utente di Windows - diversi metodi

string name = WindowsIdentity.GetCurrent().Name; 

o

string name = Thread.CurrentPrincipal.Identity.Name; 

o

string name = Environment.UserName; 

Qual è la differenza, e perché scegliere un metodo sopra l'altro? Ci sono altri modi?

+0

Che dire 'System.Threading.Thread.CurrentPrincipal.Identity.Name' ?? –

+1

@marc_s: aggiunto il tuo suggerimento. – Andy

risposta

31

Environment.UserName chiama GetUserName in advapi32.dll. Ciò significa che se stai impersonando un altro utente, questa proprietà lo rifletterà.

Thread.CurrentPrincipal ha un setter e può essere modificato a livello di codice. (Questa non è una rappresentazione btw.)

WindowsIdentity è la tua attuale windows identità, se presente. Non rifletterà necessariamente l'utente, pensa ASP.NET con FormsAuthentication. Quindi WindowsIdentity sarà il servizio NT, ma FormsIdentity sarà l'utente che ha effettuato l'accesso. C'è anche un PassportIdentity e puoi costruire le tue cose per complicare ulteriormente le cose.

+0

"Imitazione" significa se si esegue qualcosa tramite "Esegui come ..."? – Andy

+0

@Andy, non l'ho provato. Ma la classe WindowsIdentity ha un metodo Impersonate(), e sono abbastanza sicuro che _it_ farà la rappresentazione. ;) – sisve

0

Credo che la proprietà sia stata collocata in diversi punti in modo che fosse più semplice da trovare per il programmatore. C'è solo un utente registrato e un solo nome rispettivo.

+0

Quindi, implicitamente, tutti questi metodi sono intercambiabili? – Andy

+0

Credo di si. Non mi aspetterei differenze sottili qui. –

1

Hai chiesto modi alternativi.

Ovviamente, è sempre possibile utilizzare l'API di Windows nativa: GetUserName.

0

I tre metodi sono descritti come segue:

HttpContext = HttpContext.Current.User, che restituisce un oggetto IPrincipal che contiene le informazioni di sicurezza per la richiesta Web corrente. Questo è il client Web autenticato.

WindowsIdentity = WindowsIdentity.GetCurrent(), che restituisce l'identità del contesto di sicurezza del thread Win32 attualmente in esecuzione.

Thread = Thread.CurrentPrincipal che restituisce il principal del thread .NET attualmente in esecuzione che si trova sulla parte superiore del thread Win32.

e cambiano in conseguenza a seconda della configurazione di IIS, come spiegato in questo articolo: http://msdn.microsoft.com/en-us/library/aa302377.aspx