xp_cmdshell (Transact-SQL)

Gilt für:SQL Server

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

Transact-SQL-Syntaxkonventionen

Syntax

xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]

Argumente

"command_string"

Die Zeichenfolge, die einen Befehl enthält, der an das Betriebssystem übergeben werden soll. command_string ist varchar(8000) oder nvarchar(4000) ohne Standardwert. command_string darf nicht mehr als einen Satz doppelter Anführungszeichen enthalten. Ein einzelnes Paar von Anführungszeichen ist erforderlich, wenn in den Dateipfaden oder Programmnamen, auf die in command_string verwiesen wird, Leerzeichen vorhanden sind. Wenn Probleme mit eingebetteten Leerzeichen auftreten, sollten Sie FAT 8.3-Dateinamen verwenden, um dieses Problem zu umgehen.

NO_ AUSGABE

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

Rückgabecodewerte

0 (Erfolg) oder 1 (Fehler).

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 nvarchar(255) -Spalte zurückgegeben. Wenn die NO_OUTPUT Option verwendet wird, wird nur die folgende Ausgabe zurückgegeben:

The command(s) completed successfully.

Bemerkungen

Der von xp_cmdshell erzeugte Windows-Prozess verfügt über dieselben Sicherheitsrechte wie das SQL Server-Dienstkonto.

Achtung

xp_cmdshell ist ein leistungsstarkes Feature und standardmäßig deaktiviert. xp_cmdshell kann mithilfe der richtlinienbasierten Verwaltung oder durch Ausführen sp_configurevon aktiviert und deaktiviert werden. Weitere Informationen finden Sie unter Oberflächenkonfiguration und xp_cmdshell (Serverkonfigurationsoption). Die Verwendung von xp_cmdshell kann Sicherheitsüberwachungstools auslösen.

xp_cmdshell wird synchron ausgeführt. Die Steuerung wird erst an den Aufrufer zurückgegeben, wenn der Befehl der Befehlsshell abgeschlossen ist. Wenn xp_cmdshell innerhalb eines Batches ausgeführt wird und ein Fehler zurückgegeben wird, schlägt der Batch fehl.

xp_cmdshell Proxykonto

Wenn er von einem Benutzer aufgerufen wird, der nicht Mitglied der festen Serverrolle sysadmin ist, stellt eine Verbindung mit Windows her, xp_cmdshell indem der Kontoname und das Kennwort verwendet werden, die in den Anmeldeinformationen mit dem Namen ##xp_cmdshell_proxy_account## gespeichert sind. Wenn diese Proxyanmeldeinformationen nicht vorhanden sind, xp_cmdshell tritt ein Fehler auf.

Die Anmeldeinformationen für das Proxykonto können durch Ausführen sp_xp_cmdshell_proxy_accountvon 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 xp_cmdshellvon zu erhöhen, xp_cmdshell ist standardmäßig deaktiviert. Verwenden Sie sp_configure oder die richtlinienbasierte Verwaltung , um sie zu aktivieren. Weitere Informationen finden Sie unter xp_cmdshell (Serverkonfigurationsoption).

Wenn dies zum ersten Mal aktiviert ist, muss die CONTROL SERVER-Berechtigung ausgeführt werden, xp_cmdshell und der von xp_cmdshell erstellte Windows-Prozess verfügt über denselben Sicherheitskontext wie das SQL Server-Dienstkontos. Das SQL Server-Dienstkonto verfügt häufig über mehr Berechtigungen, als für die Arbeit erforderlich ist, die von dem von xp_cmdshellerstellten Prozess ausgeführt wird. Um die Sicherheit zu erhöhen, sollte der xp_cmdshell Zugriff auf auf Benutzer mit hohen Berechtigungen beschränkt werden.

Führen Sie die folgenden Schritte aus, damit xp_cmdshellNichtadministratoren verwenden und SQL Server untergeordnete Prozesse mit dem Sicherheitstoken eines Kontos mit weniger Berechtigungen erstellen können:

  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 das sp_xp_cmdshell_proxy_account Systemverfahren, um die Verwendung dieses Kontos mit den geringsten Rechten zu konfigurieren xp_cmdshell .

    Hinweis

    Sie können dieses Proxykonto auch mithilfe von SQL Server Management Studio konfigurieren, indem Sie in Objekt-Explorer mit der rechten Maustaste auf Eigenschaften ihres Servernamens klicken und auf der Registerkarte Sicherheit nach dem Abschnitt Serverproxykonto suchen.

  3. Führen Sie in Management Studio mithilfe der master Datenbank die folgende Transact-SQL-Anweisung aus, um bestimmten Nicht-Sysadmin-Benutzern die Möglichkeit zu geben, xp_cmdshellauszuführen. Der angegebene Benutzer muss in der master Datenbank vorhanden sein.

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

Jetzt können Nichtadministratoren Betriebssystemprozesse mit xp_cmdshell starten, und diese Prozesse werden mit den Berechtigungen des proxykontos ausgeführt, das Sie konfiguriert haben. Benutzer mit control server-Berechtigung (Mitglieder der festen Serverrolle sysadmin) erhalten weiterhin die Berechtigungen des SQL Server-Dienstkontos für untergeordnete Prozesse, die von xp_cmdshellgestartet werden.

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

EXEC xp_cmdshell 'whoami.exe';

Führen Sie den folgenden Transact-SQL-Code aus, um den Sicherheitskontext für eine andere Anmeldung zu bestimmen:

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

Beispiele

A. Zurückgeben einer Liste ausführbarer Dateien

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

EXEC master..xp_cmdshell 'dir *.exe'

B. Keine Ausgabe zurückgeben

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 von Rückgabe-status

Im folgenden Beispiel schlägt die xp_cmdshell erweiterte gespeicherte Prozedur auch vor, status zurückzugeben. 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 von Variableninhalten 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. Erfassen 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;

Siehe auch