AppDomain.SetPrincipalPolicy(PrincipalPolicy) Метод

Определение

Указывает, как участники и объекты удостоверений должны присоединяться к потоку, если поток пытается выполнить привязку к участнику при выполнении в этом домене приложения.

public:
 void SetPrincipalPolicy(System::Security::Principal::PrincipalPolicy policy);
public:
 virtual void SetPrincipalPolicy(System::Security::Principal::PrincipalPolicy policy);
public void SetPrincipalPolicy (System.Security.Principal.PrincipalPolicy policy);
member this.SetPrincipalPolicy : System.Security.Principal.PrincipalPolicy -> unit
abstract member SetPrincipalPolicy : System.Security.Principal.PrincipalPolicy -> unit
override this.SetPrincipalPolicy : System.Security.Principal.PrincipalPolicy -> unit
Public Sub SetPrincipalPolicy (policy As PrincipalPolicy)

Параметры

policy
PrincipalPolicy

Одно из значений PrincipalPolicy, определяющее тип объекта-участника, который необходимо подключить к потоку.

Реализации

Исключения

Предпринята попытка выполнения операции с выгруженным доменом приложения.

Примеры

В следующем примере показано влияние на потоки использования SetPrincipalPolicy метода для изменения основной политики домена приложения. Здесь также показан эффект использования SetThreadPrincipal метода для изменения субъекта, доступного для присоединения к потокам в домене приложения.

using namespace System;
using namespace System::Security::Principal;
using namespace System::Threading;
ref class ADPrincipal
{
public:
   static void PrintPrincipalInformation()
   {
      IPrincipal^ curPrincipal = Thread::CurrentPrincipal;
      if ( curPrincipal != nullptr )
      {
         Console::WriteLine( "Type: {0}", curPrincipal->GetType()->Name );
         Console::WriteLine( "Name: {0}", curPrincipal->Identity->Name );
         Console::WriteLine( "Authenticated: {0}", curPrincipal->Identity->IsAuthenticated );
         Console::WriteLine();
      }
   }

};

int main()
{
   
   // Create a new thread with a generic principal.
   Thread^ t = gcnew Thread( gcnew ThreadStart( ADPrincipal::PrintPrincipalInformation ) );
   t->Start();
   t->Join();
   
   // Set the principal policy to WindowsPrincipal.
   AppDomain^ currentDomain = AppDomain::CurrentDomain;
   currentDomain->SetPrincipalPolicy( PrincipalPolicy::WindowsPrincipal );
   
   // The new thread will have a Windows principal representing the
   // current user.
   t = gcnew Thread( gcnew ThreadStart( ADPrincipal::PrintPrincipalInformation ) );
   t->Start();
   t->Join();
   
   // Create a principal to use for new threads.
   IIdentity^ identity = gcnew GenericIdentity( "NewUser" );
   IPrincipal^ principal = gcnew GenericPrincipal( identity,nullptr );
   currentDomain->SetThreadPrincipal( principal );
   
   // Create a new thread with the principal created above.
   t = gcnew Thread( gcnew ThreadStart( ADPrincipal::PrintPrincipalInformation ) );
   t->Start();
   t->Join();
   
   // Wait for user input before terminating.
   Console::ReadLine();
}
using System;
using System.Security.Principal;
using System.Threading;

class ADPrincipal
{
    static void Main(string[] args)
    {
        // Create a new thread with a generic principal.
        Thread t = new Thread(new ThreadStart(PrintPrincipalInformation));
        t.Start();
        t.Join();

        // Set the principal policy to WindowsPrincipal.
        AppDomain currentDomain = AppDomain.CurrentDomain;
        currentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
            
        // The new thread will have a Windows principal representing the
        // current user.
        t = new Thread(new ThreadStart(PrintPrincipalInformation));
        t.Start();
        t.Join();

        // Create a principal to use for new threads.
        IIdentity identity = new GenericIdentity("NewUser");
        IPrincipal principal = new GenericPrincipal(identity, null);
        currentDomain.SetThreadPrincipal(principal);
            
        // Create a new thread with the principal created above.
        t = new Thread(new ThreadStart(PrintPrincipalInformation));
        t.Start();
        t.Join();
        
        // Wait for user input before terminating.
        Console.ReadLine();
    }

