.NET控制台应用程序中的Thread.CurrentPrincipal

.NET控制台应用程序中的Thread.CurrentPrincipal,.net,security,windows-7,.net-4.0,principal,.net,Security,Windows 7,.net 4.0,Principal,下面是我在命令提示符下运行的一个普通控制台应用程序: using System; using System.Threading; namespace Test { internal class Runner { [STAThread] static void Main(string[] args) { Console.WriteLine(Thread.CurrentPrincipal.GetType().Na

下面是我在命令提示符下运行的一个普通控制台应用程序:

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
?如何强制它从启动进程的安全令牌(在我的情况下是cmd.exe)构造
WindowsPrincipal

你必须告诉你的应用程序要使用什么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);
        }
    }
}

请参见

当您查询
WindowsIdentity current=WindowsIdentity.GetCurrent()时,您会得到什么?它按预期返回我当前的windows标识。那么,我是否有责任构建和附加委托人?或者有一种方法可以在配置文件中指定它,就像ASP.NET或WCF应用程序中的安全设置一样?