Skocz do zawartości


Close Open
Close Open
Zdjęcie
- - - - -

[Batch script] automatyczne uruchamianie jako Administrator

Batch script skrypty admin

  • Please log in to reply
No replies to this topic

#1 artur.zgadzaj@wp.pl

artur.zgadzaj@wp.pl

    Adept

  • Forumowicze
  • Pip
  • 2 Postów:
  • Płeć:Mężczyzna
  • Lokalizacja:Wrocław

Napisany 31 maj 2015 - 22:48

Przedstawiam własny skrypt  Batch_Admin  do automatycznego podnoszenia uprawnień Administratora do zastosowania w dowolnym własnym skrypcie typu Batch , czyli BAT lub .CMD . Funkcja ta zapewnia pracę na standardowym środowisku, ze standardowymi narzędziami i w taki sam sposób w różnych systemach Windows. Wykorzystuje  kilka standardowych  i wbudowanych w system Windows  poleceń. Nie używa żadnych innych zewnętrznych skryptów. To może być użyte do wywołania dowolnego programu jako Administrator, nie tylko skryptów Batch. Wystarczy w tym celu utworzyć mały skrypt, w którym potem wywołujemy ten program wymagający uprawnień Administartora.

 

To jest podobne do "run as", lecz tutaj nie zmieniamy konta użytkownika, tylko podnosimy uprawnienia użytkownika z grupy administratorów do najwyższych uprawnień jaki ma użytkownik Administrator.

 

Aby go użyć, to wystarczy wstawić poniższą linię (dokładnie w takiej formie) w swoim nadrzędnym skrypcie Batch,  który to ma być uruchomiony jako Administrator.  

Najlepiej to zrobić na samej górze naszego, nadrzędnego skryptu i to najlepiej tego pierwszego, który będzie wywoływać poprzez CALL kolejne, jakieś podrzędne skrypty (patrz dokładne wyjaśnienie poniżej).

 

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

Aby wyświetlać komunikat, gdy jeszcze nie ma uprawnień Administratora, np. przez 5 sekund, to przed wywołaniem Batch_Admin ustawić zmienną "ShowAdminInfo" na ilość sekund

 

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

 

Zatem, jak to działa:

 

- wywołuje  UAC.ShellExecute  poprzez  VBscript  aby podnieść uprawnienia użytkownika z grupy Administratora do pełnych uprawnień Administratora

  Oczywiście dla zwykłego użytkownika, spoza grupy Administratorów nie ma to zastosowania, co najwyżej system zapyta się o zmianę użytkownika

 

- uruchamia skrypt Batch, czyli BAT lub CMD z podwyższonymi prawami Administratora, ale tylko wtedy gdy jeszcze  nie jest jako Administartor.

  Jeśli dany skrypt już jest uruchomiony z prawami Administratora, to nic nie robi, nawet nie jest wywoływany. Gdy jest ustawiona wcześniej zmienna

  ShowAdminInfo na ilość sekund to  jeszcze poinformuje, jak samemu wywoływać nadrzędny skrypt jako Administartor.

 

 

Warunki działania:

 

- Narzędzie Batch_Admin.bat najlepiej umieścić gdzieś w katalogu systemowego przeszukiwania %PATH%, np. w C:\Windows\System32

  Można też umieścić go w katalogu, gdzie mamy swój skrypt nadrzędny, z którego chcemy potem odwołać się do Batch_Admin.bat,

  jednak wtedy trzeba pamiętać, że wywołanie naszego skryptu z innego katalogu nie użyje Batch_Admin, jeśli wcześniej nie zadamy

  przejścia na ten katalog. Zatem najlepiej umieścić go w jakimś katalogu ścieżki PATH

 

Jak działa uruchamianie z podwyższonymi prawami Administratora, gdy Batch_Admin zdiagnozuje, że jest to potrzebne:

 

- nadrzędny skrypt wywołujący może być z rozszerzeniem typu .BAT lub .CMD

 

- skrypt wywołujący może mieć długą nazwę ze spacjami ujętą w cudzysłowia

 

- przekazuje z powrotem wszystkie parametry wywołania nadrzędnego skryptu przekazane z wiersza polecenia,

  tak jakby nie było żadnego przekazywania wywołania i uruchamiania czegoś od nowa, choć tak jest:

   * uwzględnia także różne specjalne znaki, np. dobrze przenosi znaki wykrzyknika (!) oraz procentu (%)

   * uwzględnia użycie w parametrach nawiasów okrągłych () i prawidłowo je przekazuje z powrotem

      Zatem, aby nie zostały one źle zinterpretowane, to w Batch_Admin są używane niekiedy skoki typu:  goto

   * uwzględnia zmienne z długimi nazwami ujętymi w cudzysłów, ze spacjami pomiędzy

   * uwzględnia nawet pojedynczy cudzysłów, a w zasadzie nieparzystą ich liczbę. Wtedy dodaje na końcu

      po spacji dodatkowy cudzysłów do pary, ale przynajmniej wywołuje skrypt nadrzędny z pozostałymi parametrami

   * po wywołaniu skrypt nadrzędny ma takie same parametry wywołania, dla %0 %1 %2 i tak dalej

      jak również gdyby ktoś badał wszystkie parametry naraz jako:  %*

 

