2010-12-12 32 views
13

Voici une application console trivial que je lance dans l'invite de commande:Thread.CurrentPrincipal en application console .NET

using System; 
using System.Threading; 
namespace Test 
{ 
    internal class Runner 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      Console.WriteLine(Thread.CurrentPrincipal.GetType().Name); 
      Console.WriteLine(Thread.CurrentPrincipal.Identity.Name); 
     } 
    } 
} 

La sortie est 'GenericPrincipal' et chaîne vide comme nom d'identité. Pourquoi le run-time construit GenericPrincipal au lieu de WindowsPrincipal? Comment puis-je le forcer à construire WindowsPrincipal à partir du jeton de sécurité du processus de démarrage (cmd.exe dans mon cas)?

+0

Qu'est-ce que vous obtenez lorsque vous interrogez 'actuelle WindowsIdentity = WindowsIdentity.GetCurrent();' ?? –

+1

Il renvoie mon identité Windows actuelle comme je l'attends. Alors est-ce ma responsabilité de construire et d'attacher le principal? Ou existe-t-il un moyen de le spécifier dans le fichier de configuration, tout comme le paramètre de sécurité dans ASP.NET ou l'application WCF? – UserControl

Répondre

29

Vous devez indiquer à votre application quelle PrincipalPolicy utiliser. Vous ajouteriez

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 

faire votre look de code comme:

using System; 
using System.Threading; 
using System.Security.Principal; 

namespace Test 
{ 
    internal class Runner 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 
      Console.WriteLine(Thread.CurrentPrincipal.GetType().Name); 
      Console.WriteLine(Thread.CurrentPrincipal.Identity.Name); 
     } 
    } 
} 

Voir http://msdn.microsoft.com/en-us/library/system.appdomain.setprincipalpolicy.aspx