xp_cmdshell (Transact-SQL)

Gilt für: SQL Server (alle unterstützten Versionen)

Erzeugt eine Windows-Befehlsshell und übergibt eine Zeichenfolge für die Ausführung. Die Ausgabe wird ggf. in Textzeilen zurückgegeben.

ThemenlinksymbolTransact-SQL-Syntaxkonventionen

Syntax

  
xp_cmdshell { 'command_string' } [ , no_output ]  

Argumente

"command_string"
Die Zeichenfolge, die einen an das Betriebssystem zu übergebenden Befehl enthält. command_string ist varchar(8000) oder nvarchar(4000), ohne Standard. command_string kann nicht mehr als eine Reihe von doppelten Anführungszeichen enthalten. Ein einzelnes Anführungszeichenpaar ist erforderlich, wenn Leerzeichen in den Dateipfaden oder Programmnamen vorhanden sind, auf die in command_string verwiesen wird. Wenn Probleme mit eingebetteten Leerzeichen auftreten, sollten Sie FAT 8.3-Dateinamen verwenden, um dieses Problem zu umgehen.

no_output
Ein optionaler Parameter, der angibt, dass keine Ausgabe an den Client zurückgegeben werden soll.

Rückgabecodewerte

„0“ (erfolgreich) oder „1“ (fehlerhaft)

Resultsets

Mit der folgenden xp_cmdshell-Anweisung wird eine Verzeichnisaufstellung des aktuellen Verzeichnisses zurückgegeben.

EXEC xp_cmdshell 'dir *.exe';  
GO  

Die Zeilen werden in einer Spalte nvarchar(255) zurückgegeben. Wenn die option no_output verwendet wird, werden nur die folgenden zurückgegeben:

The command(s) completed successfully.  

Hinweise

Der windows-Prozess, der von xp_cmdshell ausgelöst wurde, weist die gleichen Sicherheitsrechte wie das SQL Server Dienstkonto auf.

Wichtig

xp_cmdshell ist ein sehr leistungsstarkes Feature und standardmäßig deaktiviert. xp_cmdshell können mithilfe der Richtlinienbasierten Verwaltung oder durch Ausführen von sp_configure aktiviert und deaktiviert werden. Weitere Informationen finden Sie unter Surface Area Configuration and xp_cmdshell Server Configuration Option.

xp_cmdshell wird synchron ausgeführt. Die Steuerung wird erst dann an den Aufrufer zurückgegeben, wenn der Befehl der Befehlsshell abgeschlossen wurde.

Wichtig

Wenn xp_cmdshell innerhalb eines Batchs ausgeführt wird und einen Fehler zurückgibt, schlägt der Batch fehl. Dies ist eine Änderung des Verhaltens. In früheren Versionen von Microsoft SQL Server würde der Batch weiterhin ausgeführt.

xp_cmdshell-Proxykonto

Wenn es von einem Benutzer aufgerufen wird, der kein Mitglied der systemadmin fixed server role ist, xp_cmdshell eine Verbindung mit Windows herstellen, indem der Kontoname und das Kennwort verwendet werden, das in den Anmeldeinformationen namens ##xp_cmdshell_proxy_account### gespeichert ist. Wenn diese Proxyanmeldeinformationen nicht vorhanden sind, schlägt xp_cmdshell fehl.

Die Proxykontoanmeldeinformationen können durch Ausführen von sp_xp_cmdshell_proxy_account erstellt werden. Als Argumente besitzt diese gespeicherte Prozedur einen Windows-Benutzernamen und ein Kennwort. Mit dem folgenden Befehl werden z. B. Proxyanmeldeinformationen für den Windows-Domänenbenutzer SHIPPING\KobeR erstellt, der das Windows-Kennwort sdfh%dkc93vcMt0 besitzt.

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

Weitere Informationen finden Sie unter sp_xp_cmdshell_proxy_account (Transact-SQL).

Berechtigungen

Da böswillige Benutzer manchmal versuchen, ihre Berechtigungen mithilfe von xp_cmdshell zu erhöhen, ist xp_cmdshell standardmäßig deaktiviert. Verwenden Sie sp_configure oder richtlinienbasierte Verwaltung , um sie zu aktivieren. Weitere Informationen finden Sie unter xp_cmdshell (Serverkonfigurationsoption).

