예제 #1
0
        public static TokenHandle Create(
            TokenAccess access,
            ObjectFlags objectFlags,
            TokenHandle existingTokenHandle,
            TokenType tokenType,
            Sid user,
            Sid[] groups,
            PrivilegeSet privileges,
            Sid owner,
            Sid primaryGroup
            )
        {
            var statistics = existingTokenHandle.GetStatistics();

            return(Create(
                       access,
                       null,
                       objectFlags,
                       null,
                       tokenType,
                       statistics.AuthenticationId,
                       statistics.ExpirationTime,
                       user,
                       groups,
                       privileges,
                       owner,
                       primaryGroup,
                       null,
                       _phTokenSource
                       ));
        }
예제 #2
0
 public void AddPrivileges(PrivilegeSet privileges)
 {
     using (MemoryAlloc privilegeSetMemory = privileges.ToMemory())
     {
         Win32.LsaAddPrivilegesToAccount(
             this,
             privilegeSetMemory
             ).ThrowIf();
     }
 }
예제 #3
0
        public static TokenHandle Create(
            TokenAccess access,
            string name,
            ObjectFlags objectFlags,
            DirectoryHandle rootDirectory,
            TokenType tokenType,
            Luid authenticationId,
            long expirationTime,
            Sid user,
            Sid[] groups,
            PrivilegeSet privileges,
            Sid owner,
            Sid primaryGroup,
            Acl defaultDacl,
            TokenSource source
            )
        {
            NtStatus          status;
            TokenUser         tokenUser         = new TokenUser(user);
            TokenGroups       tokenGroups       = new TokenGroups(groups);
            TokenPrivileges   tokenPrivileges   = new TokenPrivileges(privileges);
            TokenOwner        tokenOwner        = new TokenOwner(owner);
            TokenPrimaryGroup tokenPrimaryGroup = new TokenPrimaryGroup(primaryGroup);
            TokenDefaultDacl  tokenDefaultDacl  = new TokenDefaultDacl(defaultDacl);
            ObjectAttributes  oa = new ObjectAttributes(name, objectFlags, rootDirectory);
            IntPtr            handle;

            try
            {
                if ((status = Win32.NtCreateToken(
                         out handle,
                         access,
                         ref oa,
                         tokenType,
                         ref authenticationId,
                         ref expirationTime,
                         ref tokenUser,
                         ref tokenGroups,
                         ref tokenPrivileges,
                         ref tokenOwner,
                         ref tokenPrimaryGroup,
                         ref tokenDefaultDacl,
                         ref source
                         )) >= NtStatus.Error)
                {
                    Win32.Throw(status);
                }
            }
            finally
            {
                oa.Dispose();
            }

            return(new TokenHandle(handle, true));
        }
예제 #4
0
 public void RemovePrivileges(PrivilegeSet privileges)
 {
     using (MemoryAlloc privilegeSetMemory = privileges.ToMemory())
     {
         Win32.LsaRemovePrivilegesFromAccount(
             this,
             false,
             privilegeSetMemory
             ).ThrowIf();
     }
 }
예제 #5
0
        public void AdjustPrivileges(PrivilegeSet privileges)
        {
            var tokenPrivileges = privileges.ToTokenPrivileges();

            Win32.AdjustTokenPrivileges(this, false, ref tokenPrivileges, 0, IntPtr.Zero, IntPtr.Zero);

            if (Marshal.GetLastWin32Error() != 0)
            {
                Win32.Throw();
            }
        }
예제 #6
0
 public static TokenHandle Create(
     TokenAccess access,
     TokenType tokenType,
     Sid user,
     Sid[] groups,
     PrivilegeSet privileges
     )
 {
     using (var administratorsSid = Sid.GetWellKnownSid(WellKnownSidType.WinBuiltinAdministratorsSid))
         using (var thandle = TokenHandle.OpenCurrentPrimary(TokenAccess.Query))
             return(Create(access, 0, thandle, tokenType, user, groups, privileges, administratorsSid, administratorsSid));
 }
