【windows 访问控制】十二、C#实操 主体 System.Security.Principal 案例
案例1、主体(包含用户和组)和标识(用户名)的使用。
PrincipalPolicy枚举:主体类型 分为window主体、未认证的主体和未分配主体
GenericPrincipal、GenericIdentity主体类:自定义普通的主体,该主体是认证的。
WindowsPrincipal、WindowsIdentity主体类:系统主体
Thread.CurrentPrincipal = principal; 设置当前线程的主体
IIdentity 、IPrincipal 主体类的接口
#region 当前线程 Thread t = null; Console.WriteLine("======PrincipalPolicy.WindowsPrincipal==========="); AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); t = new Thread(new ThreadStart(CurrentThreadInfo)); t.Start(); t.Join(); Console.WriteLine("======PrincipalPolicy.UnauthenticatedPrincipal==========="); AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.UnauthenticatedPrincipal); t = new Thread(new ThreadStart( CurrentThreadInfo)); t.Start(); t.Join(); Console.WriteLine("=====PrincipalPolicy.NoPrincipal==========="); AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.NoPrincipal); t = new Thread(new ThreadStart(CurrentThreadInfo)); t.Start(); t.Join(); Console.WriteLine("======自定义一个主体==========="); IIdentity identity = new GenericIdentity("MyIdentity"); IPrincipal principal = new GenericPrincipal(identity, new[] { "studentc", "student" }); //AppDomain.CurrentDomain.SetThreadPrincipal(principal); Thread.CurrentPrincipal = principal; t = new Thread(new ThreadStart(CurrentThreadInfo)); t.Start(); t.Join(); static void CurrentThreadInfo() { IPrincipal currentPricipal= Thread.CurrentPrincipal; if (currentPricipal != null ) { Console.WriteLine($"TYPE:{currentPricipal.Identity.GetType().Name}"); Console.WriteLine($"Name:{currentPricipal.Identity.Name}"); Console.WriteLine($"IsAuthenticated:{currentPricipal.Identity.IsAuthenticated}"); if (currentPricipal.IsInRole("student")) { Console.WriteLine("role:student"); } } else { Console.WriteLine("currentPricipal Is Null"); } }
案例二|、
using System.Reflection; using System.Security.AccessControl; using System.Security.Permissions; using System.Security.Principal; #region 当前进程 //将当前进程设置为安全主体,应用程序默认值为 UnauthenticatedPrincipal。 AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); WindowsPrincipal currentProgramePrincipal = (WindowsPrincipal)Thread.CurrentPrincipal; Type type = typeof(WindowsPrincipal); Console.WriteLine("===============当前进程的主体 标识 ==========================="); //获取当前进程的主体 标识 foreach (var item in type.GetProperties()) { Console.WriteLine($"{item.Name}:{item.GetValue(currentProgramePrincipal).ToString()}"); if (item.Name == "Identity") { WindowsIdentity currentProgrameIdentity = item.GetValue(currentProgramePrincipal) as WindowsIdentity; Type currentIdentity = typeof(WindowsIdentity); foreach (var ite in currentIdentity.GetProperties()) { Console.WriteLine($"{ite.Name}:{ite.GetValue(currentProgrameIdentity)}"); } } } // Console.WriteLine("===============当前进程主体的角色==========================="); //获取当前进程主体的角色 foreach (var rolename in Enum.GetValues(typeof(WindowsBuiltInRole))) { Console.WriteLine($"{rolename.ToString()}:{currentProgramePrincipal.IsInRole((WindowsBuiltInRole)rolename)}"); ; } Console.WriteLine("=================当前用户的标识======================"); //获取当前用户的标识 WindowsIdentity identity = WindowsIdentity.GetCurrent(); Type WindowsIdentityType = typeof(WindowsIdentity); foreach (var item in WindowsIdentityType.GetProperties()) { Console.WriteLine($"{item.Name}:{item.GetValue(identity)}"); } #endregion
编程是个人爱好