怎樣自動以管理員身份運行bat文件?
有些.bat格式的文件,直接運行無效,右鍵-以管理員身份運行後可以。有什麼辦法可以將它設置為雙擊時直接自動以管理員身份運行?
@echo off
&>nul 2&>1 "%SYSTEMROOT%system32cacls.exe" "%SYSTEMROOT%system32configsystem"
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" )
pushd "%CD%"
CD /D "%~dp0"
在別地方看到的,最下面接你寫的批處理
可以給bat文件創建一個快捷方式,用滑鼠右鍵單擊快捷方式,選擇「屬性」,打開屬性中的「快捷方式」選項卡,點擊「高級」,在新窗口中勾選「用管理員身份運行」,點擊「確定」。這樣只要打開bat文件的快捷方式即可自動以管理員身份運行它。
由 @Right 的答案修改而來(由 @周靖峰 提醒,最好先將當前目錄切換到bat所在文件夾里):
@echo off
cd /d "%~dp0"
cacls.exe "%SystemDrive%System Volume Information" &>nul 2&>nul
if %errorlevel%==0 goto Admin
if exist "%temp%getadmin.vbs" del /f /q "%temp%getadmin.vbs"
echo Set RequestUAC = CreateObject^("Shell.Application"^)&>"%temp%getadmin.vbs"
echo RequestUAC.ShellExecute "%~s0","","","runas",1 &>&>"%temp%getadmin.vbs"
echo WScript.Quit &>&>"%temp%getadmin.vbs"
"%temp%getadmin.vbs" /f
if exist "%temp%getadmin.vbs" del /f /q "%temp%getadmin.vbs"
exit
:Admin
:Admin後換行跟自己的批處理;
根據實際情況修改「RequestUAC」「%temp%getadmin.vbs」這兩個欄位吧。我做了補充,
一是對於生成的vbs要做清理嘛;
二是要讓Wscript執行WScript.Quit來結束進程,不然進程里會一直有腳本解釋器在運行;
另外,是關於操作系統的版本這個問題:
(當然可能是自作多情)我考慮了在低於Vista/2008的情況下,關於UAC的問題。我有毒...
UAC並不存在於XP里,嗯。當然我也考慮了把批處理放在低於Vista/2008操作系統里運行的情況:
若是在管理員賬戶(包括超級管理員)下運行,那就不需要前面這個判斷UAC的了;若是在受限賬戶下運行,要拿許可權,我猜就需要Hack點的手段了吧,不是很懂。所以如果需要判斷操作系統的,那就把這段放最前面:
@echo off
ver|findstr "[6,10].[0-9].[0-9][0-9]*" &> nul (goto Main)
ver|findstr "[3-5].[0-9].[0-9][0-9]*" &> nul (goto isBelowNT6)
:isBelowNT6
:Main
(判斷操作系統這個來源於網路)
@echo off
title 獲取管理員許可權
mode con cols=100 lines=20
color 3f
:: 開始獲取管理員許可權
setlocal
set uac=~uac_permission_tmp_%random%
md "%SystemRoot%system32\%uac%" 2&>nul
if %errorlevel%==0 ( rd "%SystemRoot%system32\%uac%" &>nul 2&>nul ) else (
echo set uac = CreateObject^("Shell.Application"^)&>"%temp%\%uac%.vbs"
echo uac.ShellExecute "%~s0","","","runas",1 &>&>"%temp%\%uac%.vbs"
echo WScript.Quit &>&>"%temp%\%uac%.vbs"
"%temp%\%uac%.vbs" /f
del /f /q "%temp%\%uac%.vbs" exit )
endlocal
:: 完成獲取,下面可以開始寫你自己的代碼了
echo.
echo 原理:先嘗試在系統目錄下臨時新建一個文件夾,若已獲取管理員許可權或是運行在XP等不需要管理員許可權的
echo 老系統時,是可以新建成功的,此時只需刪除這個臨時新建的文件夾就好了,否則通過創建一個臨時
echo vbs腳本獲取管理員許可權,然後再刪除這個臨時vbs腳本文件。
echo.
echo 提示:當獲取管理員目錄後,你的批處理運行目錄會發生變化,為保證目錄準確,
echo 可通過 cd 切換目錄,例「cd /d %%~dp0」切換回批處理所在目錄
echo.
echo 當前運行目錄: %cd%
echo 批處理所在目錄:%~dp0
echo.
echo 例:切換回批處理所在目錄
echo cd /d %%~dp0
echo.
cd /d %~dp0
echo 當前運行目錄: %cd%
echo 批處理所在目錄:%~dp0
pause
exit
正好看到, 那就一行代碼解決問題吧
%1 start "" mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)exit
--------------------------------------------------------------------
這一行代碼會重新以管理員運行當前的 bat 腳本文件, 注意這行代碼開始的 "%1" 是接收參數用的.
雙擊運行 "%1" 默認初始值為空, 該行代碼執行, 即會執行" start ... ", execute部分為提權執行當前 bat 文件, 並會傳入 "::" 這個注釋符號為參數
則這行代碼變成了注釋 ":: start ... ", 不會執行了, 轉而接著執行下面的 bat 命令, exit 的用處就很明顯了吧~
這樣放在第一行, 下面的所有命令就都是管理員許可權跑的了.
應大家的要求,寫上更加單的答案,就一行代碼,判斷當前腳本是否是管理員啟動:
fltmc&>nul(echo Yes)||(echo NO)
解釋一下:windows下的命令fltmc只有管理員才可以執行,管理員執行的退出碼是0,非管理員執行退出碼是非0,如下:
C:UsersWeijun&>fltmc
篩選器列表失敗,出現錯誤: 0x80070005
拒絕訪問。
C:UsersWeijun&>echo %errorlevel%
1
為什麼用fltmc而不用其他的命令?因為fltmc命令是滿足需求而且在不同windows版本(xp,win7,win10,win server,..)下普遍存在的命令。
"" 和"||"是BAT的組合命令符號,用於連接兩個或多個BAT命令。組合命令"cmd1cmd2"當cmd1失敗時cmd2不會執行。組合命令"cmd1||cmd2"只有當cmd1失敗時,才會執行cmd2。
===================================================================
分隔線
set TempFile_Name=%SystemRoot%System32BatTestUACin_SysRt%Random%.batemp
( echo "BAT Test UAC in Temp" &>%TempFile_Name% ) 1&>nul 2&>nul
if exist %TempFile_Name% (
ECHO Got Administrator Privilege
) else (
ECHO Cannot get Administrator Privilege...
ECHO It will popup the UAC dialog, please click [Yes] to continue.
ECHO Set UAC = CreateObject^("Shell.Application"^) &> "%temp%getadmin.vbs"
ECHO UAC.ShellExecute "cmd.exe", "/k %~s0 %*", "", "runas", 1 &>&> "%temp%getadmin.vbs"
"%temp%getadmin.vbs"
exit /b 2
)
稍微解釋一下:
1,TempFile_Name是一個系統目錄的臨時文件名稱,如果你有寫的許可權,那麼認為具備Administrator用戶許可權了;
2,創建一個臨時vbs文件:"%temp%getadmin.vbs"
3,把兩行代碼寫入這個文件:
4,然後執行這個vbs:"%temp%getadmin.vbs"
%~s0 :當前腳本的全路徑。
%* :當前腳本的所有參數列表。
"runas", 1 :表示以管理員身份運行。
後面還有一個更簡便的方法,我晚點加上。
還有個簡便辦法用WINRAR打自解包,解壓完成執行某批處理,並勾選請求管理員許可權,不過文件大很多,約幾M吧
最簡單辦法,轉成exe,勾上請求管理員許可權就解決了
推薦閱讀: