UAC即Windows 用戶帳戶控制級別
UAC是專門控制用戶帳戶訪問控制的,簡單說UAC就是控制用戶可以訪問Windows系統中的中的哪些信息,不可以訪問哪些信息以及安裝時候UAC(用戶賬戶控制)會根據當前系統的用戶賬戶控制級別提示/不提示運行安裝信息
UAC(用戶賬戶控制)設置有2種方式
1、控制面板\用戶帳戶\用戶帳戶 選擇 更改用戶帳戶控制設置
2、通過程序處理app.manifest清單選項設置requestedExecutionLevel level
通過程序處理app.manifest清單選項設置requestedExecutionLevel level,
app.manifest清單選項文件創建有2種方式
1、項目右鍵,點擊添加文件,找到程序清單文件 創建app.manifest清單文件
2、可以通過 項目右鍵 選擇 屬性 安全性 勾選 啟用ClickOnce 安全設置(N) 自動生成一個app.manifest清單文件,然后取消勾選 啟用ClickOnce 安全設置(N)
上述2種方式創建app.manifest清單文件之后需要設置,如下:
1、如果事想在程序運行的時候擁有管理員權限的話,需要設置requestedExecutionLevel level="requireAdministrator" uiAccess="false",設置以后就可以操作一寫需要特殊權限的文件了,如:C:\program files ,C:\program files x86 ,C:\Windows\system32,注冊表讀寫等等
2、設置requestedExecutionLevel中的level可以設置需要的權限功能,而uiAccess可以用來做一些其他處理,例如 需要特殊權限的文件的讀寫,
可以設置requestedExecutionLevel level="requireAdministrator" uiAccess="false",uiAccess也可以設置程序窗體的置頂,
這里的程序置頂可以設置比系統界面更高的置頂,也就是說可以比一些系統級別的置頂還要高,如任務管理器一樣絕對置頂
效果如下:
新建winform窗體項目,添加app.manifest清單文件之后需要設置 requestedExecutionLevel level="asInvoker" uiAccess="true",
App.Manifest 文件中設置 requestedExecutionLevel level="asInvoker" uiAccess="true"
設置窗體的2個屬性
注意:可能遇到的問題
解決方法是“以管理員權限啟動此程序”。
啟動效果如下:
原文參考鏈接:http://blog.walterlv.com/post/run-desktop-application-above-windows-application.html
讓你的程序置頂到比系統界面都更上層,就像任務管理器/放大鏡一樣絕對置頂
啟動系統自帶的放大鏡程序,我們會發現即便進了 Windows 8 的開始屏幕,或打開了 Windows 10 的開始菜單和消息中心,它也依然顯示在最頂層。如果你為任務管理器開啟置頂效果,你會發現它也能顯示到開始屏幕的頂層。這是怎么做到的呢?
順便解釋下“桌面應用程序”,指的是傳統 Win32 應用程序。解釋下“Windows 應用”,指的是開始屏幕/開始菜單/UAP/UWP 甚至是鎖屏界面這些。
方法
做到這些,需要四個步驟,缺一不可:
第一步:修改 Manifest
前往你程序的 App.Manifest 文件,設置 requestedExecutionLevel
。
1 |
<requestedExecutionLevel level="asInvoker" uiAccess="true" /> |
第二步:修改窗口屬性
這兩個屬性是必須設置的,否則無法達到目的。
1 2 |
ShowInTaskbar=true TopMost=true |
第三步:為程序簽名
第四步:將程序放到受信任的目錄下
C:\program files C:\program files x86 C:\Windows\system32 |
可能遇到的問題
從服務器返回了一個參照
A referral was returned from the server.
感謝 胡承 提供的錯誤和解決方法!
你可能會在按照以上步驟操作后,在執行程序時遇到這樣的錯誤,解決方法是“以管理員權限啟動此程序”。
參考資料
How to make Windows 8 desktop apps shown in Metro UI (like Task Manager)?
https://stackoverflow.com/questions/12873323/how-to-make-windows-8-desktop-apps-shown-in-metro-ui-like-task-manager
Code Signing Notes
http://techsupt.winbatch.com/webcgi/webbatch.exe?techsupt/nftechsupt.web+WinBatch/Manifest+Manifest~Faqs.txt
UIAccess in Manifest Files
https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/4d2e1358-af95-4f4f-b239-68ec7e2525a9/uiaccess-in-manifest-files
Debug Applications with uiAccess Set to “True”
http://blogs.techsmith.com/inside-techsmith/devcorner-debug-uiaccess/
Debugging with uiAccess=true
https://social.msdn.microsoft.com/forums/windowsdesktop/en-us/7a42efab-5ce8-456f-8a58-dfedbc2cefcb/debugging-with-uiaccesstrue
本文會經常更新,請閱讀原文: https://blog.walterlv.com/post/run-desktop-application-above-windows-application.html ,以避免陳舊錯誤知識的誤導,同時有更好的閱讀體驗。
本作品采用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名 呂毅 (包含鏈接: https://blog.walterlv.com ),不得用於商業目的,基於本文修改后的作品務必以相同的許可發布。如有任何疑問,請 與我聯系 (walter.lv@qq.com) 。
如何自動以管理員身份運行.NET程序
windows 7和vista提高的系統的安全性,同時需要明確指定“以管理員身份運行”才可賦予被運行軟件比較高級的權限,比如訪問注冊表等。否則,當以普通身份運行的程序需要訪問較高級的系統資源時,將會拋出異常。
如何讓程序在啟動時,自動要求“管理員”權限了,我們只需要修改app.manifest文件中的配置項即可。
app.manifest文件默認是不存在的,我們可以通過以下操作來自動添加該文件。
(1)進入項目屬性頁。
(2)選擇“安全性”欄目。
(3)將“啟用ClickOnce安全設置”勾選上。
現在,在Properties目錄下就自動生成了app.manifest文件,打開該文件,將trustInfo/security/requestedPrivileges節點的requestedExecutionLevel的level的值修改為requireAdministrator即可。如下所示:
-
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
-
<!-- UAC 清單選項
-
如果要更改 Windows 用戶帳戶控制級別,請用以下節點之一替換
-
requestedExecutionLevel 節點。
-
<requestedExecutionLevel level="asInvoker" uiAccess="false" /> 此項默認
-
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
-
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
-
指定 requestedExecutionLevel 節點將會禁用文件和注冊表虛擬化。
-
如果要利用文件和注冊表虛擬化實現向后
-
兼容性,則刪除 requestedExecutionLevel 節點。
-
-->
-
<!--<requestedExecutionLevel level="asInvoker" uiAccess="false" />-->
-
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
-
</requestedPrivileges>
記住,如果不需要ClickOnce,可以回到項目屬性頁將“啟用ClickOnce安全設置”不勾選。
接下來,重新編譯你的程序就OK了。