xp_cmdshell (Transact-SQL)
platí pro:SQL Server
Vytvoří příkazové prostředí Windows a předá řetězec pro spuštění. Jakýkoli výstup se vrátí jako řádky textu.
Syntax
xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]
Argumenty
Důležitý
Argumenty rozšířených uložených procedur musí být zadány v určitém pořadí, jak je popsáno v části Syntaxe. Pokud jsou parametry zadány mimo pořadí, dojde k chybové zprávě.
'command_string'
Řetězec obsahující příkaz, který se má předat operačnímu systému. command_string je varchar(8000) nebo nvarchar(4000), bez výchozího nastavení. command_string nemůže obsahovat více než jednu sadu dvojitých uvozovek. Pokud jsou v cestách k souborům nebo v názvech programů odkazované v command_stringnějaké mezery, je vyžadována jedna dvojice uvozovek . Pokud máte potíže s vloženými mezerami, zvažte použití názvů souborů FAT 8.3 jako alternativní řešení.
výstup NO_
Volitelný parametr, který určuje, že se klientovi nemá vracet žádný výstup.
Návratové hodnoty kódu
0
(úspěch) nebo 1
(selhání).
Sada výsledků
Spuštěním následujícího příkazu xp_cmdshell
se vrátí seznam adresářů aktuálního adresáře.
EXEC xp_cmdshell 'dir *.exe';
GO
Řádky se vrátí ve sloupci nvarchar(255). Pokud se použije NO_OUTPUT
možnost, vrátí se pouze následující výstup:
The command(s) completed successfully.
Poznámky
Proces Windows vytvořený xp_cmdshell
má stejná práva zabezpečení jako účet služby SQL Serveru.
Opatrnost
xp_cmdshell
je výkonná funkce a ve výchozím nastavení je zakázaná.
xp_cmdshell
lze povolit a zakázat pomocí správy na základě zásad nebo spuštěním sp_configure
. Další informace najdete v tématu konfigurace oblasti Surface a xp_cmdshell (možnost konfigurace serveru). Použití xp_cmdshell
může aktivovat nástroje auditu zabezpečení.
xp_cmdshell
funguje synchronně. Ovládací prvek se nevrátí volajícímu, dokud se nedokončí příkaz příkazového prostředí. Pokud se xp_cmdshell
spustí v dávce a vrátí chybu, dávka selže.
účet proxy serveru xp_cmdshell
Když je volána uživatelem, který není členem role správce systému pevné role serveru, xp_cmdshell
se k Windows připojí pomocí názvu účtu a hesla uloženého v přihlašovacích údajích s názvem ##xp_cmdshell_proxy_account##. Pokud tyto přihlašovací údaje proxy serveru neexistují, xp_cmdshell
selže.
Přihlašovací údaje účtu proxy je možné vytvořit spuštěním sp_xp_cmdshell_proxy_account
. Jako argumenty přebírá tato uložená procedura uživatelské jméno a heslo systému Windows. Například následující příkaz vytvoří pověření proxy pro uživatele domény Systému Windows SHIPPING\KobeR
s heslem systému Windows sdfh%dkc93vcMt0
.
EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', 'sdfh%dkc93vcMt0';
Další informace naleznete v tématu sp_xp_cmdshell_proxy_account.
Dovolení
Vzhledem k tomu, že se uživatelé se zlými úmysly někdy pokusí zvýšit svá oprávnění pomocí xp_cmdshell
, xp_cmdshell
je ve výchozím nastavení zakázané. K povolení použijte sp_configure
nebo správy na základě zásad. Další informace naleznete v tématu xp_cmdshell Možnost konfigurace serveru.
Při prvním povolení xp_cmdshell
vyžaduje oprávnění CONTROL SERVER ke spuštění a proces Systému Windows vytvořený xp_cmdshell
má stejný kontext zabezpečení jako účet služby SYSTÉMU SQL Server. Účet služby SYSTÉMU SQL Server má často více oprávnění, než je nutné pro práci prováděnou procesem vytvořeným xp_cmdshell
. Pro zvýšení zabezpečení by měl být přístup k xp_cmdshell
omezen na vysoce privilegované uživatele.
Chcete-li umožnit, aby xp_cmdshell
nepoužít správce a umožnil SQL Serveru vytvářet podřízené procesy s tokenem zabezpečení méně privilegovaného účtu, postupujte takto:
Vytvořte a přizpůsobte místní uživatelský účet Windows nebo účet domény s nejnižšími oprávněními, která vaše procesy vyžadují.
Pomocí systémového postupu
sp_xp_cmdshell_proxy_account
nakonfigurujtexp_cmdshell
tak, aby používal tento nejméně privilegovaný účet.Poznámka
Tento účet proxy serveru můžete nakonfigurovat také pomocí aplikace SQL Server Management Studio tak, že v Průzkumníku objektů kliknete pravým tlačítkem na Vlastnosti a podíváte se na kartu Zabezpečení v části účet proxy serveru.
V sadě Management Studio pomocí
master
databáze spusťte následující příkaz Transact-SQL, který poskytne konkrétním uživatelůmsprávce systému možnost spouštětxp_cmdshell
. Zadaný uživatel musí existovat v databázimaster
.GRANT exec ON xp_cmdshell TO N'<some_user>';
Teď můžou nesprávci spouštět procesy operačního systému s xp_cmdshell
a tyto procesy se spouštějí s oprávněními účtu proxy, který jste nakonfigurovali. Uživatelé s oprávněním CONTROL SERVER (členové správce systému pevné role serveru) budou nadále přijímat oprávnění účtu služby SQL Server pro podřízené procesy spuštěné xp_cmdshell
.
Pokud chcete určit účet systému Windows používaný xp_cmdshell
při spouštění procesů operačního systému, spusťte následující příkaz:
EXEC xp_cmdshell 'whoami.exe';
Pokud chcete určit kontext zabezpečení pro jiné přihlášení, spusťte následující Transact-SQL kód:
EXEC AS LOGIN = '<other_login>';
GO
xp_cmdshell 'whoami.exe';
REVERT;
Příklady
A. Vrácení seznamu spustitelných souborů
Následující příklad ukazuje xp_cmdshell
rozšířenou uloženou proceduru, která spouští příkaz adresáře.
EXEC master..xp_cmdshell 'dir *.exe'
B. Vrátit žádný výstup
Následující příklad používá xp_cmdshell
ke spuštění příkazového řetězce bez vrácení výstupu klientovi.
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks', NO_OUTPUT;
GO
C. Použít stav vrácení
V následujícím příkladu xp_cmdshell
rozšířená uložená procedura také navrhuje návratový stav. Vrácená hodnota kódu je uložena v proměnné @result
.
DECLARE @result INT;
EXEC @result = xp_cmdshell 'dir *.exe';
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure';
D. Zápis obsahu proměnné do souboru
Následující příklad zapíše obsah proměnné @var
do souboru s názvem var_out.txt
v aktuálním adresáři serveru.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';
EXEC master..xp_cmdshell @cmd;
E. Zachycení výsledku příkazu do souboru
Následující příklad zapíše obsah aktuálního adresáře do souboru s názvem dir_out.txt
v aktuálním adresáři serveru.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';
EXEC master..xp_cmdshell @cmd;
Související obsah
- Obecné rozšířené uložené procedury (Transact-SQL)
- xp_cmdshell (možnost konfigurace serveru)
- konfigurace oblasti Surface
- sp_xp_cmdshell_proxy_account (Transact-SQL)