怎樣自動以管理員身份運行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,勾上請求管理員許可權就解決了


推薦閱讀:

如何用批處理刪除指定大小的文件?

TAG:計算機 | 批處理 | 許可權管理 |