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

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions)

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 vom Datentyp varchar (8000) oder nvarchar (4000) und hat keinen Standardwert.command_string is varchar(8000) or nvarchar(4000), with no default. command_string darf nicht mehr als einen Satz von doppelten 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 Spalte vom Typ nvarchar (255) zurückgegeben.The rows are returned in an nvarchar(255) column. Wenn die no_output -Option 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 von xp_cmdshell erzeugte Windows-Prozess hat die gleichen Sicherheitsrechte wie das SQL ServerSQL Server Dienst Konto.The Windows process spawned by xp_cmdshell has the same security rights as the SQL ServerSQL Server service account.

Wichtig

xp_cmdshell ist ein sehr leistungsfähiges Feature, das standardmäßig deaktiviert ist.xp_cmdshell is a very powerful feature and disabled by default. xp_cmdshell können mithilfe der Richtlinien basierten Verwaltung oder durch Ausführen von sp_configureaktiviert und deaktiviert werden.xp_cmdshell can be enabled and disabled by using the Policy-Based Management or by executing sp_configure. Weitere Informationen finden Sie unter Surface Area Configuration und xp_cmdshell Server Configuration Option.For more information, see Surface Area Configuration and xp_cmdshell Server Configuration Option.

xp_cmdshell erfolgt 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.

Wichtig

Wenn xp_cmdshell innerhalb eines Batches ausgeführt wird und einen Fehler zurückgibt, tritt ein Fehler auf.If xp_cmdshell is executed within a batch and returns an error, the batch will fail. Dies ist eine Änderung des Verhaltens.This is a change of behavior. In früheren Versionen von wurde MicrosoftMicrosoft SQL ServerSQL Server der Batch weiterhin ausgeführt.In earlier versions of MicrosoftMicrosoftSQL ServerSQL Server the batch would continue to execute.

xp_cmdshell-Proxykontoxp_cmdshell Proxy Account

Wenn Sie von einem Benutzer aufgerufen wird, der kein Mitglied der festen Server Rolle sysadmin ist, stellt xp_cmdshell eine Verbindung mit Windows her, indem er den in den Anmelde Informationen mit dem Namen # #xp_cmdshell_proxy_account # # gespeicherten Kontonamen und das Kennwort verwendet.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 Proxy Anmelde Informationen nicht vorhanden sind, schlägt xp_cmdshell fehl.If this proxy credential does not exist, xp_cmdshell will fail.

Die Anmelde Informationen des Proxy Kontos können durch Ausführen von 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 Richtlinien basierte 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 für die Ausführung, und der von xp_cmdshell erstellte Windows-Prozess hat denselben Sicherheitskontext wie das SQL ServerSQL Server Dienst Konto.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 Dienst Konto 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 Privilegien eingeschränkt werden.To enhance security, access to xp_cmdshell should be restricted to highly privileged users.

Führen Sie die folgenden Schritte aus, um nicht Administratoren die Verwendung von xp_cmdshellzu gestatten und SQL ServerSQL Server das Erstellen von untergeordneten Prozessen mit dem Sicherheits Token eines Kontos mit geringen Rechten zu ermöglichen: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 das Verfahren sp_xp_cmdshell_proxy_account System, 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 Proxy Konto auch mithilfe SQL Server Management StudioSQL Server Management Studio von konfigurieren, indem Sie in Objekt-Explorer mit der rechten Maustaste auf Eigenschaften Ihres Server namens klicken und auf der Registerkarte Sicherheit für den Abschnitt Server Proxy Konto 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. Management StudioManagement StudioFühren Sie in mithilfe der Master-Datenbank die-Anweisung aus, GRANT exec ON xp_cmdshell TO N'<some_user>'; um bestimmten nicht-sysadmin -Benutzern die Ausführung von xp_cmdshellzu ermöglichen.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 Master-Datenbank vorhanden sein.The specified user must exist in the master database.

Nicht Administratoren können jetzt Betriebssystem Prozesse mit xp_cmdshell starten, und diese Prozesse werden mit den Berechtigungen des von Ihnen konfigurierten Proxy Kontos 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 festen Server Rolle sysadmin ) empfangen weiterhin die Berechtigungen des SQL ServerSQL Server Dienst Kontos 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 bestimmen, das von xp_cmdshell beim Starten von Betriebssystem Prozessen 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 wird von der xp_cmdshell erweiterten gespeicherten Prozedur auch der Rückgabestatus vorgeschlagen.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;  

Weitere InformationenSee Also

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