Contents

UAC 連結小記

Windows UAC(User Account Control,使用者帳戶控制)是從 Windows Vista 開始引入的安全機制,用來防止未經授權的程式在使用者不知情的情況下變更系統設定,是 Windows 安全防線的重要一環。

什麼是 UAC?

UAC 的核心概念是「最低權限原則」(Least Privilege Principle)。即使使用者以系統管理員帳號登入,日常操作仍以標準使用者身份執行。當程式需要變更系統設定(如安裝軟體、修改登錄檔)時,Windows 會彈出確認對話框,要求使用者明確授權。

這樣設計的好處是:即使惡意程式植入系統,也無法在使用者不知情的情況下取得管理員權限。

UAC 提示等級設定

可在「控制台 → 使用者帳戶 → 變更使用者帳戶控制設定」中調整:

等級 說明
最高(永遠通知) 任何變更都會彈出 UAC 視窗,桌面會變暗
預設(推薦) 只有程式嘗試變更系統設定時才通知
較低 只有程式嘗試變更設定才通知,桌面不變暗
從不通知 關閉 UAC(不建議)

程式如何申請管理員權限

方法一:應用程式 Manifest 設定

在 Visual Studio 專案的 app.manifest 中設定 requestedExecutionLevel

1
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

常用的三種等級:

  • asInvoker:以啟動它的程序相同權限執行(預設)
  • highestAvailable:以目前使用者可取得的最高權限執行
  • requireAdministrator:強制要求管理員權限,非管理員會彈出 UAC 或直接失敗

方法二:PowerShell 中請求提權

1
2
3
4
5
# 以管理員身份重新啟動目前腳本
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
    Start-Process PowerShell -Verb RunAs -ArgumentList $MyInvocation.MyCommand.Definition
    Exit
}

方法三:批次檔(Batch)請求提權

1
2
3
4
5
6
7
8
9
@echo off
net session >nul 2>&1
if %errorLevel% == 0 (
    echo 已有管理員權限
) else (
    echo 需要管理員權限,請重新以管理員身份執行
    pause
    exit
)

開發時模擬 UAC 的方法

在開發需要管理員權限的應用程式時,可以:

  1. 直接以系統管理員身份執行 IDE:右鍵點選 Visual Studio → 以系統管理員身份執行,這樣啟動的除錯程序也會有管理員權限。

  2. 使用 Windows Terminal 的管理員分頁:在 Windows Terminal 的設定中,可以針對特定設定檔開啟「以系統管理員身份執行」選項。

  3. 檢查程式是否以管理員身份執行(C#)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
using System.Security.Principal;

bool isAdmin = new WindowsPrincipal(WindowsIdentity.GetCurrent())
    .IsInRole(WindowsBuiltInRole.Administrator);

if (!isAdmin)
{
    MessageBox.Show("請以系統管理員身份執行本程式!");
    return;
}

參考資料