Megosztás a következőn keresztül:


xp_cmdshell (Transact-SQL)

A következőkre vonatkozik:SQL Server

Egy Windows-parancshéjat hoz létre, és egy sztringben továbbítja a végrehajtáshoz. A kimenetek szövegsorként lesznek visszaadva.

Transact-SQL szintaxis konvenciói

Szintaxis

xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]

Érvek

Fontos

A kiterjesztett tárolt eljárások argumentumait a Szintaxis szakaszban leírt sorrendben kell megadni. Ha a paraméterek sorrenden kívül vannak beírva, hibaüzenet jelenik meg.

"command_string"

Az operációs rendszernek továbbítandó parancsot tartalmazó sztring. command_stringvarchar(8000) vagy nvarchar(4000), alapértelmezés nélkül. command_string nem tartalmazhat több idézőjelet. Egyetlen idézőjelre van szükség, ha a command_stringhivatkozással hivatkozott fájlelérési utakban vagy programnevekben szóközök találhatók. Ha problémát tapasztal a beágyazott szóközökkel kapcsolatban, kerülő megoldásként fontolja meg a FAT 8.3 fájlnevek használatát.

NO_ KIMENET

Nem kötelező paraméter, amely azt határozza meg, hogy nem adható vissza kimenet az ügyfélnek.

Kódértékek visszaadása

0 (sikeres) vagy 1 (hiba).

Eredményhalmaz

A következő xp_cmdshell utasítás végrehajtása az aktuális könyvtár könyvtárlistát adja vissza.

EXECUTE xp_cmdshell 'dir *.exe';
GO

A sorok egy nvarchar(255) oszlopban jelennek meg. Ha a NO_OUTPUT beállítást használja, a rendszer csak a következő kimenetet adja vissza:

The command(s) completed successfully.

Megjegyzések

A xp_cmdshell által létrehozott Windows-folyamat ugyanazokkal a biztonsági jogosultságokkal rendelkezik, mint az SQL Server szolgáltatásfiókja.

Figyelmeztet

xp_cmdshell egy hatékony funkció, és alapértelmezés szerint le van tiltva. xp_cmdshell házirendalapú felügyelettel vagy sp_configurevégrehajtásával engedélyezhető és letiltható. További információ: Surface-terület konfigurációs és xp_cmdshell (kiszolgálókonfigurációs lehetőség). A xp_cmdshell használatával aktiválhatók a biztonsági naplózási eszközök.

xp_cmdshell szinkron módon működik. A vezérlő nem lesz visszaadva a hívónak, amíg a command-shell parancs be nem fejeződik. Ha xp_cmdshell egy kötegen belül fut, és hibát ad vissza, a köteg sikertelen lesz.

xp_cmdshell proxyfiók

Ha olyan felhasználó hívja meg, aki nem tagja a sysadmin rögzített kiszolgálói szerepkörnek, xp_cmdshell a Windowshoz a névvel ellátott ##xp_cmdshell_proxy_account##hitelesítő adatokban tárolt fióknév és jelszó használatával csatlakozik. Ha ez a proxy hitelesítő adat nem létezik, xp_cmdshell sikertelen lesz.

A proxyfiók hitelesítő adatai sp_xp_cmdshell_proxy_accountvégrehajtásával hozhatók létre. Argumentumként ez a tárolt eljárás windowsos felhasználónevet és jelszót használ. Az alábbi parancs például létrehoz egy proxy hitelesítő adatokat a Windows-tartományfelhasználó SHIPPING\KobeRszámára. Cserélje le <password> erős jelszóra.

EXECUTE sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', '<password>';

További információ: sp_xp_cmdshell_proxy_account.

Engedélyek

Mivel a rosszindulatú felhasználók néha xp_cmdshellhasználatával próbálják megemelni a jogosultságaikat, a xp_cmdshell alapértelmezés szerint le van tiltva. Engedélyezze sp_configure vagy házirendalapú felügyeleti. További információ: xp_cmdshell kiszolgálókonfigurációs beállítás.

