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_configure
aktiviert 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_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.
Berechtigungen
Da böswillige Benutzer manchmal versuchen, ihre Berechtigungen zu erhöhen, xp_cmdshell
xp_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_cmdshell
ermöglichen, untergeordnete Prozesse mit dem Sicherheitstoken eines weniger privilegierten Kontos zu erstellen und SQL Server zuzulassen:
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.
Verwenden Sie das
sp_xp_cmdshell_proxy_account
Systemverfahren, um das Konto mit den geringsten Rechten zu verwendenxp_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.
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ührungxp_cmdshell
zu geben. Der angegebene Benutzer muss in dermaster
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;