Czy możliwe jest automatyczne uruchomienie pliku wsadowego jako administrator

48

Zastanawiam się, czy możliwe jest automatyczne otwieranie pliku wsadowego jako administrator po dwukrotnym kliknięciu pliku wsadowego, ponieważ polecenia muszą być uruchamiane z uprawnieniami administracyjnymi.

Uwaga: Wiem już o rozwiązaniu polegającym na kliknięciu pliku prawym przyciskiem myszy i kliknięciu Run As Administrator, ale nie jest to rozwiązanie automatyczne.

Antp
źródło
Byłem w stanie sprawić, aby to dla mnie zadziałało: stackoverflow.com/a/13811519/27928
Rohit
2
w jaki sposób dwa kliknięcia lewym przyciskiem są bardziej automatyczne niż jedno kliknięcie lewym i jednym kliknięciem prawym?
jiggunjer

Odpowiedzi:

44

Tak, możesz uruchomić plik wsadowy z uprawnieniami administracyjnymi. Niestety nie można tego zrobić bezpośrednio z pliku wsadowego. Najpierw musisz utworzyć skrót do tego pliku wsadowego i zmienić właściwości tego skrótu, aby to zadziałało.

Aby utworzyć skrót, istnieje wiele sposobów, ale najprostszym i najszybszym sposobem jest użycie opcji Wyślij do w menu kontekstowym.

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

Oczywiście możesz wysłać skrót tam, gdzie chcesz. Aby podwyższyć plik wsadowy do działania jako administrator, wykonaj następujące czynności:

  1. Kliknij prawym przyciskiem myszy właśnie utworzony skrót (powinien znajdować się na pulpicie lub gdziekolwiek go wyślesz)
  2. Na karcie Skrót kliknij przycisk Zaawansowane ...
  3. Zaznacz pole wyboru Uruchom jako administrator i naciśnij OK zarówno w oknie modalnym, jak i głównym oknie właściwości.
  4. Uruchom skrót, klikając go dwukrotnie, a plik wsadowy powinien zostać uruchomiony jako administrator.
10100111001
źródło
1
Zawsze można zmusić plik wsadowy do wywołania skrótu, a skrót powinien przekazać parametr, aby wiedzieć, że nie wywołuje skrótu. Wstawisz coś takiego jak if "%~1" == "" start %USERPROFILE%\Desktop\Shortcut.lnk && GOTO :EOFponiżej @echo offi utworzysz link skrótu do program.bat azamiast po prostu program.bat.
trlkly
2
Ifedi pisze: „Przyjęta odpowiedź [ta z Tech1337] rzeczywiście działa. Ale odkryłem, że w Windows 7 musiałem znosić okno dialogowe UAC za każdym razem, gdy kliknięto skrót”. <- Chociaż ktoś inny mówi, że działa bez UAC
barlop
Dla mnie skrót nie uruchamia się w bieżącym katalogu po dwukrotnym kliknięciu, chociaż działa .bat. Nawet po wypełnieniu skrótu właściwość „Rozpocznij za:”. Upewnij się więc, że Twój .bat określa pełne ścieżki do plików.
Rob Mosher
29

Jak zamieszczono w odpowiedzi Bena Gripki na inne pytanie:

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"
:--------------------------------------
użytkownik399109
źródło
Tak, znalazłem to i używam go currnetly. W każdym razie dzięki!
Antp
Zasadniczo tego szukałem. Czy miałeś nadzieję, że jest na to sposób bez użycia VB?
Szef kuchni Faraon
@ChefPharaoh tworzy to podwyższoną konsolę do uruchomienia pliku wsadowego. Możesz zrobić to samo ze skryptem PowerShell.
jiggunjer
To była dla mnie najlepsza odpowiedź.
kasperhj
4

Przyjęta odpowiedź rzeczywiście działa. Ale odkryłem, że w Windows 7 musiałem znosić okno UAC za każdym razem, gdy kliknięto skrót. To IMHO znacząco szkodzi „automatycznie” w tym pytaniu!

