案例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

【windows 访问控制】十二、C#实操 主体 System.Security.Principal 案例的更多相关文章

  1. 【windows 访问控制】十一、C# 实操 对象 System.Security.AccessControl 命名空间

    AccessControl 命名空间 结构图 解说: DirectorySecurity=目录ACLFileSecurity=文件ACLFileSystemAuditRule=目录和文件中SACL中的 ...

  2. Win32 Windows编程 十二

    一.对话框 1.对话框的分类 2.对话框的基本使用方式 3.对话框资源 4.有模式对话框的使用 5. 无模式对话框的使用 5.1 加入对话框资源 5.2 定义窗体处理函数 BOOL CALLBACK ...

  3. 【windows 访问控制】二、安全描述符(Security Descriptors,SD)

    安全描述符(Security Descriptors,SD) 定义 安全描述符是与安全对象的安全信息,它含有这个对象所有者的SID,以及一个访问控制列表(ACL,Access Control List ...

  4. Windows Phone 十二、设计器同步

    在设计阶段为页面添加数据源 Blend或者VS的可视化设计器会跑我们的代码,然后来显示出来,当我们Build之后,设计器会进入页面的构造函数,调用InitializeComponent();方法来将U ...

  5. Spring Security(二十二):6.4 Method Security

    From version 2.0 onwards Spring Security has improved support substantially for adding security to y ...

  6. 【windows 访问控制】六、安全标识符(SID Security Identifiers)

    安全标识符(SID Security Identifiers) SID是用来标识安全主体.就是给安全主体一个唯一的ID.用户层面通过用户账户名识别,程序和资源之间通过SID识别. 什么是安全标识符? ...

  7. (二)Linux实操之——网络配置、进程管理、服务管理、组管理、YUM

    接上段   (一)Linux实操之——权限.任务调度.磁盘分区 4.网络配置 4.1 NAT模式的网络配置 目前我们采用的网络配置是NAT模式. windows下cmd通过 ipconfig 命令可以 ...

  8. 号外号外:9月13号《Speed-BI云平台案例实操--十分钟做报表》开讲了

    引言:如何快速分析纷繁复杂的数据?如何快速做出老板满意的报表?如何快速将Speed-BI云平台运用到实际场景中?         本课程将通过各行各业案例背景,将Speed-BI云平台运用到实际场景中 ...

  9. Python实操二

    实操一: 1.用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao'] name=['alex','wupeiqi' ...

随机推荐

  1. Express框架的简单使用

    Express框架的简单使用 这个框架是基于Node.js的框架平台 需要先安装node.js 安装完node.js后使用指令操作 npm init --yes 初始化 npm i express 安 ...

  2. selenium获取cookies并持久化登陆

    selenium获取cookies并持久化登陆 需求背景: ​ 这几天需要写一个接口,用来批量上传数据,最开始考虑的是 UI 自动化,然后选值的时候自动化难以判别,最终选择 接口 自动化. ​ 然后操 ...

  3. C++类对象大小问题(一)

    先看如下代码: #include<iostream> using namespace std; class Base1 { public: }; class Base2 { public: ...

  4. golang中使用switch语句根据年月计算天数

    package main import "fmt" func main() { days := CalcDaysFromYearMonth(2021, 9) fmt.Println ...

  5. Linux下查找软件,rpm命令 dpkg命令 apt命令

    centos: 1.查询一个包是否被安装 rpm -q < package name> 2.列出已安装软件相关的所有包 rpm -qa < package name> ubun ...

  6. Ubuntu 配置数据库开发环境(mysql oracle mssqlserver sybase)

    1.mysql sudo apt-get install libmysql++-dev //mysql连接库 2.ms sql server/sybase ./configure --prefix=/ ...

  7. What Goes Up Must Come Down

    跳转链接 题目描述 给定一个序列, 求出将此序列变换为单调递增.单调递减 或者先增后减 样例1 输入 7 3 1 4 1 5 9 2 输出 3 样例2 输入 9 10 4 6 3 15 9 1 1 1 ...

  8. CABasicAnimation动画

    使用CABasicAnimation动画: CALayer *znzLayer; = [[CALayer alloc]init]; //创建不断该表CALayer的transform属性动画 CABa ...

  9. 【web安全】Nodejs原型链污染分析

    Nodejs原型链污染分析 什么是js原型? 可以将js原型理解为其他OOP语言中的类,但还是有细微区别. 1. function F(){...} 2. var f = new F(); 分析: 1 ...

  10. maven下使用jstl标签(1.2)版本

    使用的是1.2版本的,只需要一个jstl-1.2.jar    jsp中头部加入<%@ taglib prefix="c" uri="http://java.sun ...