Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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_cmdshell
inaktiveras 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_cmdshell
och tillåta ATT SQL Server skapar underordnade processer med säkerhetstoken för ett konto med mindre privilegier:
Skapa och anpassa ett lokalt Windows-användarkonto eller ett domänkonto med minsta möjliga behörighet som dina processer kräver.
Använd
sp_xp_cmdshell_proxy_account
-systemproceduren för att konfigureraxp_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.
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öraxp_cmdshell
. Den angivna användaren måste finnas imaster
-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;