Sdílet prostřednictvím


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.

Transact-SQL konvence syntaxe

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_cmdshellnepoužít správce a umožnil SQL Serveru vytvářet podřízené procesy s tokenem zabezpečení méně privilegovaného účtu, postupujte takto:

  1. 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í.

  2. Pomocí systémového postupu sp_xp_cmdshell_proxy_account nakonfigurujte xp_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.

  3. 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ět xp_cmdshell. Zadaný uživatel musí existovat v databázi master.

     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;