SetPrincipalPolicy Method

AppDomain.SetPrincipalPolicy Method

Specifies how principal and identity objects should be attached to a thread if the thread attempts to bind to a principal while executing in this application domain.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlPrincipal)]
public void SetPrincipalPolicy(
	PrincipalPolicy policy


Type: System.Security.Principal.PrincipalPolicy
One of the PrincipalPolicy values that specifies the type of the principal object to attach to threads.




The operation is attempted on an unloaded application domain.

Setting this value will only be effective if you set it before using the Thread.CurrentPrincipal property. For example, if you set Thread.CurrentPrincipal to a given principal (for example, a generic principal) and then use the SetPrincipalPolicy method to set the PrincipalPolicy to WindowsPrincipal, the current principal will remain the generic principal.

The following example shows the effect on threads of using the SetPrincipalPolicy method to change the principal policy of the application domain. It also shows the effect of using the SetThreadPrincipal method to change the principal that is available for attaching to threads in the application domain.

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

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

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

	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: " +

.NET Framework

Supported in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

Community Additions

© 2015 Microsoft