เป็นไปได้ไหมที่จะเรียกใช้ไฟล์แบตช์ในฐานะผู้ดูแลระบบโดยอัตโนมัติ


48

ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะเปิดไฟล์แบตช์ในฐานะผู้ดูแลระบบโดยอัตโนมัติเมื่อคุณดับเบิลคลิกที่ไฟล์แบตช์เพราะคำสั่งจะต้องทำงานด้วยสิทธิ์ระดับผู้ดูแล

หมายเหตุ: ฉันรู้เกี่ยวกับวิธีแก้ปัญหาของการคลิกขวาที่ไฟล์และคลิกRun As Administratorแต่นี่ไม่ใช่โซลูชันอัตโนมัติ



ฉันสามารถทำให้มันใช้งานได้สำหรับฉัน: stackoverflow.com/a/13811519/27928
Rohit

2
การคลิกซ้ายสองครั้งโดยอัตโนมัติมีวิธีใดมากกว่าการคลิกซ้ายและคลิกขวาหนึ่งครั้ง
jiggunjer

คำตอบ:


44

ใช่คุณสามารถเรียกใช้ไฟล์แบตช์ด้วยสิทธิ์ระดับผู้ดูแล น่าเสียดายที่คุณไม่สามารถทำสิ่งนี้ได้โดยตรงจากไฟล์แบตช์ด้วยตนเอง คุณจะต้องสร้างทางลัดของไฟล์ชุดนั้นก่อนและเปลี่ยนคุณสมบัติของทางลัดนั้นเพื่อให้สามารถใช้งานได้

ในการสร้างทางลัดมีหลายวิธี แต่วิธีที่ง่ายที่สุดและเร็วที่สุดคือการใช้ตัวเลือกส่งไปยังในเมนูบริบท

Right click batch file > Send to > Desktop (create shortcut)

แน่นอนคุณสามารถส่งทางลัดไปยังที่ที่คุณต้องการ หากต้องการยกระดับไฟล์แบตช์ให้ทำงานในฐานะผู้ดูแลระบบให้ทำตามขั้นตอนด้านล่าง:

  1. คลิกขวาที่ทางลัดที่คุณเพิ่งสร้างขึ้น (ควรอยู่บนเดสก์ท็อปหรือที่ที่คุณเคยส่งไป)
  2. ใต้แท็บทางลัดให้คลิกปุ่มขั้นสูง ...
  3. เลือกช่องทำเครื่องหมาย Run as administrator และกด OK เพื่อทั้งหน้าต่างโมดัลและหน้าต่างคุณสมบัติหลัก
  4. เรียกใช้ช็อตคัตโดยดับเบิลคลิกและแบตช์ไฟล์ควรทำงานในฐานะผู้ดูแลระบบ

1
คุณสามารถบังคับให้แบตช์ไฟล์เรียกทางลัดได้ตลอดเวลาและให้ทางลัดผ่านพารามิเตอร์เพื่อไม่ให้เรียกทางลัด คุณจะใส่สิ่งที่ต้องการif "%~1" == "" start %USERPROFILE%\Desktop\Shortcut.lnk && GOTO :EOFด้านล่างขวา@echo offและทำให้การเชื่อมโยงทางลัดไปยังแทนเพียงprogram.bat a program.bat
trlkly

2
Ifedi เขียนว่า "คำตอบที่ยอมรับ [หนึ่งจาก Tech1337] นี้ใช้งานได้จริง แต่ฉันพบว่าใน Windows 7 ฉันต้องอดทนกับ UAC dialog ทุกครั้งที่มีการคลิกทางลัด" <- แม้ว่าบางคนจะบอกว่ามันใช้งานได้โดยไม่มี UAC
barlop

สำหรับฉันทางลัดจะไม่ทำงานในไดเรกทอรีปัจจุบันเมื่อดับเบิลคลิกแม้ว่า. bat จะทำงาน แม้จะมีคุณสมบัติ "เริ่มใน:" บนทางลัดที่กรอกข้อมูล ดังนั้นตรวจสอบให้แน่ใจว่า. bat ของคุณระบุเส้นทางไฟล์แบบเต็ม
Rob Mosher

