[C#] [WinForm] 強迫使用系統管理員(administrator)開啟程式

[C#] [WinForm] 強迫使用系統管理員(administrator)開啟程式

讓程式開啟時必須使用管理員權限的方式

最簡單的方法就是加入一個app.manifest

在專案中加入新項目 選取[應用程式資訊清單檔案]

檔名是 app.manifest

在前幾行把 requestedExecutionLevel level="asInvoker" 改成 ="requireAdministrator"即可
 

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC 資訊清單選項
             如果要變更 Windows 使用者帳戶控制層級,請將 
             requestedExecutionLevel 節點以下列其中之一取代。

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            指定 requestedExecutionLevel 項目會停用檔案及登錄虛擬化。
            如果您的應用程式需要針對回溯相容性進行這項虛擬化,請移除這個
            項目。
        -->
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>

之後再看Compile出來的exe圖示上會多了個小盾牌

此後開啟此檔案都會自動以管理員權限開啟

但因為ClickOnce不支援requireAdministrator會讓ClickOnce無法啟用

所以還有另外一種解決方法就是直接在Program.cs裡面加入幾行程式碼

讓程序在一開始啟動時就去判斷是否有管理員權限

沒有的話依照同一路徑以管理員重開

 [STAThread]
        static void Main()
        {
            var wi = WindowsIdentity.GetCurrent();
            var wp = new WindowsPrincipal(wi);

            if (!wp.IsInRole(WindowsBuiltInRole.Administrator))
            {
                var processInfo = new ProcessStartInfo();
                // The following properties run the new process as administrator
                processInfo.UseShellExecute = true;
                processInfo.FileName = Application.ExecutablePath;
                processInfo.Verb = "runas";

                // Start the new process
                try
                {
                    Process.Start(processInfo);
                }
                catch (Exception ex)
                {
                    // The user did not allow the application to run as administrator
                    MessageBox.Show("Sorry, this application must be run as Administrator.\n" + ex.Message);
                }

            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form2());
            }
        }

但此作法Visual Studio 在開啟時必須具備管理員權限

否則將會無法除錯

 

新手發文,有謬誤請告知,也請多多指教。