xp_cmdshell (Transact-SQL)xp_cmdshell (Transact-SQL)

GILT FÜR: JaSQL Server NeinAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: YesSQL Server NoAzure SQL Database NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

Erzeugt eine Windows-Befehlsshell und übergibt eine Zeichenfolge für die Ausführung.Spawns a Windows command shell and passes in a string for execution. Die Ausgabe wird ggf. in Textzeilen zurückgegeben.Any output is returned as rows of text.

Symbol für Themenlink Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

  
xp_cmdshell { 'command_string' } [ , no_output ]  

ArgumenteArguments

' command_string '' command_string '
Die Zeichenfolge, die einen an das Betriebssystem zu übergebenden Befehl enthält.Is the string that contains a command to be passed to the operating system. command_string ist varchar(8000) oder nvarchar(4000), ohne Standard.command_string is varchar(8000) or nvarchar(4000), with no default. command_string dürfen nicht mehr als einen Satz doppelter Anführungszeichen enthalten.command_string cannot contain more than one set of double quotation marks. Ein einzelnes Paar von Anführungszeichen ist erforderlich, wenn in den Dateipfaden oder Programmnamen, auf die in command_stringverwiesen wird, Leerzeichen vorhanden sind.A single pair of quotation marks is required if any spaces are present in the file paths or program names referenced in command_string. Wenn Probleme mit eingebetteten Leerzeichen auftreten, sollten Sie FAT 8.3-Dateinamen verwenden, um dieses Problem zu umgehen.If you have trouble with embedded spaces, consider using FAT 8.3 file names as a workaround.

no_outputno_output
Ein optionaler Parameter, der angibt, dass keine Ausgabe an den Client zurückgegeben werden soll.Is an optional parameter, specifying that no output should be returned to the client.

RückgabecodewerteReturn Code Values

„0“ (erfolgreich) oder „1“ (fehlerhaft)0 (success) or 1 (failure)

ResultsetsResult Sets

Mit der folgenden xp_cmdshell-Anweisung wird eine Verzeichnisaufstellung des aktuellen Verzeichnisses zurückgegeben.Executing the following xp_cmdshell statement returns a directory listing of the current directory.

EXEC xp_cmdshell 'dir *.exe';  
GO  

Die Zeilen werden in einer nvarchar(255)-Spalte zurückgegeben.The rows are returned in an nvarchar(255) column. Wenn die Option no_output verwendet wird, wird nur Folgendes zurückgegeben:If the no_output option is used, only the following will be returned:

The command(s) completed successfully.  

BemerkungenRemarks

Der Windows-Prozess, der von xp_cmdshell erstellt SQL ServerSQL Server wurde, verfügt über dieselben Sicherheitsrechte wie das Dienstkonto.The Windows process spawned by xp_cmdshell has the same security rights as the SQL ServerSQL Server service account.

xp_cmdshell arbeitet synchron.xp_cmdshell operates synchronously. Die Steuerung wird erst dann an den Aufrufer zurückgegeben, wenn der Befehl der Befehlsshell abgeschlossen wurde.Control is not returned to the caller until the command-shell command is completed.

xp_cmdshell können aktiviert und deaktiviert werden, indem Sie die richtlinienbasierte Verwaltung verwenden oder sp_configureausführen.xp_cmdshell can be enabled and disabled by using the Policy-Based Management or by executing sp_configure. Weitere Informationen finden Sie unter Oberflächenbereichskonfiguration und xp_cmdshell Serverkonfigurationsoption.For more information, see Surface Area Configuration and xp_cmdshell Server Configuration Option.

Wichtig

Wenn xp_cmdshell innerhalb eines Batches ausgeführt wird und einen Fehler zurückgibt, schlägt der Stapel fehl.If xp_cmdshell is executed within a batch and returns an error, the batch will fail.

xp_cmdshell-Proxykontoxp_cmdshell Proxy Account

Wenn es von einem Benutzer aufgerufen wird, der kein Mitglied der sysadmin Fixed Server-Rolle ist, stellt xp_cmdshell eine Verbindung mit Windows her, indem er den Kontonamen und das Kennwort verwendet, die in den Anmeldeinformationen mit dem Namen "#xp_cmdshell_proxy_account" gespeichert sind.When it is called by a user that is not a member of the sysadmin fixed server role, xp_cmdshell connects to Windows by using the account name and password stored in the credential named ##xp_cmdshell_proxy_account##. Wenn diese Proxyanmeldeinformationen nicht vorhanden sind, schlägt xp_cmdshell fehl.If this proxy credential does not exist, xp_cmdshell will fail.