- trzyma się lokalizacji skryptu nadrzędnego, jeśli wywołanie nastąpiło w katalogu gdzie jest ten skrypt nadrzędny

 

- wyświetla komunikat pomocniczy, jeśli wcześniej sami ustawimy zmienną "ShowAdminInfo" np. na 5 sekund

  czyli może zapobiegać natychmiastowemu przejściu na prawa Administratora dając dodatkowe informacje

  i możliwość świadomej decyzji. Przykładowe ustawienie, które należy ustawić wcześniej:    SET ShowAdminInfo=5

  Domyślnie, ponieważ zmienna ta nie jest zdefiniowana, to nie wyświetla komunikatu.

 

- znajduje skrypt także w systemowej ścieżce przeszukiwania %PATH%

 

- nawet więcej, bowiem wywołać można nasz skrypt ze ścieżki sieciowej, z niezmapowanego zasobu sieciowego, np.:

     \\KOMPUTER\ZASOB\test.bat

  Też wtedy ten skrypt "Test.bat" zostanie uruchomiony jako Administrator, pod warunkiem jednak, że lokalnie

  w ścieżce PATH gdzieś mamy umiejscowiony Batch_Admin. Patrz komentarz powyżej w "Warunki działania"

 

- zapobiega nieporozumieniom w zapisywaniu plików tymczasowych, gdyby nastąpiło prawie jednoczesne wywołanie

  Batch_Admin kilka razy.  W tym celu używa folder tymczasowy %TEMP% oraz liczbę losową z zakresu od 1 do 100

 

- ustawia jedną zmienną pomocniczą, do wykorzystania potem w wywołującym go skrypcie, gdy jest on w bieżącym katalogu:

  Patrz też uwaga poniżej.

        PATH_BAT          -  sama ścieżka do lokalizacji tego skryptu,   np.:    C:\UTILS

 

  UWAGA: Gdy jednak w podrzędnym skrypcie Batch wywoływanym funkcją CALL jeden z drugiego potrzeba mieć prawidłową wartość tych

         zmiennych, to trzeba samemu dodać dwa wiersze (to konieczne, gdy przejście na Administratora nastąpiło w nadrzędnym

         skrypcie, bo wtedy w tym podrzędnym, jak pisaliśmy wyżej nasz Batch_Admin już się nie wywoła i nie ustawi prawidłowo

         tych zmiennych, ewentualnie będą stare, właściwe dla nadrzędnego skryptu, a nie tego podrzędnego) - trzeci wiersz jest

         opcjonalny do przejścia na ten katalog i można go połączyć znakiem & na końcu drugiego wiersza:

 

FOR %%I IN ("%~0") DO SET "PATH_BAT=%%~dI%%~pI"
SET "BatchFullName=%PATH_BAT%%~0"

CD /D "%PATH_BAT%" 

 

Zasady ogólne i Wywoływanie podrzędnych skryptów Batch poleceniem CALL

 

  UWAGA: Przejście na prawa Administratora zawsze wymaga uruchomienia naszego skryptu całkowicie

         od nowa, w nowym oknie, w nowym środowisku, bez możliwości odwołania się do wartości

         zmiennych ustawianych wcześniej w naszym skrypcie i wartości tych zmiennych nie przechodzą

         potem do wywołania jako Administrator. Po prostu nasz skrypt będzie wykonywany jeszcze raz.

         Można ustawić wcześniej parę zmiennych poleceniem SET, a dopiero potem wywołać przejście na

         Administratora, ale będzie to złudzenie, że to pamięta. Po prostu ustawi te zmienne od nowa,

         jeszcze raz, tylko że za drugim razem już nie ma potrzeby znów wywoływać jako Administrator

         i pójdzie dalej. Stąd powstaje złudzenie, że pamięta te pierwsze ustawienia, a on je ładuje

         od nowa, zaś do pierwotnego wywołania już nie wraca, opuszcza je definitywnie.

 

   Zatem, jeśli wywołujemy wiele zagnieżdżonych skryptów, jeden drugiego z powracaniem, czyli przez CALL

   to wręcz należy wywołać Batch_Admin w pierwszym, nadrzędnym skrypcie, który będzie potem

   wywoływać kolejne. Nie jest zaś żadnym błędem wkleić wiersz wywołujący Batch_Admin w każdym kolejnym,

   podrzędnym skrypcie, bowiem i tak w rzeczywistości nie będzie Batch_Admin wywoływany, czyli

   nie będzie nic robić, gdyż już jest jako Administrator.

 

   Zaś wywołanie Batch_Admin w pierwszym, nadrzędnym naszym skrypcie ma kluczowe znaczenie

   dla prawidłowego powrotu do wywołującego skryptu nadrzędnego, jak i w kolejnych i pamiętania

   wcześniej ustawianych wartości zmiennych i przekazywania zmiennych z podrzędnych skryptów.

   Ustawienie wywołania Batch_Admin w kolejnych podrzędnych skryptach nie ma już znaczenia.

 

 

   Omówmy zatem konkretną sytuację, kiedy źle zadziała i sytuację, kiedy dobrze zadziała, po naprawie

 

 

     Zacznijmy od złego wywołania. W podanym tu przykładzie w drugim skrypcie "2.bat" dostaniemy komunikat:

 

          [2] Zmienna_1 - Nic nie wiem o tej zmiennej

 

     natomiast pierwszy skrypt nic nie będzie wiedział o ustawieniu z drugiego dla Zmienna_2, czyli:

 

          [1] Zmienna_2 - Nic nie wiem o tej zmiennej

 

 

     Naprawa:  Wystarczy pierwszy skrypt samemu uruchamiać jako Administrator lub też i w nim, czyli w "1.bat"

                       wstawić u góry wywołanie Batch_Admin, jako:    net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

 

 

    Skrypt nadrzędny, nazwijmy go 1.BAT

 

