如何在 .Net 中操纵令牌权限?

2023-11-27

我想使用 C# 来确定分配给我的进程/线程令牌的权限,并根据需要进行调整。例如,为了让我的程序重新启动计算机,它必须首先启用SeShutdownPrivilege特权。

如何通过托管代码安全地完成此操作?


事实证明这并不简单,因为没有内置的机制。不仅需要 P/Invoke,而且您必须仔细编码,以确保不会通过启用它们然后不尽快禁用它们来“泄漏”权限(尽管如果您重新启动计算机,则这不是问题)。

有关包含说明的完整代码示例,请阅读 2005 年 3 月的 MSDN 杂志文章“可靠、安全、高效地操纵托管代码中的权限”马克·诺瓦克。

以下是 P/Invoke 声明:

using System;
using System.Runtime.InteropServices;
using System.Runtime.ConstrainedExecution;

namespace PrivilegeClass
{
    [Flags]
    internal enum TokenAccessLevels 
    {
        AssignPrimary       = 0x00000001,
        Duplicate           = 0x00000002,
        Impersonate         = 0x00000004,
        Query               = 0x00000008,
        QuerySource         = 0x00000010,
        AdjustPrivileges    = 0x00000020,
        AdjustGroups        = 0x00000040,
        AdjustDefault       = 0x00000080,
        AdjustSessionId     = 0x00000100,

        Read                = 0x00020000 | Query,

        Write               = 0x00020000 | AdjustPrivileges | AdjustGroups | AdjustDefault,

        AllAccess           = 0x000F0000       |
            AssignPrimary    |
            Duplicate        |
            Impersonate      |
            Query            |
            QuerySource      |
            AdjustPrivileges |
            AdjustGroups     |
            AdjustDefault    |
            AdjustSessionId,

        MaximumAllowed      = 0x02000000
    }

    internal enum SecurityImpersonationLevel
    {
        Anonymous = 0,
        Identification = 1,
        Impersonation = 2,
        Delegation = 3,
    }

    internal enum TokenType
    {
        Primary = 1,
        Impersonation = 2,
    }

    internal sealed class NativeMethods
    {
        internal const uint SE_PRIVILEGE_DISABLED           = 0x00000000;
        internal const uint SE_PRIVILEGE_ENABLED            = 0x00000002;

        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
        internal struct LUID 
        {
            internal uint LowPart;
            internal uint HighPart;
        }

        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
        internal struct LUID_AND_ATTRIBUTES 
        {
            internal LUID Luid;
            internal uint Attributes;
        }

        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
        internal struct TOKEN_PRIVILEGE 
        {
            internal uint                PrivilegeCount;
            internal LUID_AND_ATTRIBUTES Privilege;
        }

        internal const string ADVAPI32 = "advapi32.dll";
        internal const string KERNEL32 = "kernel32.dll";

        internal const int ERROR_SUCCESS = 0x0;
        internal const int ERROR_ACCESS_DENIED  = 0x5;
        internal const int ERROR_NOT_ENOUGH_MEMORY = 0x8;
        internal const int ERROR_NO_TOKEN = 0x3f0;
        internal const int ERROR_NOT_ALL_ASSIGNED = 0x514;
        internal const int ERROR_NO_SUCH_PRIVILEGE = 0x521;
        internal const int ERROR_CANT_OPEN_ANONYMOUS = 0x543;

