Freigeben über


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 Standard. command_string darf 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_ AUSGABE

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

Rückgabecodewerte

0 (erfolgreich) oder 1 Fehler.

Resultset

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.

Hinweise

Der Windows-Prozess, der von xp_cmdshell denselben Sicherheitsrechten wie das SQL Server-Dienstkonto bereitgestellt wird.

Achtung

xp_cmdshell ist ein leistungsfähiges Feature und standardmäßig deaktiviert. xp_cmdshell kann mithilfe der richtlinienbasierten Verwaltung oder durch Ausführen sp_configureaktiviert und deaktiviert werden. Weitere Informationen finden Sie unter Surface Area-Konfiguration und xp_cmdshell (Serverkonfigurationsoption). Die Verwendung von xp_cmdshell kann Sicherheitsüberwachungstools auslösen.

xp_cmdshell wird synchron ausgeführt. Das Steuerelement wird erst an den Aufrufer zurückgegeben, wenn der Befehlsshellbefehl 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 kein Mitglied der festen Serverrolle "sysadmin" ist, stellt eine Verbindung mit Windows mithilfe des Kontonamens und des Kennworts, das in den Anmeldeinformationen mit dem Namen ##xp_cmdshell_proxy_account## gespeichert ist, xp_cmdshell eine Verbindung mit Windows hergestellt. Wenn diese Proxyanmeldeinformationen nicht vorhanden sind, xp_cmdshell schlägt ein Fehler fehl.

Die Anmeldeinformationen des Proxykontos können durch Ausführen sp_xp_cmdshell_proxy_accounterstellt 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.

Berechtigungen

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

Wenn sie zum ersten Mal aktiviert sind, xp_cmdshell muss CONTROL SERVER-Berechtigung ausgeführt werden, und der von xp_cmdshell diesem erstellte Windows-Prozess weist den gleichen Sicherheitskontext wie das SQL Server-Dienstkonto auf. Das SQL Server-Dienstkonto verfügt häufig über mehr Berechtigungen, als für die arbeit erforderlich sind, die vom von diesem Prozess erstellten Prozess ausgeführt wurde xp_cmdshell. Um die Sicherheit zu xp_cmdshell verbessern, sollte der Zugriff auf Benutzer mit hoher Berechtigung eingeschränkt werden.

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

  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 das Konto mit den geringsten Rechten zu verwenden 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" auf ihrem Servernamen klicken und die Registerkarte "Sicherheit" für den 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 zur Ausführung xp_cmdshellzu geben. Der angegebene Benutzer muss in der master Datenbank vorhanden sein.

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

Jetzt können Nichtadministratoren Betriebssystemprozesse starten und xp_cmdshell diese Prozesse mit den Berechtigungen des von Ihnen konfigurierten Proxykontos ausgeführt werden. Benutzer mit CONTROL SERVER-Berechtigung (Member der sysadmin fixed server role) erhalten weiterhin die Berechtigungen des SQL Server-Dienstkontos für untergeordnete Prozesse, die von xp_cmdshell.

Führen Sie die folgende Anweisung aus, um das Windows-Konto zu ermitteln, das beim Starten von xp_cmdshell Betriebssystemprozessen 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 ermitteln:

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

Beispiele

A. Zurückgeben einer Liste von 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. 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. Rückgabestatus verwenden

Im folgenden Beispiel schlägt die xp_cmdshell erweiterte gespeicherte Prozedur auch 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 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;