Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
Syntaxe
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.
EXECUTE 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 pevné role serveru sysadmin , xp_cmdshell připojí se k Windows 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 SHIPPING\KobeRdomény Systému Windows . Nahraďte <password> silným heslem.
EXECUTE sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', '<password>';
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:
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_accountnakonfigurujtexp_cmdshelltak, 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í
masterdatabá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:
EXECUTE 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:
EXECUTE AS LOGIN = '<other_login>';
GO
EXECUTE 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.
EXECUTE 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;
EXECUTE 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 AS INT;
EXECUTE @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 AS SYSNAME, @var AS SYSNAME;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';
EXECUTE 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 AS SYSNAME, @var AS SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';
EXECUTE 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)