Beispiel #1
0
        /*
         * public const UInt32 HKCR = 0x80000000; // HKEY_CLASSES_ROOT
         * public const UInt32 HKCU = 0x80000001; // HKEY_CURRENT_USER
         * public const UInt32 HKLM = 0x80000002; // HKEY_LOCAL_MACHINE
         * public const UInt32 HKU = 0x80000003; // HKEY_USERS
         * public const UInt32 HKPD = 0x80000004; // HKEY_PERFORMANCE_DATA
         * public const UInt32 HKCC = 0x80000005; // HKEY_CURRENT_CONFIG
         */

        public static void GetAdminPrivileges()
        {
            TOKEN_PRIVILEGES pRestoreToken = new TOKEN_PRIVILEGES();
            TOKEN_PRIVILEGES pBackupToken  = new TOKEN_PRIVILEGES();

            if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out IntPtr hToken))
            {
                throw new BetterWin32Errors.Win32Exception("OpenProcessToken failed");
            }

            if (!LookupPrivilegeValue(null, "SeRestorePrivilege", out LUID restoreLUID))
            {
                throw new BetterWin32Errors.Win32Exception("LookupPrivilegeValue failed");
            }

            if (!LookupPrivilegeValue(null, "SeBackupPrivilege", out LUID backupLUID))
            {
                throw new BetterWin32Errors.Win32Exception("LookupPrivilegeValue failed");
            }

            pRestoreToken.Count = 1;
            pRestoreToken.Luid  = restoreLUID;
            pRestoreToken.Attr  = SE_PRIVILEGE_ENABLED;

            pBackupToken.Count = 1;
            pBackupToken.Luid  = backupLUID;
            pBackupToken.Attr  = SE_PRIVILEGE_ENABLED;

            if (!AdjustTokenPrivileges(hToken, false, ref pRestoreToken, 0, IntPtr.Zero, IntPtr.Zero))
            {
                BetterWin32Errors.Win32Error error = BetterWin32Errors.Win32Exception.GetLastWin32Error();
                if (error == BetterWin32Errors.Win32Error.ERROR_NOT_ALL_ASSIGNED)
                {
                    throw new BetterWin32Errors.Win32Exception("AdjustTokenPrivileges failed, try running this program with Administrator privilege.");
                }
                else
                {
                    throw new BetterWin32Errors.Win32Exception("AdjustTokenPrivileges failed");
                }
            }

            if (!AdjustTokenPrivileges(hToken, false, ref pBackupToken, 0, IntPtr.Zero, IntPtr.Zero))
            {
                BetterWin32Errors.Win32Error error = BetterWin32Errors.Win32Exception.GetLastWin32Error();
                if (error == BetterWin32Errors.Win32Error.ERROR_NOT_ALL_ASSIGNED)
                {
                    throw new BetterWin32Errors.Win32Exception("AdjustTokenPrivileges failed, try running this program with Administrator privilege.");
                }
                else
                {
                    throw new BetterWin32Errors.Win32Exception("AdjustTokenPrivileges failed");
                }
            }
            CloseHandle(hToken);
        }
        public static void GetAdminPrivileges()
        {
            NativeMethods.TOKEN_PRIVILEGES pRestoreToken = new NativeMethods.TOKEN_PRIVILEGES();
            NativeMethods.TOKEN_PRIVILEGES pBackupToken  = new NativeMethods.TOKEN_PRIVILEGES();

            // Because procHandle is a pseudo handle, it does not need to be closed.
            // https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-getcurrentprocess#remarks
            IntPtr procHandle = NativeMethods.GetCurrentProcess();

            const uint desiredAccess = NativeMethods.TOKEN_ADJUST_PRIVILEGES | NativeMethods.TOKEN_QUERY;

            if (!NativeMethods.OpenProcessToken(procHandle, desiredAccess, out IntPtr hToken))
            {
                throw new Win32Exception("OpenProcessToken failed");
            }

            try
            {
                if (!NativeMethods.LookupPrivilegeValue(null, "SeRestorePrivilege", out NativeMethods.LUID restoreLuid))
                {
                    throw new Win32Exception("LookupPrivilegeValue failed");
                }

                if (!NativeMethods.LookupPrivilegeValue(null, "SeBackupPrivilege", out NativeMethods.LUID backupLuid))
                {
                    throw new Win32Exception("LookupPrivilegeValue failed");
                }

                pRestoreToken.Count = 1;
                pRestoreToken.Luid  = restoreLuid;
                pRestoreToken.Attr  = NativeMethods.SE_PRIVILEGE_ENABLED;

                pBackupToken.Count = 1;
                pBackupToken.Luid  = backupLuid;
                pBackupToken.Attr  = NativeMethods.SE_PRIVILEGE_ENABLED;

                if (!NativeMethods.AdjustTokenPrivileges(hToken, false, ref pRestoreToken, 0, IntPtr.Zero, IntPtr.Zero))
                {
                    BetterWin32Errors.Win32Error ret = BetterWin32Errors.Win32Exception.GetLastWin32Error();
                    if (ret == BetterWin32Errors.Win32Error.ERROR_NOT_ALL_ASSIGNED)
                    {
                        throw new Win32Exception((int)ret, "AdjustTokenPrivileges failed, try running this program with Administrator privilege.");
                    }
                    else
                    {
                        throw new Win32Exception((int)ret, "AdjustTokenPrivileges failed");
                    }
                }

                if (!NativeMethods.AdjustTokenPrivileges(hToken, false, ref pBackupToken, 0, IntPtr.Zero, IntPtr.Zero))
                {
                    BetterWin32Errors.Win32Error ret = BetterWin32Errors.Win32Exception.GetLastWin32Error();
                    if (ret == BetterWin32Errors.Win32Error.ERROR_NOT_ALL_ASSIGNED)
                    {
                        throw new Win32Exception((int)ret, "AdjustTokenPrivileges failed, try running this program with Administrator privilege.");
                    }
                    else
                    {
                        throw new Win32Exception((int)ret, "AdjustTokenPrivileges failed");
                    }
                }
            }
            finally
            {
                NativeMethods.CloseHandle(hToken);
            }
        }