วิธีร้องขอการเข้าถึงของผู้ดูแลระบบภายในไฟล์แบตช์


179

ฉันพยายามเขียนไฟล์แบตช์เพื่อให้ผู้ใช้ของฉันเรียกใช้จากเครื่อง Vista ด้วย UAC ไฟล์กำลังเขียนไฟล์โฮสต์ใหม่ดังนั้นจึงจำเป็นต้องเรียกใช้ด้วยสิทธิ์ผู้ดูแลระบบ ฉันต้องสามารถส่งอีเมลพร้อมลิงก์ไปยังไฟล์. bat ได้ พฤติกรรมที่ต้องการคือเมื่อคลิกขวาที่ไฟล์และพูดว่า Open พวกเขาจะได้รับหนึ่งในไดอะล็อก UAC ที่ทำให้หน้าจอมืดลง พวกเขาเพิ่งเห็น "การเข้าถึงถูกปฏิเสธ" บนหน้าต่างบรรทัดคำสั่ง

เป็นไปได้ที่จะทำแตกต่างกันอย่างไร


2
หากคุณเจอเรื่องนี้และอย่างฉันมีความสุขกับการใช้ PowerShell อย่าพลาดสายการบินเดียวจาก @ toster-cx ที่สมบูรณ์แบบ!
Michael Repucci

คำตอบ:


353

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

UPDATE: สคริปต์นี้ได้รับการแก้ไขเล็กน้อยเพื่อรองรับอาร์กิวเมนต์บรรทัดคำสั่งและระบบปฏิบัติการ 64 บิต

ขอบคุณ Eneerge @ https://sites.google.com/site/eneerge/scripts/batchgotadmin

@echo off

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
    IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%\SysWOW64\config\system"
) ELSE (
>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"
:--------------------------------------    
    <YOUR BATCH SCRIPT HERE>

22
ฉันเกลียดที่ต้องทำเรื่องไร้สาระชุดแบทเทอร์สกปรก แต่บางครั้งคุณถูกบังคับและสิ่งนี้ใช้งานได้ดี ไชโย!
ด้านไหม้เมื่อ

4
วิธีนี้ไม่ได้ส่งต่อข้อโต้แย้ง คุณรู้วิธีที่สามารถทำได้? โดยพื้นฐานสิ่งที่ฉันสังเกตคือในบรรทัดแรก% 1 มีค่าบางอย่างและในบรรทัดสุดท้าย% 1 เป็นโมฆะ ฉันต้องส่งต่อข้อโต้แย้ง
ง่าม

3
เช่นเดียวกับ FYI สิ่งนี้ได้รับการทดสอบว่าทำงานใน Windows 8 แบบฝังตัว
Robert Snyder

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

2
ฉันพบปัญหาเดียวกันกับ TomDestry ด้วย infinite loop และ return code 2 นี่เป็น Windows 8.1 ฉันรู้ว่ามันใช้งานได้บน Windows 8.0 และไม่สามารถพูดได้อย่างแน่นอนว่าเป็นอัปเดต 8.1 หรืออย่างอื่นที่ทำให้เกิดการออก วิธีแก้ปัญหาที่ใช้งานได้สำหรับฉันคือไม่ใช้ cacls.exe (หรือ icacls) แทน: เซสชันสุทธิ> nul 2> & 1 IF ERRORLEVEL 1 goto UACPrompt ...
crig

55

นี่คือหนึ่งในสายการบินที่ฉันใช้อยู่:

@echo off
if not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit /b)

echo main code here
pause

หมายเหตุ:

  • ทดสอบเฉพาะใน windows 7 และ 10 เท่านั้นคุณอาจต้องยุ่งเกี่ยวกับการอ้างอิง
  • ไม่รองรับการผ่านตามอาร์กิวเมนต์ในตอนนี้

1
หากคุณรู้ว่ามีพารามิเตอร์จำนวนเท่าใดคุณสามารถส่งพารามิเตอร์โดยรวมพารามิเตอร์เหล่านั้นหลังจากพารามิเตอร์am_admin if not "%1"=="am_admin" (powershell start -verb runas '%0' 'am_admin "%~1" "%~2"' & exit)จะเป็นหนึ่งในที่ที่พวกเขาอยู่
Tony Brix

