Dela via


xp_cmdshell (Transact-SQL)

gäller för:SQL Server

Skapar ett Windows-kommandogränssnitt och skickar en sträng för körning. Alla utdata returneras som rader med text.

Transact-SQL syntaxkonventioner

Syntax

xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]

Argument

Viktig

Argument för utökade lagrade procedurer måste anges i den specifika ordning som beskrivs i avsnittet Syntax. Om parametrarna anges i fel ordning visas ett felmeddelande.

"command_string"

Strängen som innehåller ett kommando som ska skickas till operativsystemet. command_string är varchar(8000) eller nvarchar(4000), utan standard. command_string får inte innehålla fler än en uppsättning dubbla citattecken. Ett enda par citattecken krävs om det finns blanksteg i filsökvägarna eller programnamnen som refereras i command_string. Om du har problem med inbäddade blanksteg bör du överväga att använda FAT 8.3-filnamn som en lösning.

NO_ UTDATA

En valfri parameter som anger att inga utdata ska returneras till klienten.

Returnera kodvärden

0 (lyckades) eller 1 (fel).

Resultatuppsättning

Om du kör följande xp_cmdshell-instruktion returneras en kataloglista över den aktuella katalogen.

EXEC xp_cmdshell 'dir *.exe';
GO

Raderna returneras i en nvarchar(255) kolumn. Om alternativet NO_OUTPUT används returneras endast följande utdata:

The command(s) completed successfully.

Anmärkningar

Windows-processen som skapas av xp_cmdshell har samma säkerhetsrättigheter som SQL Server-tjänstkontot.

Försiktighet

xp_cmdshell är en kraftfull funktion och inaktiverad som standard. xp_cmdshell kan aktiveras och inaktiveras med hjälp av principbaserad hantering eller genom att köra sp_configure. Mer information finns i Konfiguration av yta och xp_cmdshell (alternativ för serverkonfiguration). Med hjälp av xp_cmdshell kan utlösa säkerhetsgranskningsverktyg.

xp_cmdshell fungerar synkront. Kontrollen returneras inte till anroparen förrän kommandot command-shell har slutförts. Om xp_cmdshell körs i en batch och returnerar ett fel misslyckas batchen.

xp_cmdshell proxykonto

När den anropas av en användare som inte är medlem i sysadmin fast serverroll ansluter xp_cmdshell till Windows med hjälp av kontonamnet och lösenordet som lagras i autentiseringsuppgifterna med namnet ##xp_cmdshell_proxy_account##. Om den här proxyautentiseringsuppgiften inte finns misslyckas xp_cmdshell.

Proxykontots autentiseringsuppgifter kan skapas genom att köra sp_xp_cmdshell_proxy_account. Som argument tar den här lagrade proceduren ett Windows-användarnamn och lösenord. Följande kommando skapar till exempel en proxyautentiseringsuppgift för Windows-domänanvändare SHIPPING\KobeR som har Windows-lösenordet sdfh%dkc93vcMt0.

EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', 'sdfh%dkc93vcMt0';

Mer information finns i sp_xp_cmdshell_proxy_account.

Behörigheter

Eftersom skadliga användare ibland försöker höja sina privilegier med hjälp av xp_cmdshellinaktiveras xp_cmdshell som standard. Använd sp_configure eller principbaserad hantering för att aktivera den. Mer information finns i xp_cmdshell serverkonfigurationsalternativet.

När du först är aktiverad kräver xp_cmdshell KONTROLLSERVERbehörighet för att köra och Windows-processen som skapats av xp_cmdshell har samma säkerhetskontext som SQL Server-tjänstkontot. SQL Server-tjänstkontot har ofta fler behörigheter än vad som krävs för det arbete som utförs av processen som skapas av xp_cmdshell. För att förbättra säkerheten bör åtkomsten till xp_cmdshell begränsas till högprivilegierade användare.

Följ dessa steg för att tillåta icke-administratörer att använda xp_cmdshelloch tillåta ATT SQL Server skapar underordnade processer med säkerhetstoken för ett konto med mindre privilegier:

  1. Skapa och anpassa ett lokalt Windows-användarkonto eller ett domänkonto med minsta möjliga behörighet som dina processer kräver.

  2. Använd sp_xp_cmdshell_proxy_account-systemproceduren för att konfigurera xp_cmdshell att använda det kontot med minst privilegier.

    Not

    Du kan också konfigurera det här proxykontot med SQL Server Management Studio genom att högerklicka på Egenskaper på servernamnet i Object Explorer och titta på fliken Security för Server-proxykontot avsnittet.

  3. Kör följande Transact-SQL-instruktion i Management Studio med hjälp av master-databasen för att ge specifika icke-sysadmin användare möjlighet att köra xp_cmdshell. Den angivna användaren måste finnas i master-databasen.

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

Nu kan icke-administratörer starta operativsystemsprocesser med xp_cmdshell och dessa processer körs med behörigheterna för det proxykonto som du har konfigurerat. Användare med kontrollserverbehörighet (medlemmar i sysadmin fast serverroll) fortsätter att få behörigheterna för SQL Server-tjänstkontot för underordnade processer som startas av xp_cmdshell.

Kör följande instruktion för att fastställa vilket Windows-konto som används av xp_cmdshell när operativsystemprocesser startas:

EXEC xp_cmdshell 'whoami.exe';

Kör följande Transact-SQL kod för att fastställa säkerhetskontexten för en annan inloggning:

EXEC AS LOGIN = '<other_login>';
GO
xp_cmdshell 'whoami.exe';
REVERT;

Exempel

A. Returnera en lista över körbara filer

I följande exempel visas den xp_cmdshell utökade lagrade proceduren som kör ett katalogkommando.

EXEC master..xp_cmdshell 'dir *.exe'

B. Returnera inga utdata

I följande exempel används xp_cmdshell för att köra en kommandosträng utan att returnera utdata till klienten.

USE master;

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

C. Använd returstatus

I följande exempel föreslår den xp_cmdshell utökade lagrade proceduren också returstatus. Returkodvärdet lagras i variabeln @result.

DECLARE @result INT;

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

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

D. Skriva variabelinnehåll till en fil

I följande exempel skrivs innehållet i variabeln @var till en fil med namnet var_out.txt i den aktuella serverkatalogen.

DECLARE @cmd SYSNAME,
    @var SYSNAME;

SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';

EXEC master..xp_cmdshell @cmd;

E. Samla in resultatet av ett kommando till en fil

I följande exempel skrivs innehållet i den aktuella katalogen till en fil med namnet dir_out.txt i den aktuella serverkatalogen.

DECLARE @cmd SYSNAME,
    @var SYSNAME;

SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';

EXEC master..xp_cmdshell @cmd;