    static void PrintPrincipalInformation()
    {
        IPrincipal curPrincipal = Thread.CurrentPrincipal;
        if(curPrincipal != null)
        {
            Console.WriteLine("Type: " + curPrincipal.GetType().Name);
            Console.WriteLine("Name: " + curPrincipal.Identity.Name);
            Console.WriteLine("Authenticated: " +
                curPrincipal.Identity.IsAuthenticated);
            Console.WriteLine();
        }
    }
}
open System
open System.Security.Principal
open System.Threading

let printPrincipalInformation () =
    let curPrincipal = Thread.CurrentPrincipal
    if curPrincipal <> null then
        printfn $"Type: {curPrincipal.GetType().Name}"
        printfn $"Name: {curPrincipal.Identity.Name}"
        printfn $"Authenticated: {curPrincipal.Identity.IsAuthenticated}\n"

[<EntryPoint>]
let main _ =
    // Create a new thread with a generic principal.
    let t = Thread(ThreadStart printPrincipalInformation)
    t.Start()
    t.Join()

    // Set the principal policy to WindowsPrincipal.
    let currentDomain = AppDomain.CurrentDomain
    currentDomain.SetPrincipalPolicy PrincipalPolicy.WindowsPrincipal
        
    // The new thread will have a Windows principal representing the
    // current user.
    let t = Thread(ThreadStart printPrincipalInformation)
    t.Start()
    t.Join()

    // Create a principal to use for new threads.
    let identity = GenericIdentity "NewUser"
    let principal = GenericPrincipal(identity, null)
    currentDomain.SetThreadPrincipal principal
        
    // Create a new thread with the principal created above.
    let t = Thread(ThreadStart printPrincipalInformation)
    t.Start()
    t.Join()

    // Wait for user input before terminating.
    Console.ReadLine() |> ignore
    0
Imports System.Security.Principal
Imports System.Threading

Class ADPrincipal
    Overloads Shared Sub Main(ByVal args() As String)
        ' Create a new thread with a generic principal.
        Dim t As New Thread(New ThreadStart(AddressOf PrintPrincipalInformation))
        t.Start()
        t.Join()

        ' Set the principal policy to WindowsPrincipal.
        Dim currentDomain As AppDomain = AppDomain.CurrentDomain
        currentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)

        ' The new thread will have a Windows principal representing the
        ' current user.
        t = New Thread(New ThreadStart(AddressOf PrintPrincipalInformation))
        t.Start()
        t.Join()

        ' Create a principal to use for new threads.
        Dim identity = New GenericIdentity("NewUser")
        Dim principal = New GenericPrincipal(identity, Nothing)
        currentDomain.SetThreadPrincipal(principal)

        ' Create a new thread with the principal created above.
        t = New Thread(New ThreadStart(AddressOf PrintPrincipalInformation))
        t.Start()
        t.Join()

        ' Wait for user input before terminating.
        Console.ReadLine()
    End Sub


    Shared Sub PrintPrincipalInformation()
        Dim curPrincipal As IPrincipal = Thread.CurrentPrincipal
        If Not (curPrincipal Is Nothing) Then
            Console.WriteLine("Type: " & CType(curPrincipal, Object).GetType().Name)
            Console.WriteLine("Name: " & curPrincipal.Identity.Name)
            Console.WriteLine("Authenticated: " & curPrincipal.Identity.IsAuthenticated)
            Console.WriteLine()

        End If
    End Sub
End Class

Комментарии

Задание этого значения будет эффективным только в том случае, если оно задано перед использованием Thread.CurrentPrincipal свойства . Например, если задать Thread.CurrentPrincipal для заданного субъекта (например, универсального субъекта), а затем использовать SetPrincipalPolicy метод , чтобы задать значение PrincipalPolicyWindowsPrincipal, текущий субъект останется универсальным субъектом.

Применяется к