Jak zażądać dostępu administratora do pliku wsadowego

Próbuję napisać plik wsadowy dla moich użytkowników do uruchomienia z ich maszyn Vista z UAC. Plik ponownie zapisuje plik hosts, więc musi być uruchomiony z uprawnieniami administratora. Muszę móc wysłać im maila z linkiem doplik bat. Pożądanym zachowaniem jest to, że gdy klikną prawym przyciskiem myszy plik i powiedzą Otwórz, otrzymają jedno z tych okien dialogowych UAC, które powoduje, że ekran staje się ciemny i zmusza ich do odpowiedzi, czy chcą dać aplikację uprawnienia do uruchomienia jako administrator. Zamiast tego widzą "Odmowa dostępu" w oknie wiersza poleceń.

Czy można to zrobić inaczej?

Author: Jim Fell, 2009-12-12

16 answers

Ten skrypt działa! Wystarczy wkleić go do górnej części pliku bat. Jeśli chcesz przejrzeć wynik skryptu, dodaj polecenie" pauza " na dole pliku wsadowego.

Aktualizacja: ten skrypt jest teraz lekko edytowany, aby obsługiwać argumenty wiersza poleceń i 64-bitowy system operacyjny.

Thank you 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>
 376
Author: Ben Gripka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-23 16:59:58

Oto jednolinijkowy, którego używam:

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

echo main code here
pause

Uwagi:

  • testowane tylko na windows 7 i 10, być może będziesz musiał zadzierać z cytowaniem
  • na razie nie wspiera przekazywania argumentów
 63
Author: toster-cx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 15:34:11

Oto Mój kod! Wygląda na duży, ale głównie są to linie komentarza (linie zaczynające się od ::).

Cechy:

  • pełne przekazywanie argumentów
  • nie zmienia folderu roboczego
  • obsługa błędów
  • akceptuje ścieżki z nawiasami (z wyjątkiem folderu %TEMP%)
  • obsługuje ścieżki UNC
  • Sprawdzanie zmapowanego folderu (ostrzega, jeśli administrator nie może uzyskać dostępu do zmapowanego dysku)

  • Może być używana jako zewnętrzna biblioteka (sprawdź mój post w tym temacie: https://stackoverflow.com/a/30417025/4932683)

  • może być wywołany, gdy / w razie potrzeby w dowolnym miejscu w kodzie

Po prostu załącz to na końcu pliku wsadowego lub zapisz jako bibliotekę (sprawdź powyżej)

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
: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
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Przykład jak go używać

: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]
 19
Author: cyberponk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:07

Innym podejściem jest

  • Utwórz skrót lokalnie i ustaw go tak, aby wywoływał uprawnienia administratora (Properties, Advanced, Run as Admin)

A następnie

  • wyślij użytkownikom skrót (lub link do skrótu, a nie do samego pliku wsadowego).
 9
Author: Tryx3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-19 22:58:53

Rozwiązanie Bena Gripki powoduje nieskończone pętle. Jego partia działa tak (pseudo kod):

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

Jak widzisz, powoduje to nieskończoną pętlę, jeśli VBS nie zażąda uprawnień administratora.

Może jednak wystąpić pętla nieskończona, chociaż z powodzeniem zażądano uprawnień administratora.

Sprawdzenie w pliku wsadowym Bena Gripki jest po prostu podatne na błędy. Grałem z partii i zauważyłem, że uprawnienia administratora są dostępne, chociaż Kontrola nie powiodła się. Co ciekawe, sprawdzanie działało zgodnie z oczekiwaniami, jeśli uruchomiłem plik wsadowy z Eksploratora windows, ale nie działało, gdy uruchomiłem go z mojego IDE. Proponuję więc użyć dwóch oddzielnych plików wsadowych. Pierwszy generuje VBS, który wywołuje drugi plik wsadowy:
@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"

Drugi, o nazwie " my_commands.bat " i znajduje się w tym samym katalogu, co pierwszy zawiera twoje rzeczywiste polecenia:

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

