搞懂.NET應用程式管理員許可權:三種簡單方法一網打盡

架构师老卢發表於2024-03-19
搞懂.NET應用程式管理員許可權:三種簡單方法一網打盡

概述:.NET應用程式以管理員身份執行的方法包括修改清單檔案、專案檔案,或在執行時動態請求管理員許可權。清單檔案和專案檔案透過宣告UAC請求,而動態請求管理員許可權則在程式啟動時檢查並重新啟動。選擇適當的方法取決於專案需求和配置。

在.NET應用程式中強制以管理員身份執行,可以透過清單檔案、專案檔案或者在程式執行時動態請求管理員許可權。下面詳細講解這三種方法的基礎功能:

方法一:清單檔案(.exe.manifest)

步驟:

  1. 建立.NET應用程式: 建立一個.NET應用程式。
  2. 修改清單檔案: 新增UAC請求到清單檔案。

示例原始碼:

在你的應用程式專案資料夾下建立一個新的清單檔案(例如app.manifest),並將以下內容新增到清單檔案中:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

在專案屬性中的"應用程式"標籤下,選擇清單檔案為剛剛建立的app.manifest

方法二:專案檔案 (csproj)

步驟:

  1. 建立.NET應用程式: 建立一個.NET應用程式。
  2. 在專案檔案中配置清單檔案: 設定 <ApplicationManifest> 元素的 RequestedExecutionLevel 屬性。

示例原始碼:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <UseWPF>true</UseWPF>
    <ApplicationManifest>app.manifest</ApplicationManifest>
  </PropertyGroup>

</Project>

在這個示例中,<ApplicationManifest> 元素指定了清單檔案的名稱為 app.manifest

方法三:動態請求管理員許可權

步驟:

  1. 建立.NET應用程式: 建立一個.NET應用程式。
  2. 在程式執行時檢查許可權: 使用 WindowsPrincipal 檢查是否以管理員身份執行,如果不是,透過 ProcessStartInfo 重新啟動並請求管理員許可權。

示例原始碼:

using System;
using System.Diagnostics;
using System.Security.Principal;
using System.Windows.Forms;

namespace AdminModeApp
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            // 檢查是否以管理員身份執行
            if (!IsRunAsAdministrator())
            {
                // 如果沒有以管理員身份執行,則重新啟動應用程式
                RunAsAdministrator();
                return;
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }

        private static bool IsRunAsAdministrator()
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);

            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }

        private static void RunAsAdministrator()
        {
            // 重新啟動應用程式以管理員身份
            ProcessStartInfo startInfo = new ProcessStartInfo
            {
                FileName = Application.ExecutablePath,
                UseShellExecute = true,
                Verb = "runas"  // 請求管理員許可權
            };

            try
            {
                Process.Start(startInfo);
            }
            catch (Exception ex)
            {
                // 處理異常,例如使用者拒絕提升許可權
                MessageBox.Show("無法以管理員身份執行應用程式:" + ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            Application.Exit();
        }
    }
}

上述程式碼在應用程式啟動時檢查是否以管理員身份執行,如果不是,則透過 RunAsAdministrator 方法重新啟動應用程式並請求管理員許可權。

以上三種方法均可實現以管理員身份執行應用程式,具體選擇取決於你的需求和專案配置。

相關文章