예제 #7
0
 static extern bool AccessCheckByType(
     byte[] pSecurityDescriptor,
     byte[] PrincipalSelfSid,
     SafeTokenHandle ClientToken,
     uint DesiredAccess,
     IntPtr ObjectTypeList,
     int ObjectTypeListLength,
     ref GenericMapping GenericMapping,
     ref PrivilegeSet PrivilegeSet,
     ref int PrivilegeSetLength,
     out uint GrantedAccess,
     out bool AccessStatus
     );
예제 #8
0
        public void AddPrivileges(PrivilegeSet privileges)
        {
            NtStatus status;

            using (var privilegeSetMemory = privileges.ToMemory())
            {
                if ((status = Win32.LsaAddPrivilegesToAccount(
                         this,
                         privilegeSetMemory
                         )) >= NtStatus.Error)
                {
                    Win32.Throw(status);
                }
            }
        }
예제 #9
0
        public bool CheckPrivileges(PrivilegeSet privileges)
        {
            bool result;

            using (MemoryAlloc privilegesMemory = privileges.ToMemory())
            {
                Win32.NtPrivilegeCheck(
                    this,
                    privilegesMemory,
                    out result
                    ).ThrowIf();

                return(result);
            }
        }
예제 #10
0
        public void RemovePrivileges(PrivilegeSet privileges)
        {
            NtStatus status;

            using (var privilegeSetMemory = privileges.ToMemory())
            {
                if ((status = Win32.LsaRemovePrivilegesFromAccount(
                         this,
                         false,
                         privilegeSetMemory
                         )) >= NtStatus.Error)
                {
                    Win32.Throw(status);
                }
            }
        }
예제 #11
0
        private static bool GetGrantedAccess(string sddl, string principal, SafeTokenHandle token, bool launch, out COMAccessRights maximum_rights)
        {
            GenericMapping mapping = new GenericMapping();

            mapping.GenericExecute = (uint)(COMAccessRights.Execute | COMAccessRights.ExecuteLocal | COMAccessRights.ExecuteRemote);
            if (launch)
            {
                mapping.GenericExecute = mapping.GenericExecute | (uint)(COMAccessRights.ActivateLocal | COMAccessRights.ActivateRemote);
            }

            // If SD is only a NULL DACL we get maximum rights.
            if (sddl == "D:NO_ACCESS_CONTROL")
            {
                maximum_rights = (COMAccessRights)mapping.GenericExecute;
                return(true);
            }

            byte[] princ_bytes = null;
            if (!String.IsNullOrWhiteSpace(principal))
            {
                SecurityIdentifier sid = new SecurityIdentifier(principal);
                princ_bytes = new byte[sid.BinaryLength];
                sid.GetBinaryForm(princ_bytes, 0);
            }

            maximum_rights = 0;
            PrivilegeSet priv_set       = new PrivilegeSet();
            int          priv_length    = Marshal.SizeOf(priv_set);
            uint         granted_access = 0;
            bool         access_status  = false;

            byte[] sd = GetSDForStringSD(sddl);
            if (!AccessCheckByType(sd, princ_bytes, token, MaximumAllowed, IntPtr.Zero,
                                   0, ref mapping, ref priv_set, ref priv_length, out granted_access, out access_status))
            {
                throw new Win32Exception(sddl);
            }
            if (access_status)
            {
                maximum_rights = (COMAccessRights)(granted_access & 0x1F);
            }
            return(access_status);
        }
예제 #12
0
        public bool CheckPrivileges(PrivilegeSet privileges)
        {
            NtStatus status;
            bool     result;

            using (var privilegesMemory = privileges.ToMemory())
            {
                if ((status = Win32.NtPrivilegeCheck(
                         this,
                         privilegesMemory,
                         out result
                         )) >= NtStatus.Error)
                {
                    Win32.Throw(status);
                }

                return(result);
            }
        }
예제 #13
0
        public void AdjustPrivileges(PrivilegeSet privileges)
        {
            var tokenPrivileges = privileges.ToTokenPrivileges();

            Win32.NtAdjustPrivilegesToken(this, false, ref tokenPrivileges, 0, IntPtr.Zero, IntPtr.Zero).ThrowIf();
        }