c# – 如何在.Net中 *** 纵令牌权限?

c# – 如何在.Net中 *** 纵令牌权限?,第1张

概述我想使用C#来确定为我的进程/线程令牌分配了哪些权限,并根据需要进行调整.例如,为了让我的程序重新启动计算机,它必须首先启用SeShutdownPrivilege权限. 如何从托管代码安全地完成? 事实证明这并不重要,因为它没有内置机制.不仅需要P / Invoke,而且您必须仔细编码以确保您不会通过启用它们来“泄漏”权限,然后不会很快禁用它们(如果您重新启动计算机则不会出现问题). 有关描述的完 我想使用C#来确定为我的进程/线程令牌分配了哪些权限,并根据需要进行调整.例如,为了让我的程序重新启动计算机,它必须首先启用SeShutdownPrivilege权限.

如何从托管代码安全地完成?

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

有关描述的完整代码示例,请阅读Mark Novak 2005年3月“Manipulate Privileges in Managed Code Reliably,Securely,and Efficiently”中的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,}    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,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,Out] ref uint              ReturnLength);        [Dllimport(             ADVAPI32,CharSet=CharSet.auto,Cer.MayFail)]        internal static extern        bool RevertToSelf();        [Dllimport(             ADVAPI32,EntryPoint="LookupPrivilegeValueW",Cer.MayFail)]        internal static extern        bool LookupPrivilegeValue (            [In]     string             lpSystemname,[In]     string             lpname,Out] ref LUID           LuID);        [Dllimport(             KERNEL32,Cer.MayFail)]        internal static extern         IntPtr GetCurrentProcess();        [Dllimport(             KERNEL32,Cer.MayFail)]        internal static extern             IntPtr GetCurrentThread ();        [Dllimport(             ADVAPI32,Cer.MayFail)]        internal static extern         bool OpenProcesstoken (            [In]     IntPtr              Processtoken,[In]     TokenAccessLevels   DesiredAccess,Out] ref SafetokenHandle TokenHandle);        [Dllimport             (ADVAPI32,Cer.MayFail)]        internal static extern        bool OpenThreadToken(            [In]     IntPtr              ThreadToken,[In]     bool                OpenAsSelf,Out] ref SafetokenHandle TokenHandle);        [Dllimport            (ADVAPI32,Cer.MayFail)]        internal static extern        bool DuplicatetokenEx(            [In]    SafetokenHandle     ExistingToken,[In]    TokenAccessLevels   DesiredAccess,[In]    IntPtr              TokenAttributes,[In]    SecurityImpersonationLevel  ImpersonationLevel,[In]    TokenType           TokenType,Out] ref SafetokenHandle NewToken);        [Dllimport             (ADVAPI32,Cer.MayFail)]        internal static extern        bool SetThreadToken(            [In]    IntPtr              Thread,[In]    SafetokenHandle     Token);        static NativeMethods()        {        }    }}
总结

以上是内存溢出为你收集整理的c# – 如何在.Net中 *** 纵令牌权限?全部内容,希望文章能够帮你解决c# – 如何在.Net中 *** 纵令牌权限?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1249877.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存