首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

在 Vista 中透過 VC++ 觸發 UAC 權限提升視窗

     編輯:VC 教學

前言

公司產品在 Vista 系統下遇到一個棘手問題:Guest 使用者註冊 Flash.ocx 時會靜默失敗,卻不報任何錯誤;同樣操作在 Windows XP 下卻能成功。後來發現原來是 Guest 帳號權限不足,必須透過 UAC(使用者帳戶控制)彈出提權視窗輸入管理員密碼,才能獲得足夠權限完成註冊。

解決方案:讓 EXE 自動觸發 UAC 提示

經過廣泛搜尋,網路上多以 Delphi 為例,VC++ 相關資料較少。最終歸納出兩種簡單有效的方法,能讓 VC++ 編譯的 EXE 在 Vista 下自動彈出 UAC 對話框:

方法一:利用檔案命名規則觸發安裝程式偵測

Vista 內建「安裝程式偵測」機制,若執行檔名稱包含 update、install、setup 等敏感關鍵字,系統會自動判定為安裝程式並彈出 UAC。只需將輸出的 EXE 重新命名(例如 MyApp_Install.exe),即可無需修改程式碼即達到提權目的。

方法二:內嵌 Manifest 檔聲明需要管理員權限(推薦)

在專案資源中加入自訂 Manifest,明確宣告 requestedExecutionLevel 為 requireAdministrator,這是更標準、可控的做法。

Manifest 內容範例

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="MyApp.exe"
    type="win32"
  />
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

VC++ 專案中加入步驟

  1. 在「資源檢視」右鍵選擇「新增資源」,選 Custom 類型。
  2. Resource Type 輸入 24(即 RT_MANIFEST),ID 設為 1(對應 CREATEPROCESS_MANIFEST_RESOURCE_ID)。
  3. 將上述 XML 內容貼入資源編輯器。

命令列工具 mt.exe 事後嵌入法

若專案已編譯完成,也可用 Windows SDK 提供的 mt.exe 將 Manifest 嵌入既有 EXE:

mt.exe -manifest MyApp.exe.manifest -outputresource:MyApp.exe;1

總結

採用 Manifest 方式符合 Microsoft 最佳實務,且不依賴檔名 heuristics,建議作為預設方案;檔名法可作為快速測試或臨時備援。兩種方法皆能解決 Vista Guest 帳號無法自動提權的問題,讓 OCX 註冊等需管理員權限的操作順利完成。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved