Thread.CurrentPrincipal в консольном приложении .NET - PullRequest
14 голосов
/ 12 декабря 2010

Вот тривиальное консольное приложение, которое я запускаю в командной строке:

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);
        }
    }
}

Выходные данные - «GenericPrincipal» и пустая строка в качестве имени пользователя. Почему конструкции времени выполнения GenericPrincipal вместо WindowsPrincipal? Как заставить его создать WindowsPrincipal из токена безопасности запускающего процесса (в моем случае cmd.exe)?

1 Ответ

32 голосов
/ 12 декабря 2010

Вы должны сообщить своему приложению, какую PrincipalPolicy использовать.Вы бы добавили

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);

, чтобы ваш код выглядел следующим образом:

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);
        }
    }
}

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

...