Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
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.
A
sp_xp_cmdshell_proxy_accountrendszereljárás használatával konfigurálhatja axp_cmdshella 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.
A Management Studióban a
masteradatbá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 axp_cmdshellvégrehajtását. A megadott felhasználónak léteznie kell amasteradatbá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;