Powoduje to brak nieskończonych pętli, a także usuwa podatne na błędy uprawnienia administratora szach.

 6
Author: fishbone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-08 09:55:07

Kolejne Rozwiązanie PowerShell...

Nie chodzi o uruchamianie skryptu wsadowego jako admin per, ale raczej o to, jak wynieść inny program z wsadu...

Mam plik wsadowy "wrapper" dla exe. Mają tę samą "nazwę pliku głównego", ale alternatywne rozszerzenia. Jestem w stanie uruchomić exe jako admin i ustawić katalog roboczy na ten, który zawiera skrypt, z następującym jedna linia wywołanie powershell:

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

Więcej informacji

Są cała masa dodatkowych opcji Start-Process, które możesz zastosować! Zobacz też: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6

Zauważ, że używam prefiksu @. Jest to odpowiednik @echo off dla jednej linii. Używam %~n0 tutaj, aby uzyskać "nazwę główną" skryptu wsadowego, a następnie łączę .exe, aby wskazać binarny dodatek. Użycie %~dp0 zapewnia pełną ścieżkę do katalogu, w którym wsad / align = "left" / I oczywiście parametr -Verb RunAs określa wysokość.

 6
Author: BuvinJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-06 00:53:23

Wiem, że to nie jest rozwiązanie dla OP, ale ponieważ jestem pewien, że jest tu wiele innych przypadków użycia, pomyślałem, że się podzielę.

Miałem problemy ze wszystkimi przykładami kodu w tych odpowiedziach, ale potem znalazłem : http://www.robotronic.de/runasspcEn.html

Nie tylko pozwala uruchomić jako administrator, ale sprawdza plik, aby upewnić się, że nie został zmieniony i bezpiecznie przechowuje potrzebne informacje. Przyznam, że nie jest to najbardziej oczywiste narzędzie, aby dowiedzieć się, jak korzystać, ale dla tych z nas piszących kod powinien być wystarczająco prosty.

 4
Author: trex005,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-03 03:44:20

@echo off ititle może wystąpić przed tym kodem:

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

Wiele innych odpowiedzi jest przesadnych, jeśli nie musisz się martwić o następujące rzeczy:

  • parametry
  • Working Directory (cd %~dp0 zmieni się na katalog zawierający plik wsadowy)
 3
Author: FluorescentGreen5,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-03 10:56:02
@echo off 
Net session >nul 2>&1 || (PowerShell start -verb runas '%~0' &exit /b)
Echo Administrative privileges have been got. & pause

Powyższe działa na moim systemie Windows 10 w wersji 1903

 3
Author: Matthew Wai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-07 10:16:29

Jest też zapytanie FSUTIL z tego postu który jest również linkowany w ss64.com o następującym kodzie:

@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

Dopóki FSUTIL jest w pobliżu, jest to niezawodna alternatywa.

 2
Author: Laurie Stearn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-05 04:48:11

Ponieważ mam problemy z tym skryptem wyskakujący nowy wiersz polecenia z samym uruchomieniem ponownie, w nieskończonej pętli( za pomocą Win 7 Pro), proponuję spróbować innego podejścia: Jak mogę automatycznie podnieść mój plik wsadowy, tak, że żąda od administratora UAC praw, jeśli jest to wymagane?

Bądź ostrożny, musisz dodać to na końcu skryptu, jak podano w edycji, tak, że jesteś z powrotem do katalogu skryptów po podniesieniu uprawnień : cd / d % ~ dp0

 1
Author: barbara.post,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:48

Na podstawie postu toster-cx i innych ciekawych postów na tej stronie, mam wgląd w to, jak skonfigurować i rozwiązać mój problem. Miałem podobny problem, w którym życzyłem sobie, aby narzędzie do czyszczenia dysku działało co tydzień dwa razy w poniedziałek i czwartek w godzinach lunchu(powiedzmy 14: 00). Wymagało to jednak podwyższonych praw.