29

ตามที่โพสต์ในคำตอบโดย Ben Gripka ไปยังคำถามอื่น:

REM --add the following to the top of your bat file--


@echo off

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"=""
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

ใช่ฉันพบสิ่งนี้และกำลังใช้งานอยู่ ขอบคุณทุกคน!
Antp

เป็นหลักสิ่งที่ฉันกำลังมองหา หวังว่าจะมีวิธีการทำเช่นนี้โดยไม่ใช้ VB หรือไม่?
เชฟฟาโรห์

@ChefPharaoh สิ่งนี้จะสร้างคอนโซลที่ยกระดับเพื่อเรียกใช้ไฟล์แบตช์ คุณสามารถทำเช่นเดียวกันกับสคริปต์ PowerShell
jiggunjer

นี่คือคำตอบที่ดีที่สุดสำหรับฉัน
kasperhj

4

คำตอบที่ยอมรับนั้นใช้งานได้จริง แต่ฉันพบว่าใน Windows 7 ฉันต้องอดทนโต้ตอบ UAC ทุกครั้งที่มีการคลิกทางลัด IMHO นี้เบี่ยงเบนจาก "อัตโนมัติ" อย่างมีนัยสำคัญในคำถามนี้!

จากนั้นฉันก็พบว่าในสถานการณ์ของตัวเอง.batไฟล์ที่เป็นปัญหาจะถูกเรียกใช้โดย Task Scheduler ในกรณีนี้ตรวจสอบRun with highest privilegesตัวเลือกบนGeneralแท็บของงานดูแลปัญหาอย่างดี .batจะดำเนินการแล้วในฐานะผู้ดูแลไม่ยุ่งยากใด ๆ

PS: ฉันไม่ได้ตระหนักว่าฉันไม่สามารถอัปโหลดภาพในคำตอบนี้ได้เพราะตอนนี้ฉันมีสกรีนช็อตเล็ก ๆ น่านั่งอยู่กับฉันแล้วตอนนี้! หรือฉัน


2
หากคุณเพิ่มลิงค์ไปยังภาพบางคนจะใส่เข้าไปในภาพให้คุณ
Ramhound

@Ramhound เพิ่มลิงค์ไปยังภาพ? รูปภาพอยู่บนเดสก์ท็อปของฉันไม่ใช่ที่ที่ออนไลน์ หรือแน่นอนฉันหายไปบางอย่าง
Ifedi Okonkwo

ใช่; คุณอัปโหลดพวกเขา คุณไม่สามารถอินไลน์สกรีนช็อตในคำตอบของคุณ
Ramhound

ปุ่มอัปโหลดนั้นไม่ได้อยู่ที่นั่นหรือฉันตาบอดเมื่อวานครึ่ง! ฉันแน่ใจว่ามันเป็นหลัง ยังไงก็ตามฉันอัปโหลดไฟล์เสร็จอย่างมากเท่านั้นที่จะบอกว่าฉันต้องการตัวแทนจาก 10 เพื่อโพสต์ภาพ ขอบคุณ
Ifedi Okonkwo

คุณยังสามารถวางลิงก์ในคำตอบได้
Ramhound

4

บน Windows 7

  1. สร้างทางลัดไปยังไฟล์ชุดนั้น

  2. คลิกขวาที่ไฟล์ทางลัด

  3. คลิกปุ่มล่วงหน้าเพื่อค้นหาช่องทำเครื่องหมายสำหรับการทำงานในฐานะผู้ดูแลระบบ

ตรวจสอบภาพหน้าจอด้านล่าง

ภาพหน้าจอ


1
คำพูดของคุณเหมือนกับคำตอบที่ยอมรับ
Antp

ใช่ฉันแค่ต้องการสร้างรายการอย่างง่ายพร้อมภาพหน้าจอสำหรับทุกคนที่กำลังรีบ
fedmich

3
หากมีใครรีบฉันสงสัยว่าพวกเขาจะเลื่อนไปที่ด้านล่างสำหรับคำตอบขอขอบคุณ
Antp

