A modern operációs rendszerek, különösen a Windows, a biztonság növelése érdekében szigorú jogosultsági szinteket alkalmaznak. Ez azt jelenti, hogy bizonyos rendszerkritikus műveletek, mint például a programok telepítése, rendszerfájlok módosítása vagy a hálózati beállítások konfigurálása, csak akkor hajthatók végre, ha a felhasználó rendelkezik rendszergazdai jogosultsággal. De mi történik akkor, ha egy ismétlődő feladatot szeretnénk automatizálni egy parancsfájllal, és az adott feladat admin jogokat igényel? Erről fog szólni a mai cikkünk, amelyben részletesen bemutatjuk, hogyan hozhatunk létre egy olyan parancsfájlt, amely képes önmagát emelt jogosultsággal elindítani.
Miért van szükség emelt jogosultságra és mi az a UAC?
A felhasználói fiókok felügyelete, ismertebb nevén UAC (User Account Control), a Windows Vista óta a rendszer szerves részét képezi. Célja, hogy megakadályozza az illetéktelen programok vagy kártékony szoftverek adminisztrátori jogosultságokkal történő automatikus futását. Amikor egy program vagy parancsfájl rendszergazdai műveletet próbál végrehajtani, az UAC egy felugró ablakkal értesíti a felhasználót, és engedélyt kér a folytatáshoz. Ez egy fontos biztonsági réteg, amely védi a rendszert a nem kívánt változásoktól. Azonban az automatizált scriptek esetében ez a felugró ablak megszakíthatja a munkafolyamatot, ezért keressük azt a módszert, amivel a script maga kéri az emelt jogosultságot, és a felhasználónak csak egyszer kell jóváhagynia.
Parancsfájlok alapjai és szerepük az automatizálásban
A parancsfájlok (gyakran nevezik őket batch scripteknek, különösen Windows környezetben, fájlneveik `.bat` vagy `.cmd` kiterjesztésűek) egyszerű szöveges fájlok, amelyek egy sor parancsot tartalmaznak. Ezeket a parancsokat a Windows parancssora (CMD) hajtja végre, sorban egymás után. A parancsfájlok kiválóan alkalmasak ismétlődő, monoton feladatok automatizálására, például fájlok másolására, könyvtárak létrehozására, rendszerbeállítások módosítására, vagy akár egyszerű programok indítására. Az IT szakemberek és rendszergazdák mindennapi munkájának szerves részét képezik, mivel jelentősen felgyorsíthatják és egyszerűsíthetik a rutinműveleteket.
A kihívás: Parancsfájl futtatása rendszergazdaként
Ha manuálisan szeretnénk egy parancsfájlt rendszergazdai jogosultsággal futtatni, egyszerűen jobb gombbal kattintunk rá, majd a „Futtatás rendszergazdaként” opciót választjuk. Ez azonban nem ideális, ha egy automatizált megoldásra van szükségünk, vagy ha a scriptnek magának kell felismernie, hogy nem megfelelő jogosultsággal fut, és önmagát újraindítani emelt szinten. Itt jön képbe az a technika, amit most bemutatunk: egy kis segédprogram, ami ellenőrzi a jogosultságot, és ha szükséges, újraindítja a fő scriptet admin jogokkal.
A megoldás: VBScript segítségével történő jogosultságemelés
A Windows batch scriptek önmagukban nem rendelkeznek beépített paranccsal az emelt jogosultságok kérésére. Azonban más scriptekkel, például VBScripttel vagy PowerShelllel együttműködve ez a feladat könnyedén megoldható. A leggyakoribb és legegyszerűbb módszer egy rövid VBScript használata, amely képes elindítani egy másik programot (esetünkben a batch scriptet) emelt jogosultsággal.
Az egyszerű példa: Egy rendszergazdai mappalétrehozó script
Készítsünk egy olyan példát, amely egy mappát hoz létre a C:Program Files
könyvtárban. Ez a művelet általában rendszergazdai jogosultságot igényel, így tökéletes arra, hogy demonstráljuk az emelt jogosultságú indítást.
1. lépés: Hozzuk létre a VBScript fájlt
Nyissunk egy egyszerű szövegszerkesztőt (pl. Jegyzettömb) és másoljuk be az alábbi kódot. Mentsük el a fájlt admin_caller.vbs
néven, ugyanabba a könyvtárba, ahová a fő batch scriptet is tenni fogjuk.
Set UAC = CreateObject("Shell.Application")
UAC.ShellExecute "cmd.exe", "/c """ & WScript.Arguments(0) & """", "", "runas", 1
Magyarázat a VBScripthez:
Set UAC = CreateObject("Shell.Application")
: Létrehoz egy objektumot, amely hozzáférést biztosít a Windows Shell funkcióihoz, beleértve a programok futtatását.UAC.ShellExecute "cmd.exe", "/c """ & WScript.Arguments(0) & """
: Ez a kulcsfontosságú sor. A"cmd.exe"
a futtatandó program. A/c
azt jelenti, hogy a parancs végrehajtása után a parancssor bezáródik.WScript.Arguments(0)
a VBScriptnek átadott első argumentumot jelenti, ami a mi esetünkben a futtatni kívánt batch script teljes elérési útja lesz. A dupla idézőjelek (`”””`) a fájl elérési útját zárják be, ha az szóközt tartalmaz.""
(3. paraméter): A munkakönyvtár. Üresen hagyjuk, így az aktuális könyvtár lesz."runas"
(4. paraméter): Ez a fontos rész! Ez az ige utasítja aShellExecute
függvényt, hogy rendszergazdai jogosultsággal indítsa el a programot, kiváltva az UAC felugró ablakát.1
(5. paraméter): Az ablak állapota. Az1
azt jelenti, hogy normál méretben jelenjen meg az ablak.
2. lépés: Hozzuk létre a fő Batch Script fájlt
Nyissunk egy újabb szövegszerkesztőt és illesszük be az alábbi kódot. Mentsük el a fájlt admin_feladat.bat
néven, ugyanabba a könyvtárba, mint a admin_caller.vbs
fájlt.
@echo off
setlocal
:: Ellenőrizzük, hogy rendszergazdai jogosultsággal fut-e a script
NET SESSION >nul 2>&1
IF %ERRORLEVEL% NEQ 0 (
echo A script nem rendszergazdai jogosultsaggal fut. Ujrainditas...
set "scriptPath=%~dpnx0"
set "vbsPath=%~dp0admin_caller.vbs"
:: Indítsa újra a scriptet admin jogokkal a VBScript segítségével
cscript //NoLogo "%vbsPath%" "%scriptPath%"
:: Ha a VBScript sikerrel elindult (vagy a felhasználó visszautasította),
:: akkor ez a példány már bezárható.
exit /b
)
:: Ha idáig eljutunk, a script rendszergazdai jogosultsággal fut.
echo Rendszergazdai jogosultsaggal fut.
echo.
:: Itt jönnek a rendszergazdai jogokat igénylő feladatok
set "targetDir=C:Program FilesAdminTestMappa"
if not exist "%targetDir%" (
echo Letrehozzuk a(z) "%targetDir%" mappat...
mkdir "%targetDir%"
if %ERRORLEVEL% EQU 0 (
echo A mappa sikeresen letrehozva: "%targetDir%"
) else (
echo Hiba tortent a mappa letrehozasa kozben.
)
) else (
echo A "%targetDir%" mappa mar letezik.
)
echo.
echo Feladat elvegezve.
pause
exit /b
Magyarázat a Batch Scripthez:
@echo off
: Elrejti a parancsok kiírását a konzolon.setlocal
: Lokális környezeti változókat állít be, így azok nem befolyásolják a globális környezetet.NET SESSION >nul 2>&1
: Ez a sor ellenőrzi a rendszergazdai jogosultságot. ANET SESSION
parancs alapértelmezetten hibát ad vissza (ERRORLEVEL
nem 0), ha nem rendszergazdaként fut. A>nul 2>&1
elrejti a parancs kimenetét és hibáit.IF %ERRORLEVEL% NEQ 0 (...)
: Ha azERRORLEVEL
nem nulla (azaz nem rendszergazda), akkor a blokkban lévő parancsok futnak.set "scriptPath=%~dpnx0"
: Elmenti az aktuális batch script teljes elérési útját (drive, path, name, extension).set "vbsPath=%~dp0admin_caller.vbs"
: Elmenti a VBScript teljes elérési útját. A%~dp0
az aktuális script könyvtárát jelenti.cscript //NoLogo "%vbsPath%" "%scriptPath%"
: Ez a kulcssor. Acscript
a Windows Script Host (WSH) parancssori értelmezője. A//NoLogo
opció elrejti a WSH fejlécét. Ezután futtatja aadmin_caller.vbs
-t, és paraméterként átadja neki aadmin_feladat.bat
script elérési útját. Ezzel a VBScript elindítja a batch scriptet emelt jogosultsággal.exit /b
: Kilép az aktuális batch script példányból, hogy ne fusson tovább a nem-admin verzió.echo Rendszergazdai jogosultsaggal fut.
: Ez a sor csak akkor fut le, ha a script már rendszergazdai jogokkal rendelkezik.set "targetDir=C:Program FilesAdminTestMappa"
: Definiálja a létrehozandó mappa elérési útját.if not exist "%targetDir%" (mkdir "%targetDir%" ...)
: Ellenőrzi, hogy létezik-e a mappa, és ha nem, létrehozza. Mivel ez aC:Program Files
alatt van, admin jogok kellenek hozzá.pause
: Megállítja a script futását, amíg a felhasználó le nem nyom egy gombot, így van ideje elolvasni az üzeneteket.exit /b
: Kilép a scriptből.
3. lépés: Futtatás és tesztelés
Helyezze a két fájlt (admin_caller.vbs
és admin_feladat.bat
) ugyanabba a mappába. Ezután egyszerűen kattintson duplán az admin_feladat.bat
fájlra. A következő történések várhatóak:
- A batch script elindul.
- Az
NET SESSION
parancs ellenőrzi a jogosultságot. Mivel valószínűleg nem rendszergazdaként indította el (ha csak simán duplán kattintott), azERRORLEVEL
nem nulla lesz. - A script felismeri, hogy nem admin, és a
cscript
segítségével elindítja azadmin_caller.vbs
-t, átadva neki saját elérési útját. - Az
admin_caller.vbs
megpróbálja elindítani acmd.exe
-t, ami a batch scriptet futtatja, a"runas"
igével. - Ekkor megjelenik az UAC felugró ablak, amely rendszergazdai engedélyt kér.
- Ha Ön rákattint az „Igen” gombra, a batch script egy új példánya elindul, de már rendszergazdai jogosultsággal.
- Az eredeti, nem admin script példány bezáródik.
- Az új, admin script példány futni kezd, és az
NET SESSION
parancs ezúttal nullát fog visszaadni, így a script folytatódik a rendszergazdai feladatokkal (mappa létrehozása). - Ellenőrizze a
C:Program Files
mappát, ott kell lennie az újonnan létrehozottAdminTestMappa
-nak.
Ez a módszer rendkívül hatékony és viszonylag egyszerűen implementálható, ha batch scriptekkel dolgozunk, és időnként szükség van emelt jogosultságra.
Fontos szempontok és alternatívák
Bár a fenti módszer jól működik, néhány fontos dolgot érdemes szem előtt tartani:
Biztonság és a jogosultság elve
Mindig győződjön meg róla, hogy a script, amelyet rendszergazdai jogosultsággal futtat, megbízható forrásból származik, és pontosan azt teszi, amire szánja. A rendszergazdai jogosultság potenciálisan károsíthatja a rendszert, ha rosszul használják. Kövesse a legkisebb jogosultság elvét: soha ne futasson scriptet admin jogokkal, ha azt egy alacsonyabb jogosultsággal is megtehetné.
Az UAC felugró ablak
Fontos megjegyezni, hogy ez a módszer *nem* kerüli meg az UAC felugró ablakot. A felhasználónak továbbra is manuálisan kell jóváhagynia a jogosultságemelést. Ha teljesen csendes, felhasználói interakciót nem igénylő adminisztrátori feladatot szeretne, akkor a Feladatütemező (Task Scheduler) a megfelelő eszköz. A Feladatütemezővel beállíthat egy feladatot, hogy az automatikusan, rendszergazdai jogosultsággal fusson, akár egy meghatározott ütemezés szerint, akár egy esemény bekövetkeztekor. Ez a megoldás ideális szervereken, vagy olyan gépeken, ahol a felhasználói felügyelet nem engedélyezett.
Alternatív scriptnyelvek
Bár a batch scriptek egyszerűek, korlátozottak is. Sok rendszergazda inkább PowerShell-t használ összetettebb feladatok automatizálására. A PowerShell beépített parancsokkal rendelkezik a jogosultságok ellenőrzésére és emelésére (`Start-Process -Verb RunAs`), ami elegánsabb megoldást kínál, mint a VBScriptes „segédprogram”. Például:
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Start-Process powershell.exe -Verb RunAs -ArgumentList "-File `"$PSCommandPath`""
Exit
}
# Itt folytatódnak az admin jogokat igénylő parancsok
Write-Host "Rendszergazdai jogosultsaggal fut."
New-Item -Path "C:Program FilesPowerShellAdminTest" -ItemType Directory -ErrorAction SilentlyContinue
Read-Host "Nyomjon egy gombot a kilepeshez..."
Ez a PowerShell kód ugyanazt éri el, mint a batch/VBScript kombináció, de egyetlen fájlban.
Hibakezelés
Mindig érdemes valamilyen hibakezelést beépíteni a scriptekbe. Mi történik, ha a felhasználó visszautasítja az UAC kérést? A mi példánkban az eredeti script kilép. Összetettebb scriptek esetében fontolóra vehetjük a felhasználó tájékoztatását, vagy alternatív útvonalak végrehajtását.
Összefoglalás
A rendszergazdai jogosultsággal induló parancsfájlok készítése elengedhetetlen képesség mindenki számára, aki Windows környezetben automatizálási feladatokkal foglalkozik. Az egyszerű VBScript-es trükk lehetővé teszi a batch scriptek számára, hogy szükség esetén emelt jogosultságot kérjenek, ezzel nagyban megkönnyítve a rendszeradminisztrációs feladatokat. Bár az UAC felugró ablak továbbra is megjelenik, a script képes lesz önállóan felismerni a helyzetet és kezelni a jogosultságemelés folyamatát.
Ne feledje, a kulcs a biztonság és a megfelelő eszköz kiválasztása a feladathoz. Ismerje meg a PowerShell-t és a Feladatütemezőt is, mert ezek még hatékonyabb megoldásokat kínálhatnak összetettebb vagy teljesen automatizált, felügyelet nélküli feladatokhoz. Reméljük, hogy ez az útmutató segít Önnek abban, hogy hatékonyabban végezze el a mindennapi rendszergazdai feladatait!