Udostępnianie pliku wsadowego, który może pomóc innym początkującym jak ja -

@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

Wielkie dzięki za to forum i Rems POST tutaj [https://www.petri.com/forums/forum/windows-scripting/general-scripting/32313-schtasks-exe-need-to-pass-parameters-to-script][1]

Jego post pomógł skonfigurować opcjonalny argument podczas planowania zadania.

 1
Author: Anand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-02 16:25:19

Nie możesz żądać uprawnień administratora z pliku wsadowego, ale możesz napisać skrypt hosta windows scripting w %temp% i uruchomić go (a to z kolei wykonuje Twoją partię jako admin) , którą chcesz wywołać w powłoce metody ShellExecute.Obiekt aplikacji z" runas " jako czasownikiem

 0
Author: Anders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-15 16:41:29

Użyj mshta, aby poprosić o uprawnienia administratora:

@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
W tym celu należy skontaktować się z Działem obsługi klienta.]}
powershell -c Start-Process "%~nx0" -Verb runas
 0
Author: HackingAddict1337,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-13 11:11:19

Użyłem wielu przykładów, aby połączyć tę działającą jedną liner razem.

To otworzy Twój skrypt wsadowy jako ADMIN + Maximized Window

Wystarczy dodać jeden z poniższych kodów na górze skryptu wsadowego. Oba sposoby działają, tylko różne sposoby kodowania.

Wydaje mi się, że pierwszy przykład odpowiada najszybciej ze względu na /d Przełącznik wyłączający moje polecenia doskey, które włączyłem..

EXAMPLE ONE

@ECHO OFF
IF NOT "%1"=="MAX" (powershell -WindowStyle Hidden -NoProfile -Command {Start-Process CMD -ArgumentList '/D,/C' -Verb RunAs} & START /MAX CMD /D /C %0 MAX & EXIT /B)
:--------------------------------------------------------------------------------------------------------------------------------------------------------------------

:: Your original batch code here:

:--------------------------------------------------------------------------------------------------------------------------------------------------------------------

EXAMPLE TWO

@ECHO OFF
IF NOT "%1"=="MAX" (powershell -WindowStyle Hidden -NoProfile -Command "Start-Process CMD -ArgumentList '/C' -Verb RunAs" & START /MAX CMD /C "%0" MAX & EXIT /B)
:--------------------------------------------------------------------------------------------------------------------------------------------------------------------

:: Your original batch code here:

:--------------------------------------------------------------------------------------------------------------------------------------------------------------------

Poniżej znajdują się zalecenia dotyczące stosowania oryginalny kod serii

Umieścić oryginalny kod serii in it's entirety

Tylko dlatego, że pierwsza linia kodu na samej górze ma @ECHO OFF nie oznacza to, że nie należy go ponownie dołączyć, jeśli oryginalny skrypt też tak ma.

Zapewnia to, że po ponownym uruchomieniu skryptu get w nowym oknie uruchomionym w admin tryb, w którym nie utracisz zamierzonych parametrów/atrybutów skryptu... Takie jak bieżący katalog roboczy, zmienne lokalne i tak dalej

Możesz zacząć z następującymi poleceniami, aby uniknąć niektórych z tych problemów

:: Make sure to use @ECHO OFF if your original code had it
@ECHO OFF
:: Avoid clashing with other active windows variables with SETLOCAL
SETLOCAL
:: Nice color to work with using 0A
COLOR 0A
:: Give your script a name
TITLE NAME IT!

:: Ensure your working directory is set where you want it to be
:: the following code sets the working directory to the script directory folder
PUSHD "%~dp0"

THE REST OF YOUR SCRIPT HERE...

:: Signal the script is finished in the title bar
ECHO.
TITLE Done! NAME IT!
PAUSE
EXIT
 0
Author: slyfox1186,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-12 21:48:09

Użyj polecenia runas. Ale nie sądzę, że możesz wysłać e-mail .plik bat łatwo.

 -6
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-13 01:11:44