在vista以后的windows版本中,有些時候需要提升編譯后生成程序的權限,即希望讓生成的程序以管理員身份運行。雖然在一般情況下,可以使用鼠標右鍵選擇的方式來強行以管理員身份運行,但它並沒有屏蔽普通運行方式,而且普通人通常也不會使用右鍵選擇以管理員身份運行,所以必須在生成程序時就限定程序只能以管理員方式來運行。以下以C++builder為例來說明一下具體方法。
先簡單說一下,在vista以后的windows版本中,微軟引入了UAC機制,它的目的是防止程序對操作系統本身進行惡意篡改。要讓程序以管理員身份運行,就需要在程序中引入UAC標注,也即讓程序顯示“UAC盾牌”。這在C++builder中,是通過讀取程序在Resource里的MANIFEST資源來決定的,為此,C++builder必須在資源里面嵌入MANIFEST信息。
1.打開記事本,寫入下面的內容,並保存成一個名為uac.manifest的文件。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
上述中的requireAdministrator就表示程序需要管理員才能運行。
2.再打開記事本,寫入下面的內容,並保存成一個名為uac.rc的文件。
1 24 uac.manifest
3.確保上面兩個文件在同一目錄下,打開命令行窗口,進入到該目錄下,運行brcc32 uac.rc -fouac.res,回車后會看到該目錄下多出了一個資源文件uac.res。
4.以右鍵選擇管理員身份運行C++builder(這點很重要),新建一個VCL Form Application的工程文件,先保存並運行一下。然后把上面生成的uac.res文件拷貝到該工程目錄下。點擊菜單Project->Add to Project(或按shift+F11),定位到工程目錄並選擇uac.res文件(注意擴展名過濾)並點擊打開,這時應該在項目管理器中可以看到該文件被加入到了工程中。最后打開工程的cpp文件(默認為Project1.cpp),在第二行#pragma hdrstop之前加入一句#pragma resource "uac.res",接着保存並編譯運行整個工程(可直接按F9),這時生成的程序就帶有“UAC盾牌”了!找到生成的可執行程序,會看到程序的圖標被加上了一個“盾牌”,表示它必須以管理員身份運行。
5.如果需要讓生成的程序脫離開發環境獨立行動,可點擊菜單Project->Options(或按Shift+Ctrl+F11),先找到Linking選項卡,把Dynamic RTL前面的勾去掉;再找到Packages選項卡,把Build runtime packes前的勾也去掉,保存工程並編譯,生成的可執行文件就可以在其它未裝C++builder的電腦上以管理員身份運行了!
6.如果上面的程序在編譯中提示“Unable to create process”,是因為C++builder沒有以管理員身份運行!上述過程適用於C++builder2007及以前的版本,若是以后的版本就簡單一些了,做完前面的1~3步后,第4步可點擊菜單Project->Options,選擇Application選項卡,在runtime themes一項中改為use custom manifest就行了。
按以上操作后,會發現編譯后的程序外觀樣式會變為傳統XP的樣式,不太好看。怎么改回來呢?
其實,在程序編譯時會有一條警告信息產生,如下:“[ILINK32 Warning] Warning: Duplicate resource: Type 24 (user-defined), ID 1; File D:\DOCUMENTS\VFS150.TMP resource kept; file D:\DOCUMENTS\UAC.RES resource discarded.”,說明有資源沖突產生。在C++builder2007中,加入了對vista及以后版本外觀樣式的支持,使程序的界面更好看了。點擊菜單Project->Options,選擇Application選項卡,可看到有一項名為Enable Runtime themes的選項,默認是鈎選上的,即使用新的Windows外觀樣式。把勾去掉后再編譯程序,會發現程序界面回到了傳統的XP樣式。所以,程序在加入UAC后,其資源會與該項發生沖突,因此程序界面才會回到傳統的XP樣式!如何解決呢?下面給出一種較為簡單的方法:
1、去除Enable Runtime themes選項,即不鈎選。
2、把前面的uac.manifest文件內容更換成如下形式:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"/>
</requestedPrivileges>
</security>
</trustInfo>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="CompanyName.ProductName.YourApplication"
type="win32"/>
<description>
Your application description here.
</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
3、其余重復前面的步驟。
再重新編譯程序后,會發現警告信息沒有了,程序界面也保持了新的樣式,而不會再回到XP樣式了。