        [DllImport(
             KERNEL32,
             SetLastError=true)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        internal static extern bool CloseHandle(IntPtr handle);

        [DllImport(
             ADVAPI32,
             CharSet=CharSet.Unicode,
             SetLastError=true)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        internal static extern bool AdjustTokenPrivileges (
            [In]     SafeTokenHandle       TokenHandle,
            [In]     bool                  DisableAllPrivileges,
            [In]     ref TOKEN_PRIVILEGE   NewState,
            [In]     uint                  BufferLength,
            [In,Out] ref TOKEN_PRIVILEGE   PreviousState,
            [In,Out] ref uint              ReturnLength);

        [DllImport(
             ADVAPI32,
             CharSet=CharSet.Auto,
             SetLastError=true)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        internal static extern
        bool RevertToSelf();

        [DllImport(
             ADVAPI32,
             EntryPoint="LookupPrivilegeValueW",
             CharSet=CharSet.Auto,
             SetLastError=true)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        internal static extern
        bool LookupPrivilegeValue (
            [In]     string             lpSystemName,
            [In]     string             lpName,
            [In,Out] ref LUID           Luid);

        [DllImport(
             KERNEL32,
             CharSet=CharSet.Auto,
             SetLastError=true)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        internal static extern 
        IntPtr GetCurrentProcess();

        [DllImport(
             KERNEL32,
             CharSet=CharSet.Auto,
             SetLastError=true)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        internal static extern 
            IntPtr GetCurrentThread ();

        [DllImport(
             ADVAPI32,
             CharSet=CharSet.Unicode,
             SetLastError=true)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        internal static extern 
        bool OpenProcessToken (
            [In]     IntPtr              ProcessToken,
            [In]     TokenAccessLevels   DesiredAccess,
            [In,Out] ref SafeTokenHandle TokenHandle);

        [DllImport
             (ADVAPI32,
             CharSet=CharSet.Unicode,
             SetLastError=true)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        internal static extern
        bool OpenThreadToken(
            [In]     IntPtr              ThreadToken,
            [In]     TokenAccessLevels   DesiredAccess,
            [In]     bool                OpenAsSelf,
            [In,Out] ref SafeTokenHandle TokenHandle);

        [DllImport
            (ADVAPI32,
             CharSet=CharSet.Unicode,
             SetLastError=true)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        internal static extern
        bool DuplicateTokenEx(
            [In]    SafeTokenHandle     ExistingToken,
            [In]    TokenAccessLevels   DesiredAccess,
            [In]    IntPtr              TokenAttributes,
            [In]    SecurityImpersonationLevel  ImpersonationLevel,
            [In]    TokenType           TokenType,
            [In,Out] ref SafeTokenHandle NewToken);

        [DllImport
             (ADVAPI32,
             CharSet=CharSet.Unicode,
             SetLastError=true)]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
        internal static extern
        bool SetThreadToken(
            [In]    IntPtr              Thread,
            [In]    SafeTokenHandle     Token);

        static NativeMethods()
        {
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 .Net 中操纵令牌权限? 的相关文章

  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • HTTPS 查询字符串安全吗?

    我正在创建一个使用 HTTPS 的基于安全 Web 的 API 但是 如果我允许用 户使用查询字符串配置它 包括发送密码 这也是安全的还是我应该强制它通过 POST 完成 是的 但对敏感数据使用 GET 并不是一个好主意有几个原因 主要是
  • 在文件中调用 powershell 函数,无需点源

    如果我的文件中只有一个与该文件同名的函数 这可能吗 我好像记得以前读过 像这样的东西 你好 ps1 function hello Write Host Hello world 我会完全摆脱函数调用 您根本不会丢失命名参数和 cmdlet 包
  • 如何侦听所有组件上的按键(在 Java Swing 内)?

    I would like to listen for key combinations such as Control S without adding key listeners to each component in my Swing
  • 在 wxPython 的窗口中显示 .png 图像

    如何显示一个 pngwxPython 窗口中的图像 png wx Image imageFile wx BITMAP TYPE ANY ConvertToBitmap wx StaticBitmap self 1 png 10 5 png
  • Mongoose:将JS对象直接插入数据库

    好的 我有一个 JS 对象 它通过 AJAX POST 到 Nodejs 后端 我想将此 js 对象直接插入到我的猫鼬数据库中 因为对象键已经与数据库模式完美匹配 我目前有这个 不是动态的并且过于复杂 app post items subm
  • 如何使用库

    由于某种原因 我永远无法使用任何语言的外部库 我正在寻找有关如何使用外部库及其工作原理的说明 解释 当我在线搜索时 我得到的片段似乎永远不适用于我下载并尝试使用的任何库 我在 Mac 和 PC 上工作 C 示例都很好 我使用带有 C 插件的
  • 如何使用 kendo 验证器验证日期的格式为 yyyy-MM-dd?

    我有一个剑道日期选择器 其构造如下 date kendoDatePicker format yyyy MM dd footer parseFormats MM dd yyyy dd MM yyyy 我想使用 kendo 验证器来验证日期是否
  • 使用 Python 实现 collat​​z 函数

    我目前在 自动化无聊的事情 中无法完成此挑战 我的代码是 def collatz number global seqNum if seqNum 2 0 return seqNum 2 elif seqNum 2 1 return 3 seq
  • 如何使用Tomcat 8 + Spring Boot + Maven

    根据参考 API使用 Tomcat 8和这个部署 Spring Boot 应用程序教程应该可以使用 Tomcat 8春季启动 默认使用 Tomcat 7 由于某种原因 它对我不起作用 我究竟做错了什么 pom xml
  • Java 6 中 java.nio.file.Files 的替代方案

    我有下面一段使用 java 7 功能的代码 例如java nio file Files 和 java nio file Paths import java io File import java io IOException import
  • 离子/角度传单指令 - 放大/缩小按钮不起作用

    我对传单地图上的默认放大 缩小按钮有一些问题 当我直接加载页面时 一切正常 但是当我将一种状态更改为声明传单指令所在位置时 按钮就不起作用 给你例子 http codepen io anon pen JkyEg editors 101 代码
  • 从指定列中减去 pandas 列

    如何从指定列中动态减去多个 pandas 数据帧列中的值 在这种情况下 如何从存款中减去 A B C 列 并将该值放入相应的 A B C 列中 date deposit A B C 0 2017 01 15 12 5 10 12 1 201
  • PHP 将每个项目的 foreach 输出显示到屏幕上

    我在 php 中注意到的一件事是 在脚本停止工作之前 屏幕上不会输出任何内容 对于我正在从事的项目 我输入了超过 100 个项目的列表 它对每个项目执行 HTTP 请求 完成后 显示一个页面 其中包含每个项目的状态 成功 失败等 我想知道是
  • lastModified() 函数返回当前日期和时间

    我的问题是 为什么当我在网页上使用 document lastModified 时 它会返回当前日期和时间 而不是该页面上次修改的时间 有任何想法吗 提前致谢 实际代码是 因为你现在正在修改它 检查一下这个example 为了根据您的要求进
  • 如何在云端成功托管用 Python 编写的 Telegram 机器人(免费)?

    我跟着本教程使用 Python 创建 Telegram 机器人 最后 我在我的机器上本地运行它ngrok 为了测试这个机器人 我在 Telegram 中向它发送了消息 有效 所以这是一个很好的教程 但是 现在我想在云端托管机器人 因为我当然
  • Rails/Javascript:如何将 Rails 变量注入(非常)简单的 javascript

    我想在rails中编写一个非常简单的javascript计算器 它将输入字段的数量乘以rails变量中存储的数字 item base price 所以 在 javascript coffeescript 方面 粗略地说是这样的 app as
  • 如何从 C 程序中获得 100% CPU 使用率

    这是一个非常有趣的问题 所以让我来介绍一下场景 我在国家计算博物馆工作 我们刚刚设法让一台 1992 年的 Cray Y MP EL 超级计算机运行起来 我们真的很想看看它能跑多快 我们认为最好的方法是编写一个简单的 C 程序来计算素数并显
  • 在 python 包中添加和读取 config.ini 文件

    我正在编写我的第一个 python 包 我想将其上传到 PyPI 上 我基于此构建了我的代码博客文章 我想将用户设置存储在 config ini 文件中 在同一包中的单独 python 模块中读取一次 每次运行包时 并将用户设置保存在该模块
  • 测试使用会话的 Sinatra 应用程序

    如何测试使用会话的 Sinatra 应用程序 get rack session gt foo gt blah 这段代码对我不起作用 我在我的应用程序中有 启用 会话 看起来问题实际上是有enable sessions活性 您必须停用此设置才
  • 如何在 .Net 中操纵令牌权限?

    我想使用 C 来确定分配给我的进程 线程令牌的权限 并根据需要进行调整 例如 为了让我的程序重新启动计算机 它必须首先启用SeShutdownPrivilege特权 如何通过托管代码安全地完成此操作 事实证明这并不简单 因为没有内置的机制