Die Anmeldeinformationen für das Proxykonto können durch Ausführen sp_xp_cmdshell_proxy_accounterstellt werden.The proxy account credential can be created by executing sp_xp_cmdshell_proxy_account. Als Argumente besitzt diese gespeicherte Prozedur einen Windows-Benutzernamen und ein Kennwort.As arguments, this stored procedure takes a Windows user name and password. Mit dem folgenden Befehl werden z. B. Proxyanmeldeinformationen für den Windows-Domänenbenutzer SHIPPING\KobeR erstellt, der das Windows-Kennwort sdfh%dkc93vcMt0 besitzt.For example, the following command creates a proxy credential for Windows domain user SHIPPING\KobeR that has the Windows password sdfh%dkc93vcMt0.

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

Weitere Informationen finden Sie unter sp_xp_cmdshell_proxy_account (Transact-SQL).For more information, see sp_xp_cmdshell_proxy_account (Transact-SQL).

BerechtigungenPermissions

Da böswillige Benutzer manchmal versuchen, ihre Berechtigungen mithilfe von xp_cmdshellzu erhöhen, ist xp_cmdshell standardmäßig deaktiviert.Because malicious users sometimes attempt to elevate their privileges by using xp_cmdshell, xp_cmdshell is disabled by default. Verwenden Sie sp_configure oder Richtlinienbasierte Verwaltung, um sie zu aktivieren.Use sp_configure or Policy Based Management to enable it. Weitere Informationen finden Sie unter xp_cmdshell (Serverkonfigurationsoption).For more information, see xp_cmdshell Server Configuration Option.

Bei der ersten Aktivierung erfordert xp_cmdshell die CONTROL SERVER-Berechtigung zum Ausführen, und der von xp_cmdshell erstellte Windows-Prozess verfügt über denselben Sicherheitskontext wie das SQL ServerSQL Server Dienstkonto.When first enabled, xp_cmdshell requires CONTROL SERVER permission to execute and the Windows process created by xp_cmdshell has the same security context as the SQL ServerSQL Server service account. Das SQL ServerSQL Server Dienstkonto verfügt häufig über mehr Berechtigungen, als für die Arbeit erforderlich sind, die von dem von xp_cmdshellerstellten Prozess ausgeführt wird.The SQL ServerSQL Server service account often has more permissions than are necessary for the work performed by the process created by xp_cmdshell. Um die Sicherheit zu erhöhen, sollte der Zugriff auf xp_cmdshell auf Benutzer mit hohen Berechtigungen beschränkt werden.To enhance security, access to xp_cmdshell should be restricted to highly privileged users.

Führen Sie die folgenden Schritte aus, damit Nicht-Administratoren xp_cmdshellverwenden und SQL ServerSQL Server untergeordnete Prozesse mit dem Sicherheitstoken eines Kontos mit geringerer Berechtigungen erstellen können:To allow non-administrators to use xp_cmdshell, and allow SQL ServerSQL Server to create child processes with the security token of a less-privileged account, follow these steps:

  1. Erstellen Sie ein lokales Windows-Benutzerkonto oder ein Domänenkonto mit den geringsten Berechtigungen, die von den Prozessen benötigt werden, und passen Sie es an.Create and customize a Windows local user account or a domain account with the least privileges that your processes require.

  2. Verwenden Sie die sp_xp_cmdshell_proxy_account Systemprozedur, um xp_cmdshell für die Verwendung dieses Kontos mit den geringsten Berechtigungen zu konfigurieren.Use the sp_xp_cmdshell_proxy_account system procedure to configure xp_cmdshell to use that least-privileged account.

    Hinweis

    Sie können dieses Proxykonto SQL Server Management StudioSQL Server Management Studio auch konfigurieren, indem Sie mit der rechten Maustaste auf Eigenschaften für Ihren Servernamen im Objekt-Explorer klicken und auf der Registerkarte Sicherheit nach dem Abschnitt Serverproxykonto suchen.You can also configure this proxy account using SQL Server Management StudioSQL Server Management Studio by right-clicking Properties on your server name in Object Explorer, and looking on the Security tab for the Server proxy account section.

  3. Führen Management StudioManagement StudioSie unter der Verwendung GRANT exec ON xp_cmdshell TO N'<some_user>'; der Masterdatenbank die Anweisung aus, um bestimmtenNicht-Sysadmin-Benutzern die Möglichkeit zu geben, xp_cmdshellauszuführen.In Management StudioManagement Studio, using the master database, execute the GRANT exec ON xp_cmdshell TO N'<some_user>'; statement to give specific non-sysadmin users the ability to execute xp_cmdshell. Der angegebene Benutzer muss in der Masterdatenbank vorhanden sein.The specified user must exist in the master database.