3

คุณสามารถใช้สคริปต์ของฉัน Batch_Admin เพื่อยกระดับผู้ดูแลระบบโดยอัตโนมัติเพื่อใช้ในสคริปต์ประเภทแบทช์ใด ๆ หรือ BAT หรือ. CMD ฟังก์ชั่นนี้ช่วยให้มั่นใจว่าการทำงานบนสภาพแวดล้อมมาตรฐานพร้อมเครื่องมือมาตรฐานและในลักษณะเดียวกันในระบบ Windows ที่แตกต่างกัน มันใช้คำสั่งมาตรฐานและ Windows ในตัวหลายตัว อย่าใช้สคริปต์ภายนอกอื่น ๆ มันสามารถใช้ในการเรียกโปรแกรมใด ๆ ในฐานะผู้ดูแลระบบไม่เพียง แต่สคริปต์ชุด มันพอเพียงในการสร้างสคริปต์ขนาดเล็กซึ่งจากนั้นเรียกโปรแกรมที่ต้องใช้ Administartor ที่ได้รับอนุญาต วางสิ่งนี้ลงในโฟลเดอร์ PATH การค้นหา (จาก% PATH%)

หากต้องการใช้งานคุณเพียงแค่แทรกบรรทัดต่อไปนี้ (ตรงตาม) ลงในสคริปต์แบทช์หลักซึ่งจะเรียกใช้ในฐานะผู้ดูแลระบบ สิ่งนี้ทำได้ดีที่สุดที่ด้านบนสุดของสคริปต์หลักของเราและเป็นสิ่งที่ดีที่สุดก่อนซึ่งจะถูกเรียกผ่านทาง CALL เพิ่มเติมสคริปต์ย่อยบางส่วน (ดูคำอธิบายโดยละเอียดด้านล่าง)

net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

สิ่งนี้สามารถแทรกในสคริปต์ลูกใด ๆ ที่เรียกว่าโดยไวยากรณ์โทร ในการแสดงข้อความในขณะที่ยังไม่มีสิทธิ์ของผู้ดูแลระบบเช่น 5 วินาทีก่อนที่จะโทร Batch_Admin ตั้งค่าตัวแปร "ShowAdminInfo" ตามจำนวนวินาที

SET ShowAdminInfo=5
net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

ดังนั้นมันทำงานอย่างไร:

•โทร UAC.ShellExecute ผ่าน VBScript เพื่อรับสิทธิ์ผู้ใช้

•แบตช์รันสคริปต์หรือ BAT หรือ CMD

•ผู้เรียกสคริปต์สามารถมีช่องว่างชื่อยาวรวมอยู่ในการโทรในคำพูด

•คืนค่าพารามิเตอร์ทั้งหมดเรียกสคริปต์หลักที่ส่งผ่านจากบรรทัดคำสั่งราวกับว่าไม่มีการส่งการโทรและเริ่มบางอย่างตั้งแต่เริ่มต้นพร้อมด้วยอักขระพิเศษเช่นเครื่องหมายอัศเจรีย์ (!) และเปอร์เซ็นต์ (%) และยัง ด้วยวงเล็บ ()

•เก็บตำแหน่งสคริปต์หลักหากมีการโทรเกิดขึ้นในไดเรกทอรีที่สคริปต์นี้เป็นต้นแบบ

• Auxiliary แสดงข้อความถ้าเราตั้งค่าตัวแปร "ShowAdminInfo" เช่น เป็นเวลา 5 วินาทีซึ่งสามารถป้องกันการส่งผ่านสิทธิ์ของผู้ดูแลระบบโดยทันทีเพื่อให้ข้อมูลเพิ่มเติมและความเป็นไปได้ในการตัดสินใจ ตัวอย่างการตั้งค่าที่ต้องตั้งค่า: SET ShowAdminInfo = 5 โดยค่าเริ่มต้นเนื่องจากไม่ได้กำหนดตัวแปรนี้จึงไม่แสดง

