最近換用Windows7系統了,可是在用LabVIEW發佈可執行文件後出現了一個新的問題。那就是在進行一些文檔的讀寫操作時提示權限不夠。究其原因,是Win7採用了比XP更嚴格的權限等級。
Win7把可執行文件的執行等級分爲3級:
asInvoker:以普通用戶權限運行程序,不會提示需要取得管理員權限,不能讀寫受保護的文檔。這也是LabVIEW發佈exe文件的默認等級。
highestAvailable:以能夠取得的最高權限運行程序。如果當前用戶只有普通用戶權限,則不會提示需要取得管理員權限,也不能讀寫受保護的文檔;如果當前用戶爲管理員權限,則在運行時彈出一個窗口提示需要確認使用管理員權限運行程序,確認後可以讀寫受保護的文檔。
requireAdministrator:運行時彈出界面,要求確認已管理員權限運行程序,或者要求輸入管理員密碼。確認後可以讀寫受保護的文檔。
由以上可以看出,我們需要把執行等級提高到requireAdmministrator才能正常的讀取受保護的文檔。而這個等級是由manifest屬性來控制的,要修改它需要使用微軟提供的manifest 工具即mt.exe.(在附件中提供了下載)
把mt.exe放到和要修改的exe文件相同的目錄下(不是必須這樣做,但這樣可以省去輸入長串的路徑),打開命令行cmd.exe並進入該目錄, 輸入以下命令(假設要修改的exe文件的名稱爲XXX.exe):
mt.exe -inputresouce:"XXX.exe" -out:"XXX.manifest"
該目錄下會生成一個XXX.manifest文件,用記事本打開,會看到它是一個XML格式的文檔,大體內容如下:
<?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="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
把其中的 level="asInvoker"修改爲level="requireAdministrator"並保存。
然後在命令行中輸入以下命令:
mt.exe -manifest "XXX.manifest" -outputresource:"XXX.exe"
如果沒有報錯,就修改成功了,exe文件的圖標上會多一個小盾牌,也可以刪除manifest文檔後再次執行第一條命令來確認。
如果報錯,很可能是拼寫錯誤。
參考文獻:
http://zone.ni.com/reference/en-XX/help/371361F-01/lvconcepts/uac_app_manifests_and_dgsn/
http://zone.ni.com/reference/en-XX/help/371361F-01/lvhowto/editing_app_manifests/