Windows Vista/7 引入使用者帳戶控制 (UAC),需要管理員權限的操作應在按鈕上顯示盾牌圖標 (Shield Icon) 作為視覺提示。本文介紹透過 P/Invoke 呼叫 user32.dll 發送 BCM_SETSHIELD 訊息為現有按鈕添加盾牌的標準做法。
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public static class UacHelper {
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private const uint BCM_SETSHIELD = 0x0000160C; // 定義於 Commctrl.h
/// <summary>
/// 為按鈕啟用 UAC 盾牌圖標
/// </summary>
public static void EnableElevateIcon(Button button) {
if (button == null) return;
// 必須設為 System 樣式,否則自繪按鈕不顯示盾牌
button.FlatStyle = FlatStyle.System;
// 發送訊息:wParam=0, lParam=1 表示顯示盾牌
SendMessage(new HandleRef(button, button.Handle), BCM_SETSHIELD, IntPtr.Zero, new IntPtr(1));
}
}
public partial class MainForm : Form {
public MainForm() {
InitializeComponent();
UacHelper.EnableElevateIcon(btnAdminOperation); // 一鍵添加
}
private void btnAdminOperation_Click(object sender, EventArgs e) {
// 實際提升權限需在 manifest 設定 requireAdministrator
// 或使用 ProcessStartInfo.Verb = "runas"
MessageBox.Show("執行需要管理員權限的操作...");
}
}

<requestedExecutionLevel level="requireAdministrator" /> (整個進程提升),或Process.Start(new ProcessStartInfo { Verb = "runas", FileName = "cmd.exe" })。FlatStyle.Standard/Popup/Flat) 不支援系統盾牌渲染。Button.SetValue(Shell.GetIsShieldPropertyKey(), true) (需引用 Microsoft.Windows.Shell 或手動 P/Invoke)。dpiAware。文中附帶 icacls.exe 下載 (Vista+ 內建),可查看檔案/目錄 ACL:
C:\Users> icacls c:\windows
c:\windows NT SERVICE\TrustedInstaller:(F)
NT SERVICE\TrustedInstaller:(CI)(IO)(F)
NT AUTHORITY\SYSTEM:(M)
...
Successfully processed 1 files; Failed processing 0 files
對應權限代碼:F=完全控制, M=修改, RX=讀取/執行, CI=容器繼承, IO=僅繼承, OI=物件繼承。
正確使用 UAC Shield 圖標,能讓使用者在點擊前預知權限提升,減少「為什麼彈 UAC 視窗」的困惑,是良好 Windows 應用體驗的細節之一。