•สคริปต์กำลังเรียกใช้ในเส้นทางการค้นหาของระบบ% PATH% และจากทรัพยากรเครือข่ายเช่น: \ Computer \ share \ test.bat

•ป้องกันความเข้าใจผิดในการเขียนไฟล์เสริมที่จำเป็นเมื่อสคริปต์เรียก Batch_Admin หลายตัวในเวลาเดียวกัน มันใช้หมายเลขสุ่มตั้งแต่ 1 ถึง 100

• แต่วิธีที่ดีที่สุดคือใช้กับสคริปต์หลัก การเปลี่ยนไปใช้สิทธิ์ผู้ดูแลระบบมักต้องการให้คุณเรียกใช้สคริปต์อีกครั้งอย่างสมบูรณ์ในหน้าต่างใหม่ในสภาพแวดล้อมใหม่โดยไม่ต้องขอความช่วยเหลือจากตัวแปรถูกตั้งค่าไว้ก่อนหน้านี้ในสคริปต์และค่าตัวแปรเหล่านี้ของเรา . เพียงแค่สคริปต์จะถูกดำเนินการอีกครั้ง

ด้านล่างเป็นสคริปต์แบบสมบูรณ์ Batch_Admin ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้อยู่ในเว็บไซต์ของฉัน

คัดลอกข้อความต่อไปนี้ลงในแผ่นจดบันทึกและบันทึกลงในดิสก์เป็น: Batch_Admin.bat

@echo off
if "%~1"=="" (echo *** Batch_Admin ***&echo.&echo Automatically get admin rights for another Batch. See info inside.&TIMEOUT /T 30>nul&goto:eof)

::  A D M I N I S T R A T O R   - Automatically get admin rights for script batch. Paste this on top:    net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*
::                                Also keep Batch directory localisation and then set variable:   PATH_BAT
::                                if earlier variable "ShowAdminInfo" is empty (not defined) then no info, else showing info with number of seconds
::
::                                Elaboration:  Artur Zgadzaj
setlocal
setlocal DisableDelayedExpansion

SET "Localy="
if exist "%~1"      SET "Localy=YES"
if exist "%~1.BAT"  SET "Localy=YES"
if exist "%~1.CMD"  SET "Localy=YES"
if defined Localy   FOR %%I IN ("%~1") DO SET "PATH_BAT=%%~dI%%~pI"

 SET P1=%~1
 SET Parameters=%*
 SET Parameters=%Parameters:!=^^!%
setlocal EnableDelayedExpansion
 SET Parameters=!Parameters:%P1%=!
 SET Parameters=!Parameters:%%=%%%%!
setlocal DisableDelayedExpansion
 SET Parameters=%Parameters:~3%

net session >nul 2>nul&if not errorlevel 1  goto Administrator_OK

if not defined ShowAdminInfo   goto skip_message_Administrator
echo.
echo Script:  %~1
echo.
echo *****************************************************************
echo ***    R U N N I N G     A S     A D M I N I S T R A T O R    ***
echo *****************************************************************
echo.
echo Call up just as the Administrator. You can make a shortcut to the script and set:
echo.
echo          shortcut ^> Advanced ^> Running as Administrator
echo.
echo     Alternatively run once "As Administrator"
echo     or in the Schedule tasks with highest privileges
echo.
echo Cancel Ctrl-C or wait for launch  %ShowAdminInfo%  seconds ...
TIMEOUT /T %ShowAdminInfo% > nul

:skip_message_Administrator
MD %TEMP% 2> nul
SET /A $Admin$=%RANDOM% * 100 / 32768 + 1

SET "Percent="
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul
echo %Parameters% > "%TEMP%\$Admin_%$Admin$%_Test.bat"
if not exist "%TEMP%\$Admin_%$Admin$%_Test.bat"  SET Percent=^"
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul

