Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
Wichtig
Argumente für erweiterte gespeicherte Prozeduren müssen in der spezifischen Reihenfolge eingegeben werden, wie im Abschnitt Syntax beschrieben. Wenn die Parameter außerhalb der Reihenfolge eingegeben werden, tritt eine Fehlermeldung auf.
"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.
EXECUTE 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 gespeichert xp_cmdshellist, ##xp_cmdshell_proxy_account## 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 wird beispielsweise ein Proxyanmeldeinformation für Windows-Domänenbenutzer SHIPPING\KobeRerstellt. Ersetzen Sie <password> es durch ein sicheres Kennwort.
EXECUTE sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', '<password>';
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:
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_accountSystemverfahren, 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
masterDatenbank die folgende Transact-SQL-Anweisung aus, um bestimmten Nicht-Sysadmin-Benutzern die Möglichkeit zur Ausführungxp_cmdshellzu geben. Der angegebene Benutzer muss in dermasterDatenbank 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:
EXECUTE xp_cmdshell 'whoami.exe';
Führen Sie den folgenden Transact-SQL-Code aus, um den Sicherheitskontext für eine andere Anmeldung zu ermitteln:
EXECUTE AS LOGIN = '<other_login>';
GO
EXECUTE xp_cmdshell 'whoami.exe';
REVERT;
Beispiele
Ein. Zurückgeben einer Liste von ausführbaren Dateien
Im folgenden Beispiel wird mithilfe der erweiterten gespeicherten Prozedur xp_cmdshell der Befehl DIR ausgeführt.
EXECUTE 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;
EXECUTE 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 AS INT;
EXECUTE @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 AS SYSNAME, @var AS SYSNAME;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';
EXECUTE 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 AS SYSNAME, @var AS SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';
EXECUTE master..xp_cmdshell @cmd;