[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 在開啟時必須具備管理員權限
否則將會無法除錯
新手發文,有謬誤請告知,也請多多指教。