讓bat批處理以管理員權(quán)限運(yùn)行的實(shí)現(xiàn)方法
在日常運(yùn)維工作中,為方便對(duì)windows用戶進(jìn)行系統(tǒng)安裝或配置等,使用Windows自帶的批處理(bat文件)是一種最為簡(jiǎn)單快速的方法。
但是,批處理腳本不會(huì)默認(rèn)已管理員身份運(yùn)行,一般情況下,我會(huì)將腳本命名為"XXXXXX(請(qǐng)右鍵點(diǎn)擊,用管理員身份運(yùn)行!).bat",但總有些用戶會(huì)忽略這條提示,直接運(yùn)行,此時(shí)由于權(quán)限不足,導(dǎo)致腳本運(yùn)行失敗。我們可以使用一種變通的方法,讓bat啟動(dòng)時(shí),首先調(diào)用vbs腳本,通過vbs腳本,以管理員身份調(diào)用該bat的 runas 部分
我們的腳本可以寫在runas 下,這樣就點(diǎn)擊該bat腳本,就可以已管理員身份運(yùn)行了
1、第一種方法
有的電腦是非管理員登錄,運(yùn)行程序時(shí),需要提示是否運(yùn)行運(yùn)行。解決方法如下:
@ echo off %1 %2 ver|find "5.">nul&&goto :Admin mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :Admin","","runas",1)(window.close)&goto :eof :Admin //在你的bat開頭加上上面的命令即可 //下面是你需要執(zhí)行的命令 set path=%~dp0 echo install mysql service... echo %path% cd %path%\bin\ mysqld.exe --remove mysql mysqld.exe --install mysql echo start mysql Serviceo "%SystemRoot%"\system32\net start mysql
2、bat腳本獲取管理員權(quán)限
@echo off %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0"
cd /d %~dp0及其用途
在WINDOWS下命令CD / D%?DP0是什么意思
有人可以幫我理解命令cd /d %~dp0及其用途。 再次dos命令如下
cd /d %~dp0
請(qǐng)幫我弄清楚它的含義。
我們來剖析一下。 有三個(gè)部分:
- cd – 這是更改目錄命令。
- /d – 這個(gè)開關(guān)讓cd改變驅(qū)動(dòng)器和目錄。 沒有它,你將不得不做cd %~d0 & cd %~p0 。
- %~dp0 – 這可以進(jìn)一步分為三個(gè)部分:
%0 – 這表示批處理腳本的第零個(gè)參數(shù)。 它擴(kuò)展到batch file本身的名稱。
%~0 – 在那里解開擴(kuò)展參數(shù)的雙引號(hào)( " )。
%dp0 – d和p有擴(kuò)展的修飾符。 d強(qiáng)制添加一個(gè)驅(qū)動(dòng)器號(hào)并添加完整path。
?dp0:d =驅(qū)動(dòng)器,p =path,%0 =此batch file的起始目錄cd /d %~dp0會(huì)將path更改為相同的位置,batch file所在的位置
見for /? 更多細(xì)節(jié)
寫在bat文件的頂端就可以實(shí)現(xiàn)。
3、bat腳本中以管理員權(quán)限執(zhí)行命令
在bat腳本文件第一行加上下面命令:
%1 mshta vbscript:CreateObject(“Shell.Application”).ShellExecute(“cmd.exe”,"/c %~s0 ::","",“runas”,1)(window.close)&&exit
僅提權(quán),將上方代碼塊內(nèi)容復(fù)制到bat開頭即可
ver|findstr "[3-5]\.[0-9]\.[0-9]*" 1>nul 2>nul&&goto :st
如需適配xp及更舊的系統(tǒng),將該句提前并將主體放到:st標(biāo)簽下
fltmc 1>nul 2>nul&& goto :st set parameters= :parameter @if not "%~1"=="" ( set parameters=%parameters% %~1& shift /1& goto :parameter) set parameters="%parameters:~1%" mshta vbscript:createobject("shell.application").shellexecute("%~s0",%parameters%,"","runas",1)(window.close)&exit cd /d %~dp0
因?yàn)闆]找到把環(huán)境全部傳過去的參數(shù)/命令,就手寫了一下參數(shù)傳遞,不過無法處理引號(hào)內(nèi)有空格的參數(shù),會(huì)分成多個(gè)參數(shù),需另找辦法
分析
- 核心:Shell.ShellExecute 方法 對(duì)指定文件執(zhí)行指定操作,以管理員權(quán)限運(yùn)行腳本;也有另一種運(yùn)行cmd.exe加參數(shù)的寫法
- ver命令獲取系統(tǒng)版本號(hào)
- fltmc命令用于判斷是否已擁有管理員權(quán)限
相關(guān)命令/用法
①mshta 命令
mshta vbscript:<commmand>
mshta javascript:<command>
②Shell.ShellExecute 方法(vbs語法)
https://learn.microsoft.com/zh-cn/windows/win32/shell/shell-shellexecute
iRetVal = Shell.ShellExecute( _ sFile, _ [ ByVal vArguments ], _ [ ByVal vDirectory ], _ [ ByVal vOperation ], _ [ ByVal vShow ] _ )
③findstr
findstr [/b] [/e] [/l | /r] [/s] [/i] [/x] [/v] [/n] [/m] [/o] [/p] [/f:<file>] [/c:<string>] [/g:<file>] [/d:<dirlist>] [/a:<colorattribute>] [/off[line]] <strings> [<drive>:][<path>]<filename>[ ...]
注解
所有 findstr 命令行選項(xiàng)都必須位于命令字符串中的 strings 和 filename 之前。
正則表達(dá)式使用文本字符和元字符查找文本模式,而不是確切的字符串。
文本字符是在正則表達(dá)式語法中沒有特殊含義的字符,它只是匹配該字符的出現(xiàn)。 例如,字母和數(shù)字是文本字符。
元字符是正則表達(dá)式語法中具有特殊含義的符號(hào)(運(yùn)算符或分隔符)。
更詳細(xì)的可以參考這篇文章
https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/findstr
④符號(hào)
&:順序執(zhí)行多條命令,無論上一句命令是否執(zhí)行成功
&&:順序執(zhí)行多條命令,當(dāng)沒有正常執(zhí)行上一句命令后停止
||: 順序執(zhí)行多條命令,只有上一句命令執(zhí)行錯(cuò)誤/未執(zhí)行時(shí)繼續(xù)
%n:參數(shù),%0為腳本本身
1>nul:不顯示命令運(yùn)行的正確提示
2>nul:不顯示錯(cuò)誤提示
>:重定向
nul:空設(shè)備
@: 命令行回顯屏蔽符
|:命令管道符,將命令結(jié)果作為參數(shù)
冒號(hào):字符串截取、標(biāo)簽
雙冒號(hào):作為注釋使用
4、自動(dòng)以管理員身份運(yùn)行批處理(bat)文件
示例代碼如下
@ECHO OFF setlocal EnableDelayedExpansion color 3e title 添加服務(wù)配置 PUSHD %~DP0 & cd /d "%~dp0" %1 %2 mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :runas","","runas",1)(window.close)&goto :eof :runas ::填寫自己的腳本 echo 執(zhí)行完畢,任意鍵退出 pause >nul exit
5、以管理員權(quán)限執(zhí)行bat腳本
只需要在你編寫的.bat文件的開頭加上以下腳本,然后雙擊.bat文件即是以管理員權(quán)限執(zhí)行
@echo off&color 17 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 當(dāng)前運(yùn)行路徑是:%CD% echo 已獲取管理員權(quán)限
6、如何讓BAT和CMD批處理以管理員身份運(yùn)行
如何讓BAT和CMD批處理以管理員身份運(yùn)行?
有些批處理需要很高的權(quán)限執(zhí)行才能達(dá)到我們所需要的效果,將以下代碼放入批處理最頂部就可以實(shí)現(xiàn)以管理員身份運(yùn)行了。
@echo off >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if '%errorlevel%' NEQ '0' ( goto UACPrompt ) else ( goto gotAdmin ) :UACPrompt echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs" "%temp%\getadmin.vbs" exit /B :gotAdmin if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
7、命令行CMD批處理自動(dòng)以管理員身份運(yùn)行的正確方法
修正了路徑有空格時(shí)的問題
在批處理開頭加上:
適用于無參數(shù)
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c "^&chr(34)^&"%~0"^&chr(34)^&" ::","%cd%","runas",1)(window.close)&&exit
適用于一參數(shù)
%2 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c "^&chr(34)^&"%~0"^&chr(34)^&" "^&chr(34)^&"%~1"^&chr(34)^&" ::","%cd%","runas",1)(window.close)&&exit
更多參數(shù)的以此類推
運(yùn)行批處理時(shí)多加一個(gè)參數(shù)::,這句就不會(huì)執(zhí)行
為了兼容8.3短路徑,可把%~0
等換成%~s0
等
理論上是沒問題,但啟動(dòng)路徑有時(shí)不可靠,之后可能還要pushd
或cd /d
8、bat文件以管理員權(quán)限運(yùn)行的幾種方式
1、創(chuàng)建bat快捷方式,然后右鍵快捷方式-->properties-->advanced-->Run as administrator。
2、下載bat轉(zhuǎn)成exe工具,將bat轉(zhuǎn)成exe,然后右鍵exe-->properties-->Compatibility-->Run as administrator。
3、以管理員權(quán)限運(yùn)行cmd,然后dos框中運(yùn)行相應(yīng)的bat。
9、BAT批處理提權(quán)
給BAT批處理提權(quán),基本都是借助VBS腳本提權(quán)
@echo off >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if '%errorlevel%' EQU '5' ( goto UACPrompt ) else ( goto gotAdmin ) :UACPrompt echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs" "%temp%\getadmin.vbs" exit /B :gotAdmin if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" ) pushd "%CD%" CD /D "%~dp0" rem 后面跟想要執(zhí)行的批處理
將這種方法的原理是:會(huì)先執(zhí)行一個(gè)命令,該命令需要管理員權(quán)限,如果沒有管理員權(quán)限就會(huì)返回錯(cuò)誤碼5,然后在系統(tǒng)的Temp文件創(chuàng)建一個(gè)VBS腳本,在VBS腳本里用ShellExecute方法以runas的方式開一個(gè)進(jìn)程,runas開的進(jìn)程會(huì)以管理員權(quán)限運(yùn)行。開的那個(gè)進(jìn)程會(huì)再執(zhí)行這個(gè)批處理,此時(shí)因?yàn)橛袡?quán)限,會(huì)返回0,然后刪除VBS文件,執(zhí)行自己寫的那部分腳本。
會(huì)出現(xiàn)的問題:如果需要從外界傳參數(shù)給該bat批處理,需要在下面這個(gè)位置傳,但是傳過去的參數(shù)需要遵守VBS里的語法和ShellExecute的參數(shù)格式。如果出現(xiàn)了空格會(huì)十分麻煩。
echo UAC.ShellExecute "%~s0", "這里輸入?yún)?shù)", "", "runas", 1 >> "%temp%\getadmin.vbs"
到此這篇關(guān)于讓bat批處理以管理員權(quán)限運(yùn)行的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)管理員權(quán)限運(yùn)行bat內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
批處理bat判斷一個(gè)文件在最近5分鐘內(nèi)是否被更新過的代碼
這篇文章主要介紹了批處理bat判斷一個(gè)文件在最近5分鐘內(nèi)是否被更新過的代碼,需要的朋友可以參考下2014-07-07批處理文件(bat文件)注冊(cè)dll批量注冊(cè)dll
有時(shí)候用電腦的時(shí)候遇到由于DLL文件丟失或損壞而造成的種種故障,大家都只知道只要重新注冊(cè)一下DLL文件就可以了2012-05-05bat中errorlevel與%errorlevel%的區(qū)別
這篇文章主要介紹了bat中errorlevel與%errorlevel%的區(qū)別,需要的朋友可以參考下2014-05-05用批處理實(shí)現(xiàn)auto.exe的免疫功能
網(wǎng)上有高手實(shí)現(xiàn)了auto.exe的手工設(shè)置auto免疫,我發(fā)現(xiàn)手工操作對(duì)于新手麻煩了點(diǎn),特自己寫了個(gè)批處理方法大家使用。2007-12-12