Ha az első engedélyezve van, a xp_cmdshell a CONTROL SERVER engedélyét igényli a végrehajtáshoz, és a xp_cmdshell által létrehozott Windows-folyamat biztonsági környezete megegyezik az SQL Server szolgáltatásfiókkal. Az SQL Server szolgáltatásfiókja gyakran több engedéllyel rendelkezik, mint amennyi a xp_cmdshelláltal létrehozott folyamat által végzett munkához szükséges. A biztonság növelése érdekében a xp_cmdshell hozzáférését a kiemelt jogosultságokkal rendelkező felhasználókra kell korlátozni.

Ha engedélyezni szeretné a nem rendszergazdák számára a xp_cmdshellhasználatát, és engedélyezni szeretné, hogy az SQL Server gyermekfolyamatokat hozzon létre egy kevésbé kiemelt fiók biztonsági jogkivonatával, kövesse az alábbi lépéseket:

  1. Hozzon létre és szabjon testre egy windowsos helyi felhasználói fiókot vagy tartományi fiókot a folyamatok által igényelt minimális jogosultságokkal.

  2. A sp_xp_cmdshell_proxy_account rendszereljárás használatával konfigurálhatja a xp_cmdshell a legkevésbé kiemelt fiók használatára.

    Jegyzet

    Ezt a proxyfiókot úgy is konfigurálhatja az SQL Server Management Studióval, hogy az Object Explorerben a kiszolgáló nevére a jobb gombbal a Tulajdonságok elemre kattint, és a kiszolgáló proxyfiókjának szakaszának Biztonsági lapjára kattint.

  3. A Management Studióban a master adatbázis használatával hajtsa végre a következő Transact-SQL utasítást, hogy adott nemsysadmin felhasználók számára lehetővé teszi a xp_cmdshellvégrehajtását. A megadott felhasználónak léteznie kell a master adatbázisban.

    GRANT exec ON xp_cmdshell TO N'<some_user>';
    

A nem rendszergazdák mostantól elindíthatják az operációsrendszer-folyamatokat xp_cmdshell, és ezek a folyamatok a konfigurált proxyfiók engedélyeivel futnak. A CONTROL SERVER engedéllyel rendelkező felhasználók (a sysadmin rögzített kiszolgálói szerepkör tagjai) továbbra is megkapják az SQL Server szolgáltatásfiókjának engedélyeit a xp_cmdshelláltal indított gyermekfolyamatokhoz.

Annak megállapításához, hogy a xp_cmdshell milyen Windows-fiókot használ az operációsrendszer-folyamatok indításakor, hajtsa végre a következő utasítást:

EXECUTE xp_cmdshell 'whoami.exe';

Egy másik bejelentkezés biztonsági környezetének meghatározásához hajtsa végre a következő Transact-SQL kódot:

EXECUTE AS LOGIN = '<other_login>';
GO

EXECUTE xp_cmdshell 'whoami.exe';

REVERT;

Példák

Egy. Végrehajtható fájlok listájának visszaadása

Az alábbi példa a címtárparancsokat végrehajtó xp_cmdshell kiterjesztett tárolt eljárást mutatja be.

EXECUTE master..xp_cmdshell 'dir *.exe';

B. Kimenet nélkül ad vissza

Az alábbi példa xp_cmdshell használ egy parancssztring végrehajtásához anélkül, hogy visszaadja a kimenetet az ügyfélnek.

USE master;

EXECUTE xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
    \\server2\backups\SQLbcks', NO_OUTPUT;
GO

C. Visszatérési állapot használata

Az alábbi példában a xp_cmdshell kiterjesztett tárolt eljárás visszatérési állapotot is javasol. A visszatérési kód értéke a @resultváltozóban van tárolva.

DECLARE @result AS INT;

EXECUTE @result = xp_cmdshell 'dir *.exe';

IF (@result = 0)
    PRINT 'Success';
ELSE
    PRINT 'Failure';

D. Változó tartalmának írása fájlba

Az alábbi példa a @var változó tartalmát egy var_out.txt nevű fájlba írja az aktuális kiszolgálókönyvtárban.

DECLARE @cmd AS SYSNAME, @var AS SYSNAME;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';

EXECUTE master..xp_cmdshell @cmd;

E. Parancs eredményének rögzítése fájlba

Az alábbi példa az aktuális könyvtár tartalmát egy dir_out.txt nevű fájlba írja az aktuális kiszolgálókönyvtárban.

DECLARE @cmd AS SYSNAME, @var AS SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';

EXECUTE master..xp_cmdshell @cmd;