Jetzt können Nicht-Administratoren Betriebssystemprozesse mit xp_cmdshell starten, und diese Prozesse werden mit den Berechtigungen des von Ihnen konfigurierten Proxykontos ausgeführt.Now non-administrators can launch operating system processes with xp_cmdshell and those processes run with the permissions of the proxy account that you have configured. Benutzer mit CONTROL SERVER-Berechtigung (Mitglieder der sysadmin Fixed Server-Rolle) erhalten weiterhin die Berechtigungen des SQL ServerSQL Server Dienstkontos für untergeordnete Prozesse, die von xp_cmdshellgestartet werden.Users with CONTROL SERVER permission (members of the sysadmin fixed server role) will continue to receive the permissions of the SQL ServerSQL Server service account for child processes that are launched by xp_cmdshell.

Führen Sie die folgende Anweisung aus, um das Windows-Konto zu ermitteln, das von xp_cmdshell beim Starten von Betriebssystemprozessen verwendet wird:To determine the Windows account being used by xp_cmdshell when launching operating system processes, execute the following statement:

xp_cmdshell 'whoami.exe'  
  

Um den Sicherheitskontext für einen anderen Anmeldenamen zu bestimmen, führen Sie folgende Anweisung aus:To determine the security context for another login, execute the following:

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

BeispieleExamples

A.A. Zurückgeben einer Liste der ausführbaren DateienReturning a list of executable files

Im folgenden Beispiel wird mithilfe der erweiterten gespeicherten Prozedur xp_cmdshell der Befehl DIR ausgeführt.The following example shows the xp_cmdshell extended stored procedure executing a directory command.

EXEC master..xp_cmdshell 'dir *.exe'  

B.B. Unterdrücken der AusgabeReturning no output

Im folgenden Beispiel wird mit xp_cmdshell eine Befehlszeichenfolge ausgeführt, ohne dass die Ausgabe an den Client zurückgegeben wird.The following example uses xp_cmdshell to execute a command string without returning the output to the client.

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

C.C. Verwenden des RückgabestatusUsing return status

Im folgenden Beispiel xp_cmdshell schlägt die erweiterte gespeicherte Prozedur auch den Rückgabestatus vor.In the following example, the xp_cmdshell extended stored procedure also suggests return status. Der Rückgabecodewert wird in der Variablen @result gespeichert.The return code value is stored in the variable @result.

DECLARE @result int;  
EXEC @result = xp_cmdshell 'dir *.exe';  
IF (@result = 0)  
   PRINT 'Success'  
ELSE  
   PRINT 'Failure';  

D:D. Schreiben des Inhalts von Variablen in eine DateiWriting variable contents to a file

Im folgenden Beispiel wird der Inhalt der @var-Variablen in die Datei var_out.txt im aktuellen Serververzeichnis geschrieben.The following example writes the contents of the @var variable to a file named var_out.txt in the current server directory.

DECLARE @cmd sysname, @var sysname;  
SET @var = 'Hello world';  
SET @cmd = 'echo ' + @var + ' > var_out.txt';  
EXEC master..xp_cmdshell @cmd;  

E.E. Aufzeichnen des Ergebnisses eines Befehls in einer DateiCapturing the result of a command to a file

Im folgenden Beispiel wird der Inhalt des aktuellen Verzeichnisses in die Datei dir_out.txt im aktuellen Serververzeichnis geschrieben.The following example writes the contents of the current directory to a file named dir_out.txt in the current server directory.

DECLARE @cmd sysname, @var sysname;  
SET @var = 'dir/p';  
SET @cmd = @var + ' > dir_out.txt';  
EXEC master..xp_cmdshell @cmd;  

Siehe auchSee Also

Allgemeine erweiterte gespeicherte Prozeduren (Transact-SQL) General Extended Stored Procedures (Transact-SQL)
xp_cmdshell Serverkonfigurationsoption xp_cmdshell Server Configuration Option
Oberflächenflächenkonfiguration Surface Area Configuration
sp_xp_cmdshell_proxy_account (Transact-SQL-)sp_xp_cmdshell_proxy_account (Transact-SQL)