@echo off
echo [1] Zaczynam ...

SET Zmienna_1=abc

CALL 2.BAT

if        defined Zmienna_1   echo [1] Zmienna_1 - Tak, wiem o tej zmiennej
if not defined Zmienna_1   echo [1] Zmienna_1 - Nic nie wiem o tej zmiennej
if       defined Zmienna_2   echo [1] Zmienna_2 - Tak, wiem o tej zmiennej
if not defined Zmienna_2   echo [1] Zmienna_2 - Nic nie wiem o tej zmiennej
pause 

     Skrypt podrzędny, nazwijmy go 2.BAT

 

@echo off
REM *** A D M I N I S T R A T O R  ***
net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

SET Zmienna_2=xyz

if       defined Zmienna_1   echo [2] Zmienna_1 - Tak, wiem o tej zmiennej
if not defined Zmienna_1   echo [2] Zmienna_1 - Nic nie wiem o tej zmiennej
if       defined Zmienna_2   echo [2] Zmienna_2 - Tak, wiem o tej zmiennej
if not defined Zmienna_2   echo [2] Zmienna_2 - Nic nie wiem o tej zmiennej
pause
 

 


Poniżej kompletny skrypt Batch_Admin

Zobacz załącznik lub skopiuj poniższy tekst do Notatnika (Notepad) i zapisz na dysku jako:   Batch_Admin.bat

 

@echo off
if "%~1"=="" (echo *** Batch_Admin ***&echo.&echo Automatyczne uruchamianie jako Administrator innego skryptu. Patrz opis wewnatrz.&TIMEOUT /T 30>nul&goto:eof)

::  A D M I N I S T R A T O R   - Automatyczne uzyskiwanie podniesionych uprawnień Administratora dla skryptu batch. Wklej to na początku:    net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*
::                                Trzyma się lokalizacji skryptu w danym katalogu i Ustawia wtedy zmienną pomocniczą:   PATH_BAT
::                                Jeśli wcześniej ustawiono zmienną "ShowAdminInfo" na ilość sekund, to wyświetla komunikat pomocniczy, a domyslnie zmienna jest pusta i nie ma komunikatu
::
::                                Opracowanie:  Artur Zgadzaj    Informacje dodatkowe:  www.widzenia.com/info   (login: info  hasło: computer)
setlocal
setlocal DisableDelayedExpansion

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

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

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

if not defined ShowAdminInfo   goto pomin_komunikat_Administrator
echo.
echo Skrypt:  %~1
echo.
echo *******************************************************************************
echo ***    U R U C H A M I A N I E     J A K O     A D M I N I S T R A T O R    ***
echo *******************************************************************************
echo.
echo Wywolanie tylko jako Administrator. Mozna zrobic skrot do skryptu i ustawic:
echo.
echo           Skrot ^> Zaawansowane ^> Uruchom jako Administrator
echo.
echo     Ewentualnie uruchomic jednorazowo "Jako Administrator"
echo     lub w Harmonogramie zadan z najwyzszymi uprawnieniami
echo.
echo Przerwij Ctrl-C lub poczekaj na uruchomienie  %ShowAdminInfo%  sekund ...
TIMEOUT /T %ShowAdminInfo% > nul

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

SET "Procent="
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul
echo %Parametry% > "%TEMP%\$Admin_%$Admin$%_Test.bat"
if not exist "%TEMP%\$Admin_%$Admin$%_Test.bat"  SET Procent=^"
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 Lokalny  (echo @CD /D "%PATH_BAT%" >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat")
echo @"%~1" %Parametry% %Procent% >> "%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" %Parametry%
goto:eof
REM *** A D M I N I S T R A T O R  - Automatyczne uzyskiwanie podniesionych uprawnień Administratora  (Koniec)  ***
 

 

 

Załączone pliki






0 Użytkowników czyta ten temat

0 użytkowników, 0 gości, 0 anonimowych użytkowników