ยังเป็นไปได้ที่จะใช้'am_admin %*'ในการส่งผ่านทุกอย่างไม่ได้เล่นได้ดีด้วยคำพูดและช่องว่างสรรพสินค้าใหญ่: / คุณสามารถใช้shiftในชุดจะปรากฏหาเรื่องปิดแรกจึงแก้ไข args %0ทั้งหมดยกเว้น
toster-cx

นี่เป็นคำตอบที่ดี แต่ไม่ควรยอมรับเพราะไม่ควรตรวจสอบว่าในการเรียกใช้ครั้งแรกนั้นถูกเรียกใช้ด้วยสิทธิ์ ADMIN หรือไม่
T.Todua

เพื่อให้ไดเรกทอรีการทำงานเพิ่มcd /D %~dp0หลังจากif not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit /b)
Pedro Duarte

คำตอบที่ดี. ใช้งานได้ง่ายในขณะที่สิ่งสคริปต์ VB สร้างวงวนไม่สิ้นสุดแม้จะมีสิทธิ์เขียนสำหรับ% temp%
Twonky

19

นี่คือรหัสของฉัน! มันดูใหญ่ แต่ส่วนใหญ่เป็นบรรทัดความคิดเห็น (บรรทัดที่ขึ้นต้นด้วย: :)