echo @SET "PATH_BAT=%PATH_BAT%"               > "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
echo @SET "BatchFullName=%BatchFullName%"    >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
if defined Localy  (echo @CD /D "%PATH_BAT%" >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat")
echo @"%~1" %Parameters% %Percent% >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"

echo SET UAC = CreateObject^("Shell.Application"^)                                   > "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
echo UAC.ShellExecute "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat", "", "", "runas", 1 >> "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
"%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
endlocal
exit /B

:Administrator_OK
"%~1" %Parameters%
goto:eof
REM *** A D M I N I S T R A T O R  - Automatically get admin rights  (The End)  ***

ฉันคิดว่านี่คล้ายกันหรือเหมือนกับคำตอบข้างต้น: superuser.com/a/852877/375935
jiggunjer

1

อีกวิธีหนึ่งคือคุณสามารถสร้างไฟล์แบตช์ที่สองได้ซึ่งจะช่วยให้คุณสามารถรันอะไรก็ได้ในฐานะผู้ดูแลระบบในขณะที่ป้อนรหัสผ่านผู้ดูแลระบบเพียงครั้งเดียวเท่านั้น รหัสผ่านจะถูกบันทึกในโทเค็นการรับรองความถูกต้องและทำให้คอมพิวเตอร์บางเครื่องรู้วิธีถอดรหัส

runas /savecred /user:(domain)\(admin user) "(file path to exe,bat,whatever)"

1
@echo off        
:: BatchGotAdmin        
:-------------------------------------        
REM  --> Check for permissions  
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"  
REM --> If error flag set, we do not have admin.  
if '%errorlevel%' NEQ '0' (    echo Requesting administrative privileges...    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  
chkdsk

นอกจากนี้ยังใช้งานได้ที่ : https://social.technet.microsoft.com/Forums/windows/en-US/bc8a4561-d97e-4339-9b1c-9b90e54a7f92/request-elevation-inside-cmdbatch-file


คุณช่วยอธิบายวิธีแก้ปัญหาของคุณได้ไหม?
scai

1
อีกเวอร์ชั่นของsuperuser.com/a/852877/375935
jiggunjer

0

elevateคุณสามารถใช้อรรถประโยชน์บรรทัดคำสั่ง (ลิงก์ดาวน์โหลด - https://drive.google.com/open?id=0Bz7qe_olclTwVGZLUklFMHNxQ00 )

Usage: Elevate [-?|-wait|-k] prog [args]
-?    - Shows this help
-wait - Waits until prog terminates
-k    - Starts the the %COMSPEC% environment variable value and
                executes prog in it (CMD.EXE, 4NT.EXE, etc.)
prog  - The program to execute
args  - Optional command line arguments to prog

สิ่งนี้ไม่ได้นำไปสู่การ Panal UAC หรือไม่
Antp

ที่ปรากฏขึ้น ... แต่มันจะดีกว่าไม่มีอะไร (เห็น "การเข้าถึงถูกปฏิเสธ" .. )
T.Todua

แม้ว่าจะไม่ใช่ "อัตโนมัติ" จริงๆก็ตาม
Antp

0

มันเป็นตัวอย่างในการรันค้างคาวในฐานะผู้ดูแลระบบ มันใช้งานได้สำหรับฉัน

มันจะเป็นเช่นนี้:

if "%~s0"=="%~s1" ( cd %~sp1 & shift ) else (
  echo CreateObject^("Shell.Application"^).ShellExecute "%~s0","%~0 %*","","runas",1 >"%tmp%%~n0.vbs" & "%tmp%%~n0.vbs" & del /q "%tmp%%~n0.vbs" & goto :eof
)
:eof
start Cmd /k "netsh wlan show profile"
pause </

cls
Color 0A
@echo off
echo.
cls
set/p ProfileName=Type the name of the current Wifi signal? 
echo.
start Cmd /k "netsh wlan show profile name=%ProfileName% key=clear"
pause </
exit
pause

ยินดีต้อนรับสู่ Super User! แม้ว่าสิ่งนี้อาจตอบคำถามได้ แต่มันจะเป็นคำตอบที่ดีกว่าถ้าคุณสามารถให้คำอธิบายได้ว่าทำไมถึงเป็นเช่นนั้น
DavidPostill

ยังเป็นอีกตัวแปรหนึ่งของsuperuser.com/a/852877/375935
jiggunjer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.