淺談批處理獲取管理員運行權限的幾種方法

很多用了Win10版本系統的人都會發現,Windows對程序的運行權限是控制得更加嚴格了,即使你將UAC控制放至最低,如果沒有特別賦予外來程序管理員運行權限的話,很多程序都會運行出錯,包括很多用於系統維護的批處理程序由於運行權限不夠都會導致出錯,最簡單的方法莫過於用右鍵點擊程序,然後選擇“以管理員身份運行”,對於那些需要經常使用的程序,我們可以進入程序的屬性裏面勾選上“以管理員身份運行”,這樣每次點擊它都會直接以管理員身份運行了。以上這些都是對單個程序的臨時解決措施。那麼對於衆多的批處理程序,每次都用右鍵覺得很麻煩,又不可能到每個程序的屬性裏面去設置一下,效率低下,那有沒有辦法讓批處理程序能夠自動獲取管理員運行權限呢,讓其直接雙擊即可實現正常運行,答案當然是有的。下面是我從網上找到的幾種提升批處理運行權限的方法,另外也有一些本人自己摸索出來的方法。

方法1:借用VBS腳本
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit

方法2:借用VBS腳本
%1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","::",,"runas",1)(window.close)&exit
exit /B

方法3:借用VBS腳本
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del /f /q "%temp%\getadmin.vbs" >nul
exit /B

方法4:借用第三方程序
nircmd elevate cmd /c "%0"
exit /B

方法5:runas命令
runas /noprofile /user:Administrator "%0"
exit /B

       以上是批處理獲取管理員權限的5種方法,只要把這幾個命令放進批處理優先執行即可,當然還要加上判斷是否已經獲取管理員權限的語句,否則批處理就會無限循環下去。判斷批處理是否已獲取管理員權限的方法,網上用的最多的是下面這句命令:

以方法1爲例:

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (goto UACPrompt) else (goto UACAdmin)
:UACPrompt
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
:UACAdmin
echo 已獲取管理員權限

        用cacls命令來判斷管理員權限固然不錯,但經過實踐我發現cacls返回的errorlevel值不夠穩定,經常會變換出其他不可預知的錯誤碼,造成判斷有誤,導致批處理進入死循環。當然也有人採用能否往系統目錄(比如system32)寫入文件的方法來判斷,我覺得這些都不夠好,後來我發現使用bcdedit命令來判斷比較準確,一般情況下它只會返回兩個錯誤碼0和1,很少見到有其他值出現,目前它是我覺得用來判斷管理員權限最好的方法。

       前3種方法是使用了VBS腳本,方法1最簡潔,一行代碼就搞定了,但我發現Win10系統似乎不支持短文件名,一旦文件路徑出現空格,該命令就會出錯;方法2也不賴,只有兩行代碼,在Win10系統能穩定運行;方法3比較複雜,還會產生臨時文件,但也能在Win10系統穩定運行;第4種方法使用了第三方程序,不會產生臨時文件,代碼也簡單,但你得先下載nircmd.exe這個工具;第5種方法採用了系統自帶的命令runas來實現,理論上是沒問題的,但實際上比較難實現,首先要求Administrator管理員賬戶必須已經啓用,其次還必須設置有管理員密碼,否則都會得到拒絕的提示。

       以上5種方法都可以提升批處理的運行權限,可根據具體情況選擇最合適的方法,我比較喜歡方法2,代碼簡潔,運行穩定,不會產生臨時文件,其次方法4也不錯。如果您有更好的批處理提權方法,也可以跟大家一起分享!共同進步!

 附:批處理獲取管理員權限完整代碼

@echo off
if exist "%SystemRoot%\SysWOW64" path %path%;%windir%\SysNative;%SystemRoot%\SysWOW64;%~dp0
bcdedit >nul
if '%errorlevel%' NEQ '0' (goto UACPrompt) else (goto UACAdmin)
:UACPrompt
%1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","::",,"runas",1)(window.close)&exit
exit /B
:UACAdmin
cd /d "%~dp0"
echo 當前運行路徑是:%CD%
echo 已獲取管理員權限
pause

https://www.cnblogs.com/conducer/p/10591614.html

發佈了4 篇原創文章 · 獲贊 167 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章