คุณสมบัติ:

  • การส่งต่ออาร์กิวเมนต์แบบเต็ม
  • ไม่เปลี่ยนโฟลเดอร์ทำงาน
  • การจัดการข้อผิดพลาด
  • ยอมรับเส้นทางที่มีวงเล็บ (ยกเว้นโฟลเดอร์% TEMP%)
  • รองรับเส้นทาง UNC
  • การตรวจสอบโฟลเดอร์ที่แมป (เตือนคุณว่าผู้ดูแลระบบไม่สามารถเข้าถึงไดรฟ์ที่แมปได้)

  • สามารถใช้เป็นห้องสมุดภายนอก (ตรวจสอบโพสต์ของฉันที่หัวข้อนี้: https://stackoverflow.com/a/30417025/4932683 )

  • สามารถเรียกได้เมื่อ / หากจำเป็นที่ใดก็ได้ในรหัสของคุณ

เพียงแนบไฟล์นี้ไว้ที่ส่วนท้ายของแบตช์ไฟล์ของคุณหรือบันทึกเป็นไลบรารี (ตรวจสอบด้านบน)

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:RequestAdminElevation FilePath %* || goto:eof
:: 
:: By:   Cyberponk,     v1.5 - 10/06/2016 - Changed the admin rights test method from cacls to fltmc
::          v1.4 - 17/05/2016 - Added instructions for arguments with ! char
::          v1.3 - 01/08/2015 - Fixed not returning to original folder after elevation successful
::          v1.2 - 30/07/2015 - Added error message when running from mapped drive
::          v1.1 - 01/06/2015
:: 
:: Func: opens an admin elevation prompt. If elevated, runs everything after the function call, with elevated rights.
:: Returns: -1 if elevation was requested
::           0 if elevation was successful
::           1 if an error occured
:: 
:: USAGE:
:: If function is copied to a batch file:
::     call :RequestAdminElevation "%~dpf0" %* || goto:eof
::
:: If called as an external library (from a separate batch file):
::     set "_DeleteOnExit=0" on Options
::     (call :RequestAdminElevation "%~dpf0" %* || goto:eof) && CD /D %CD%
::
:: If called from inside another CALL, you must set "_ThisFile=%~dpf0" at the beginning of the file
::     call :RequestAdminElevation "%_ThisFile%" %* || goto:eof
::
:: If you need to use the ! char in the arguments, the calling must be done like this, and afterwards you must use %args% to get the correct arguments:
::      set "args=%* "
::      call :RequestAdminElevation .....   use one of the above but replace the %* with %args:!={a)%
::      set "args=%args:{a)=!%" 
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEDELAYEDEXPANSION & set "_FilePath=%~1"
  if NOT EXIST "!_FilePath!" (echo/Read RequestAdminElevation usage information)
  :: UAC.ShellExecute only works with 8.3 filename, so use %~s1
  set "_FN=_%~ns1" & echo/%TEMP%| findstr /C:"(" >nul && (echo/ERROR: %%TEMP%% path can not contain parenthesis &pause &endlocal &fc;: 2>nul & goto:eof)
  :: Remove parenthesis from the temp filename
  set _FN=%_FN:(=%
  set _vbspath="%temp:~%\%_FN:)=%.vbs" & set "_batpath=%temp:~%\%_FN:)=%.bat"

  :: Test if we gave admin rights
  fltmc >nul 2>&1 || goto :_getElevation

  :: Elevation successful
  (if exist %_vbspath% ( del %_vbspath% )) & (if exist %_batpath% ( del %_batpath% )) 
  :: Set ERRORLEVEL 0, set original folder and exit
  endlocal & CD /D "%~dp1" & ver >nul & goto:eof

  :_getElevation
  echo/Requesting elevation...
  :: Try to create %_vbspath% file. If failed, exit with ERRORLEVEL 1
  echo/Set UAC = CreateObject^("Shell.Application"^) > %_vbspath% || (echo/&echo/Unable to create %_vbspath% & endlocal &md; 2>nul &goto:eof) 
  echo/UAC.ShellExecute "%_batpath%", "", "", "runas", 1 >> %_vbspath% & echo/wscript.Quit(1)>> %_vbspath%
  :: Try to create %_batpath% file. If failed, exit with ERRORLEVEL 1
  echo/@%* > "%_batpath%" || (echo/&echo/Unable to create %_batpath% & endlocal &md; 2>nul &goto:eof)
  echo/@if %%errorlevel%%==9009 (echo/^&echo/Admin user could not read the batch file. If running from a mapped drive or UNC path, check if Admin user can read it.)^&echo/^& @if %%errorlevel%% NEQ 0 pause >> "%_batpath%"

  :: Run %_vbspath%, that calls %_batpath%, that calls the original file
  %_vbspath% && (echo/&echo/Failed to run VBscript %_vbspath% &endlocal &md; 2>nul & goto:eof)

  :: Vbscript has been run, exit with ERRORLEVEL -1
  echo/&echo/Elevation was requested on a new CMD window &endlocal &fc;: 2>nul & goto:eof
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

ตัวอย่างการใช้งาน

:EXAMPLE
@echo off

 :: Run this script with elevation
 call :RequestAdminElevation "%~dpfs0" %* || goto:eof

  echo/I now have Admin rights!
  echo/
  echo/Arguments using %%args%%:    %args%
  echo/Arguments using %%*: %*
  echo/%%1= %~1
  echo/%%2= %~2
  echo/%%3= %~3

  echo/
  echo/Current Directory: %CD%
  echo/
  echo/This file: %0
  echo/

pause &goto:eof

[here you paste the RequestAdminElevation function code]

ใช้งานได้ดี แต่ฉันต้องเปลี่ยนสายเพื่อให้มันใช้งานได้ &fc;: 2>nulในset "_FN=_%~ns1" & echo/%TEMP%| findstr /C:"(" >nul && (echo/ERROR: %%TEMP%% path can not contain parenthesis &pause &endlocal &fc;: 2>nul & goto:eof)คือการตั้งค่า errorlevel เพื่อ 1. ฉันออกบิตที่และการทำงานที่สมบูรณ์แบบ ฉันใช้ Windows 10 Home
Knyri

โฟลเดอร์% temp% ของคุณมีวงเล็บอยู่ในเส้นทางไหม เฉพาะในกรณีนี้ควรตั้งค่าระดับความผิดพลาด 1
cyberponk

Nope มันจำเป็นต้องมีหรือไม่fc;:ตั้งแต่มันไป: eof ใช่ไหม? ฉันไม่แน่ใจว่าทำไมสิ่งเล็กน้อยที่ทำให้เกิดปัญหาเช่นกันเพราะมันควรจะได้รับการดำเนินการ
Knyri

"fc ;: 2> nul" มีเจตนาที่จะตั้งค่า ERRORLEVEL 1 ก่อนออกเพื่อส่งสัญญาณข้อผิดพลาด คุณช่วยกรุณาลบ @echo off และทำการ run แล้วส่งเอาท์พุตในข้อความส่วนตัวได้ไหม? ขอบคุณ!
cyberponk

อย่างไรก็ตามการecho/%TEMP%| findstr /C:"(" >nulทดสอบหากมี(อักขระใน%temp%ตัวแปรสภาพแวดล้อมของyout และควรเรียกใช้ส่วนหลังจาก&&บวกถ้า มันแปลกที่(การทดสอบของคุณกลับมาเป็นบวก
cyberponk

7

อีกวิธีคือ

  • สร้างทางลัดภายในเครื่องและตั้งค่าให้เรียกการอนุญาตของผู้ดูแลระบบ [Properties, Advanced, Run as Admin]

แล้ว

  • ส่งทางลัดให้ผู้ใช้ของคุณ [หรือลิงค์ไปยังทางลัดมากกว่าหนึ่งทางไปยังไฟล์แบตช์เอง]

เดนิส

[เพิ่มหลังจากนั้น - ใช่ฉันไม่ได้สังเกตวันที่ของกระทู้นี้]


6

ทางออกของ Ben Gripka ทำให้เกิดลูปไม่สิ้นสุด ชุดของเขาทำงานเช่นนี้ (รหัสหลอก):

IF "no admin privileges?"
    "write a VBS that calls this batch with admin privileges"
ELSE
    "execute actual commands that require admin privileges"

อย่างที่คุณเห็นนี่จะทำให้เกิดการวนซ้ำไม่สิ้นสุดหาก VBS ล้มเหลวในการขอสิทธิ์ผู้ดูแลระบบ

อย่างไรก็ตามการวนซ้ำไม่สิ้นสุดสามารถเกิดขึ้นได้แม้ว่าจะมีการร้องขอสิทธิ์ของผู้ดูแลระบบสำเร็จแล้วก็ตาม

การตรวจสอบไฟล์แบตช์ของ Ben Gripka นั้นเป็นเรื่องที่เกิดข้อผิดพลาดได้ง่าย ฉันเล่นกับแบตช์และสังเกตว่ามีสิทธิ์ของผู้ดูแลระบบแม้ว่าการตรวจสอบจะล้มเหลว ที่น่าสนใจการตรวจสอบทำงานตามที่คาดไว้ถ้าฉันเริ่มแบตช์ไฟล์จาก windows explorer แต่มันไม่ได้เกิดขึ้นเมื่อฉันเริ่มต้นจาก IDE ของฉัน

ดังนั้นฉันแนะนำให้ใช้สองไฟล์แบตช์แยกกัน ไฟล์แรกสร้าง VBS ที่เรียกไฟล์แบตช์ที่สอง:

@echo off

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

"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"

ที่สองชื่อ "my_commands.bat" และอยู่ในไดเรกทอรีเดียวกันกับที่แรกประกอบด้วยคำสั่งจริงของคุณ:

pushd "%CD%"
CD /D "%~dp0"
REM Your commands which require admin privileges here

สิ่งนี้ทำให้ไม่มีการวนซ้ำไม่สิ้นสุดและยังลบการตรวจสอบสิทธิ์ผู้ดูแลระบบที่ผิดพลาด


ทำงานให้คุณ? น่าเศร้าสำหรับฉันนี่และสิ่งอื่น ๆ ทั้งหมดที่นี่และจากหัวข้ออื่น ๆล้มเหลวเนื่องจากปัญหาพื้นฐานเดียวกัน "runas" parm (หรือคำสั่ง) ล้มเหลวเมื่อใดก็ตามที่ Shell Object ถูกสร้างขึ้นโดยทางอ้อมจากภายในโปรแกรมอื่น หัวข้อที่น่าสนใจที่นี่
Laurie Stearn

ทำงานให้ฉัน :)
Sritam Jagadev

6

โซลูชัน PowerShell อื่น ...

นี่ไม่เกี่ยวกับการเรียกใช้สคริปต์ชุดเป็นผู้ดูแล แต่วิธีการยกระดับโปรแกรมอื่นจากชุด ...

ฉันมีไฟล์ "wrapper" สำหรับ exe พวกเขามี "ชื่อไฟล์รูท" เหมือนกัน แต่เป็นนามสกุลเสริม ฉันสามารถเปิดใช้งาน exe ในฐานะผู้ดูแลระบบและตั้งค่าไดเรกทอรีการทำงานเป็นไดเรกทอรีที่มีสคริปต์ด้วยการเรียกใช้ PowerShell หนึ่งบรรทัดต่อไปนี้:

@powershell "Start-Process -FilePath '%~n0.exe' -WorkingDirectory '%~dp0' -Verb RunAs"

ข้อมูลเพิ่มเติม

มีStart-Processตัวเลือกเพิ่มเติมมากมายให้คุณเลือก! ชำระเงิน: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6

โปรดทราบว่าฉันใช้@คำนำหน้า นั่นเทียบเท่ากับ@echo offหนึ่งบรรทัด ฉันใช้%~n0ที่นี่เพื่อรับ "ชื่อรูท" ของแบตช์สคริปต์จากนั้นฉันเชื่อมต่อกัน.exeเพื่อชี้ไปที่ไบนารี adjancent การใช้%~dp0จัดเตรียมพา ธ แบบเต็มไปยังไดเร็กทอรีที่แบตช์อยู่ และแน่นอนพารามิเตอร์ให้ระดับความสูง-Verb RunAs


4

ฉันรู้ว่านี่ไม่ใช่วิธีแก้ปัญหาสำหรับ OP แต่เนื่องจากฉันแน่ใจว่ามีกรณีการใช้งานอื่น ๆ อีกมากมายที่นี่ฉันคิดว่าฉันจะแบ่งปัน

ฉันมีปัญหากับตัวอย่างโค้ดทั้งหมดในคำตอบเหล่านี้ แต่ฉันพบแล้ว: http://www.robotronic.de/runasspcEn.html

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


3

@echo offและtitleสามารถมาก่อนรหัสนี้:

net session>nul 2>&1
if %errorlevel%==0 goto main
echo CreateObject("Shell.Application").ShellExecute "%~f0", "", "", "runas">"%temp%/elevate.vbs"
"%temp%/elevate.vbs"
del "%temp%/elevate.vbs"
exit

:main
    <code goes here>
exit

คำตอบอื่น ๆ อีกมากเป็น overkill ถ้าคุณไม่ต้องกังวลเกี่ยวกับสิ่งต่อไปนี้:

  • พารามิเตอร์
  • ไดเรกทอรีทำงาน ( cd %~dp0จะเปลี่ยนเป็นไดเรกทอรีที่มีไฟล์แบตช์)

3
@echo off 
Net session >nul 2>&1 || (PowerShell start -verb runas '%~0' &exit /b)
Echo Administrative privileges have been got. & pause

การทำงานด้านบนของ Windows 10 เวอร์ชั่น 1903 ของฉัน


1

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

ระวังคุณจะต้องเพิ่มสิ่งนี้ในตอนท้ายของสคริปต์ตามที่ระบุไว้ในการแก้ไขเพื่อให้คุณกลับไปที่ไดเรกทอรีสคริปต์หลังจากสิทธิ์ยกระดับ: cd / d% ~ dp0


ตรวจสอบคำตอบของคำถามนี้ มันจัดการกับปัญหาเหล่านี้ทั้งหมด
cyberponk

1

จากการโพสต์โดย toster-cx และโพสต์ที่น่าสนใจอื่น ๆ ในหน้านี้ฉันได้รับข้อมูลเชิงลึกเกี่ยวกับวิธีกำหนดค่าและแก้ไขปัญหาของฉัน ฉันมีปัญหาที่คล้ายกันซึ่งฉันต้องการให้ยูทิลิตี้ Disk Cleanup ทำงานทุกสัปดาห์สองครั้งในวันจันทร์และวันพฤหัสบดีระหว่างเวลาอาหารกลางวัน (พูด 14.00 น.) อย่างไรก็ตามจำเป็นต้องมีสิทธิ์ในการยกระดับ

การแชร์แบตช์ไฟล์ซึ่งอาจช่วยให้ผู้เริ่มต้นคนอื่น ๆ เช่นฉัน -

@echo off
echo  Welcome to scheduling 'PC Maintenance Activity'
ping localhost -n 3 >nul
echo -- Step - 1 of 3 : Please give 'Admin' rights on next screen
ping localhost -n 5 >nul
if not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit)
cls
echo -- Step - 2 of 3 : In next screen, select temp areas for cleaning 
during routine scheduled activity
ping localhost -n 3 >nul
C:\Windows\System32\cleanmgr.exe /sageset:112
cls
echo    Now scheduling maintenance activity...
SchTasks /Create /SC WEEKLY /D MON,THU /TN PC_Cleanup /TR 
"C:\Windows\System32\cleanmgr.exe "/sagerun:112 /ST 14:00

cls

echo                         -- Thanks for your co-operation --
echo                    -- Maintenance activity is scheduled for --
echo                       -- Every Monday and Thursday at 2 pm --

ping localhost -n 10 >nul

ขอบคุณมากสำหรับฟอรัมนี้และ Rems POST ที่นี่ [ https://www.petri.com/forums/forum/windows-scripting/general-scripting/32313-schtasks-exe-need-to-pass-parameters-to-scripts ] [1]

โพสต์ของเขาช่วยในการกำหนดค่าอาร์กิวเมนต์เพิ่มเติมในขณะที่กำหนดเวลางาน


1

นอกจากนี้ยังมีข้อความค้นหา FSUTIL จากโพสต์นี้ซึ่งเชื่อมโยงกับss64.comที่มีรหัสต่อไปนี้:

@Echo Off
Setlocal
:: First check if we are running As Admin/Elevated
FSUTIL dirty query %SystemDrive% >nul
if %errorlevel% EQU 0 goto START

::Create and run a temporary VBScript to elevate this batch file
   Set _batchFile=%~f0
   Set _Args=%*
   :: double up any quotes
   Set _batchFile=""%_batchFile:"=%""
   Set _Args=%_Args:"=""%

   Echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\~ElevateMe.vbs"
   Echo UAC.ShellExecute "cmd", "/c ""%_batchFile% %_Args%""", "", "runas", 1 >> "%temp%\~ElevateMe.vbs"

   cscript "%temp%\~ElevateMe.vbs" 
   Exit /B

:START
:: set the current directory to the batch file location
cd /d %~dp0
:: Place the code which requires Admin/elevation below
Echo We are now running as admin [%1] [%2]
pause

ตราบใดที่ FSUTIL อยู่ใกล้ก็เป็นทางเลือกที่น่าเชื่อถือ


0

คุณไม่สามารถขอสิทธิ์ผู้ดูแลระบบจากแบตช์ไฟล์ได้ แต่คุณสามารถเขียนสคริปต์โฮสต์ windows scripting ใน% temp% และเรียกใช้งานนั้น (และจะดำเนินการแบทช์ของคุณในฐานะผู้ดูแลระบบ) คุณต้องการเรียกใช้วิธี ShellExecute ในเชลล์ แอปพลิเคชันวัตถุที่มี "runas" เป็นคำกริยา


0

ใช้mshtaเพื่อแจ้งขอสิทธิ์ผู้ดูแลระบบ:

@echo off
net session >nul 2>&1 && goto :admintasks
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 1);close();"
exit /b
:admintasks
rem ADMIN TASKS HERE

หรือใช้ PowerShell:

powershell -c Start-Process "%~nx0" -Verb runas

-5

ใช้คำสั่ง runas แต่ฉันไม่คิดว่าคุณสามารถส่งไฟล์. bat ได้อย่างง่ายดาย


6
คำตอบนี้ไม่ถูกต้อง runasคำสั่งไม่สามารถนำมาใช้เพื่อกระตุ้นการยกระดับ
Bill_Stewart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.