Potem odkryłem, że w mojej sytuacji dany .batplik ma być uruchamiany przez Harmonogram zadań. W takim przypadku zaznaczenie Run with highest privilegesopcji na Generalkarcie zadania ładnie rozwiązuje problem. Następnie .batjest uruchamiany jako administrator bez żadnych problemów.

PS: Nie zdawałem sobie sprawy, że nie mogę załadować zdjęć z tą odpowiedzią, ponieważ mam teraz ładny mały zrzut ekranu! Czy mogę?

Ifedi Okonkwo
źródło
2
Jeśli dodasz linki do zdjęć, ktoś wstawi je za Ciebie.
Ramhound,
@Ramhound. Dodać linki do zdjęć? Obraz jest na moim pulpicie, a nie gdzieś online. Czy na pewno coś brakuje?
Ifedi Okonkwo
Tak; Prześlij je; Po prostu nie możesz wstawić zrzutów ekranu do swojej odpowiedzi.
Ramhound,
Albo nie było tego przycisku przesyłania, albo wczoraj byłem na wpół ślepy! Jestem pewien, że to było to drugie. W każdym razie ładnie ukończyłem przesyłanie pliku, ale powiedziano mi, że potrzebuję powtórzenia 10, aby opublikować zdjęcia. W każdym razie dzięki.
Ifedi Okonkwo
Nadal możesz jednak umieścić link w odpowiedzi.
Ramhound,
4

w systemie Windows 7

  1. Utwórz skrót do tego pliku wsadowego

  2. Kliknij plik skrótu prawym przyciskiem myszy

  3. Kliknij przycisk postępu, aby znaleźć pole wyboru do uruchomienia jako administrator

Sprawdź zrzut ekranu poniżej

Zrzut ekranu

fedmich
źródło
1
Twoje powiedzenie jest takie samo jak zaakceptowana odpowiedź.
Antp
Tak, chciałem tylko stworzyć prostą listę ze zrzutem ekranu dla każdego, kto się spieszy.
fedmich
3
Jeśli ktoś się spieszy, wątpię, aby przewinął odpowiedź na dół. I tak
dziękuję
3

Możesz użyć mojego skryptu Batch_Admin, aby automatycznie podnieść Administratora do użycia w dowolnym typie własnego skryptu Batch, BAT lub .CMD. Ta funkcja zapewnia pracę w standardowym środowisku ze standardowymi narzędziami i w ten sam sposób w różnych systemach Windows. Używa kilku standardowych i wbudowanych poleceń systemu Windows. Nie używaj żadnych innych zewnętrznych skryptów. Może być używany do wywoływania dowolnego programu jako Administrator, a nie tylko skryptów Batch. Wystarczy stworzyć mały skrypt, który następnie wywoła program, który wymaga pozwolenia Administartor. Umieść to w dowolnym folderze ŚCIEŻKA wyszukiwania (od% PATH%).

Aby go użyć, wystarczy wstawić następujący wiersz (dokładnie jak) w jego nadrzędnym skrypcie wsadowym, który ma być uruchamiany jako administrator. Najlepiej jest to zrobić na początku naszego skryptu nadrzędnego i najlepiej najpierw, który będzie wywoływany dalej przez CALL, niektóre podskrypty (patrz szczegółowe wyjaśnienie poniżej).

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

Można to wstawić do dowolnego skryptu potomnego, wywoływanego przez składnię CALL. Aby wyświetlić komunikat, gdy jest on nadal nie ma uprawnień administratora, np. na 5 sekund przed wywołaniem Batch_Admin ustaw zmienną „ShowAdminInfo” na liczbę sekund

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

Jak to działa:

• Wywołuje UAC.ShellExecute przez VBScript, aby odebrać uprawnienia użytkownika