Bei der ersten Aktivierung erfordert xp_cmdshell CONTROL SERVER-Berechtigung zum Ausführen und der windows-Prozess, der von xp_cmdshell erstellt wurde, den gleichen Sicherheitskontext wie das SQL Server Dienstkonto hat. Das SQL Server Dienstkonto verfügt häufig über mehr Berechtigungen als für die von xp_cmdshell erstellten Arbeit. Um die Sicherheit zu verbessern, sollte der Zugriff auf xp_cmdshell auf hochgradig privilegierte Benutzer beschränkt sein.

Führen Sie die folgenden Schritte aus, um Nichtadministratoren die Verwendung von xp_cmdshell zu ermöglichen und SQL Server untergeordnete Prozesse mit dem Sicherheitstoken eines weniger privilegierten Kontos zu erstellen:

  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.

  2. Verwenden Sie die sp_xp_cmdshell_proxy_account Systemprozedur, um xp_cmdshell zu konfigurieren, um dieses am wenigsten privilegierte Konto zu verwenden.

    Hinweis

    Sie können dieses Proxykonto auch mithilfe von SQL Server Management Studio konfigurieren, indem Sie mit der rechten Maustaste auf Eigenschaften auf Ihrem Servernamen in Objekt-Explorer klicken und auf die Registerkarte "Sicherheit" für den Abschnitt "Serverproxykonto" suchen.

  3. Führen Sie in Management Studio mithilfe der Masterdatenbank die Anweisung aus, um bestimmten nicht sysadmin-Benutzern die GRANT exec ON xp_cmdshell TO N'<some_user>'; Möglichkeit zu geben, xp_cmdshell auszuführen. Der angegebene Benutzer muss in der Masterdatenbank vorhanden sein.

Jetzt können Nichtadministratoren Betriebssystemprozesse mit xp_cmdshell starten und diese Prozesse mit den Berechtigungen des Proxykontos ausführen, das Sie konfiguriert haben. Benutzer mit CONTROL SERVER-Berechtigung (Mitglieder der Rolle "sysadmin fixed server") erhalten weiterhin die Berechtigungen des SQL Server Dienstkontos für untergeordnete Prozesse, die von xp_cmdshell gestartet werden.

Führen Sie die folgende Anweisung aus, um das Windows-Konto zu bestimmen, das beim Starten von Betriebssystemprozessen von xp_cmdshell verwendet wird:

xp_cmdshell 'whoami.exe'  
  

Um den Sicherheitskontext für einen anderen Anmeldenamen zu bestimmen, führen Sie folgende Anweisung aus:

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

Beispiele

A. Zurückgeben einer Liste der ausführbaren Dateien

Im folgenden Beispiel wird mithilfe der erweiterten gespeicherten Prozedur xp_cmdshell der Befehl DIR ausgeführt.

EXEC master..xp_cmdshell 'dir *.exe'  

B. Unterdrücken der Ausgabe

Im folgenden Beispiel wird mit xp_cmdshell eine Befehlszeichenfolge ausgeführt, ohne dass die Ausgabe an den Client zurückgegeben wird.

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

C. Verwenden des Rückgabestatus

Im folgenden Beispiel schlägt auch die xp_cmdshell erweiterte gespeicherte Prozedur den Rückgabestatus vor. Der Rückgabecodewert wird in der Variablen @result gespeichert.

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

D: Schreiben des Inhalts von Variablen in eine Datei

Im folgenden Beispiel wird der Inhalt der @var-Variablen in die Datei var_out.txt im aktuellen Serververzeichnis geschrieben.

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

E. Aufzeichnen des Ergebnisses eines Befehls in einer Datei

Im folgenden Beispiel wird der Inhalt des aktuellen Verzeichnisses in die Datei dir_out.txt im aktuellen Serververzeichnis geschrieben.

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

Weitere Informationen

Allgemeine erweiterte gespeicherte Prozeduren (Transact-SQL)
xp_cmdshell Serverkonfigurationsoption
Oberflächenkonfiguration
sp_xp_cmdshell_proxy_account (Transact-SQL)