2010-07-04 4 views
36

Dans .NET, il semble y avoir plusieurs façons d'obtenir le nom d'utilisateur Windows actuel. Dont trois sont:Obtenir le nom d'utilisateur Windows - différentes méthodes

string name = WindowsIdentity.GetCurrent().Name; 

ou

string name = Thread.CurrentPrincipal.Identity.Name; 

ou

string name = Environment.UserName; 

Quelle est la différence, et pourquoi choisir une méthode sur l'autre? Y a-t-il d'autres moyens?

+0

Qu'en est 'System.Threading.Thread.CurrentPrincipal.Identity.Name' ?? –

+1

@marc_s: Ajout de votre suggestion. – Andy

Répondre

31

Environment.UserName appelle GetUserName dans advapi32.dll. Cela signifie que si vous personnifiez un autre utilisateur, cette propriété le reflète. Thread.CurrentPrincipal a un setter et peut être modifié par programme. (Ce n'est pas une usurpation d'identité btw.)

WindowsIdentity est votre Windows identité, le cas échéant. Cela ne reflète pas nécessairement l'utilisateur, pensez ASP.NET avec FormsAuthentication. Ensuite, WindowsIdentity sera le service NT, mais FormsIdentity sera l'utilisateur connecté. Il y a aussi un PassportIdentity, et vous pouvez créer vos propres choses pour compliquer davantage les choses.

+0

Est-ce que "usurpation d'identité" signifie que vous exécutez quelque chose via "Exécuter en tant que ..."? – Andy

+0

@Andy, j'ai déjà essayé. Mais la classe WindowsIdentity a une méthode Impersonate(), et je suis assez sûr que _it_ fera l'emprunt d'identité. ;) – sisve

0

Je crois que la propriété a été placée à plusieurs endroits afin qu'il soit plus facile à trouver pour le programmeur. Il y a seulement un utilisateur connecté, et seulement un nom respectif.

+0

Donc par implication, toutes ces méthodes sont interchangeables? – Andy

+0

Je crois que oui. Je ne m'attendrais à aucune différence subtile ici. –

1

Vous avez demandé d'autres moyens.

Bien sûr, vous pouvez toujours utiliser l'API Windows native: GetUserName.

0

Les trois méthodes sont décrites comme suit:

HttpContext = HttpContext.Current.User, qui retourne un objet IPrincipal qui contient des informations de sécurité pour la demande Web en cours. C'est le client Web authentifié.

WindowsIdentity = WindowsIdentity.GetCurrent(), qui renvoie l'identité du contexte de sécurité du thread Win32 en cours d'exécution.

Thread = Thread.CurrentPrincipal qui renvoie le principal du thread .NET en cours d'exécution qui se trouve au-dessus du thread Win32.

Et ils changent en résultat en fonction de votre configuration IIS comme expliqué dans cet article: http://msdn.microsoft.com/en-us/library/aa302377.aspx

Questions connexes