• Batch uruchamia skrypt lub BAT lub CMD

• Osoba wywołująca skrypt może zawierać w cudzysłowie długie przestrzenie nazw

• Oddaj wszystkie parametry wywołania skryptu głównego przekazanego z wiersza poleceń, tak jakby nie było transmisji wywołania i rozpocznij coś od zera, również ze znakami specjalnymi, takimi jak wykrzykniki (!) I procent (%), a także z nawiasami ()

• Przechowuje główną lokalizację skryptu, jeśli wywołanie miało miejsce w katalogu, w którym ten skrypt jest głównym

• Pomocniczy wyświetla komunikat, jeśli ustawimy przed sobą zmienną „ShowAdminInfo”, np. przez 5 sekund, co może zapobiec natychmiastowemu przejściu uprawnień Administratora, udzielając dodatkowych informacji i możliwości podjęcia świadomej decyzji. Przykłady ustawień, które należy ustawić: SET ShowAdminInfo = 5 Domyślnie, ponieważ ta zmienna nie jest zdefiniowana, nie jest wyświetlana.

• Skrypt wywołuje także ścieżkę wyszukiwania systemu% PATH% i zasoby sieciowe, takie jak: \ Komputer \ udział \ test.bat

• Zapobiega nieporozumieniom w pisaniu niezbędnych plików pomocniczych, gdy skrypt wywołuje kilka Batch_Admin prawie w tym samym czasie. Wykorzystuje losową liczbę od 1 do 100

• Ale najlepsze jest użycie go w skrypcie nadrzędnym. Przejście na uprawnienia administratora zawsze wymaga ponownego uruchomienia skryptu całkowicie, w nowym oknie, w nowym środowisku, bez konieczności odwoływania się do zmiennych ustawionych wcześniej w naszym skrypcie, a wartości tych zmiennych nie zostały następnie przekazane jako administrator . Tylko skrypt zostanie wykonany ponownie.

Poniżej kompletny skrypt Batch_Admin. Rozszerzone informacje na ten temat znajdują się na mojej stronie.

Skopiuj następujący tekst do Notatnika i zapisz go na dysku jako: 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)  ***
Artur Zgadzaj
źródło
Myślę, że jest to podobne lub identyczne z powyższą odpowiedzią: superuser.com/a/852877/375935
jiggunjer
1

Alternatywnie możesz utworzyć drugi plik wsadowy, co pozwoli ci uruchomić wszystko jako administrator, wprowadzając hasło administratora tylko raz. Hasło jest zapisywane w tokenie uwierzytelniającym i zabiera prawdziwy komputer do złamania zabezpieczeń.

runas /savecred /user:(domain)\(admin user) "(file path to exe,bat,whatever)"
Brapapple
źródło
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

Działa to również ŹRÓDŁO: https://social.technet.microsoft.com/Forums/windows/en-US/bc8a4561-d97e-4339-9b1c-9b90e54a7f92/request-elevation-inside-cmdbatch-file

Josue Moreno Cervantes
źródło
Czy możesz wyjaśnić swoje rozwiązanie?
scai
1
Kolejna wersja superuser.com/a/852877/375935
jiggunjer
0

Możesz użyć narzędzia wiersza polecenia elevate. (link do pobrania - 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
T.Todua
źródło
Czy to nie wywołuje panelu UAC?
Antp
co wywołuje ... jest jednak lepsze niż nic (widzenie „odmowy dostępu”…)
T.Todua,
Nie jest to jednak „automatyczne”
Antp
0

Jest to przykład uruchomienia nietoperza jako administratora. Mi to pasuje.

Wygląda to tak:

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
JoshMoreNo
źródło
Witamy w Super User! Chociaż może to odpowiedzieć na pytanie, lepszym rozwiązaniem byłoby wyjaśnienie, dlaczego tak się dzieje.
DavidPostill
Jeszcze inny wariant superuser.com/a/852877/375935
jiggunjer