xp_cmdshell (Transact-SQL)
van toepassing op:SQL Server-
Spawns een Windows-opdrachtshell en geeft een tekenreeks door voor uitvoering. Elke uitvoer wordt geretourneerd als rijen met tekst.
Transact-SQL syntaxisconventies
Syntaxis
xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]
Argumenten
Belangrijk
Argumenten voor uitgebreide opgeslagen procedures moeten worden ingevoerd in de specifieke volgorde, zoals beschreven in de sectie Syntaxis. Als de parameters niet in de volgorde zijn ingevoerd, treedt er een foutbericht op.
'command_string'
De tekenreeks die een opdracht bevat die moet worden doorgegeven aan het besturingssysteem. command_string is varchar(8000) of nvarchar(4000), zonder standaardinstelling. command_string mag niet meer dan één set dubbele aanhalingstekens bevatten. Er is één paar aanhalingstekens vereist als er spaties aanwezig zijn in de bestandspaden of programmanamen waarnaar in command_stringwordt verwezen. Als u problemen ondervindt met ingesloten ruimten, kunt u overwegen fat 8.3-bestandsnamen te gebruiken als tijdelijke oplossing.
NO_ UITVOER
Een optionele parameter die aangeeft dat er geen uitvoer naar de client moet worden geretourneerd.
Codewaarden retourneren
0
(geslaagd) of 1
(mislukt).
Resultatenset
Als u de volgende xp_cmdshell
-instructie uitvoert, wordt een mapvermelding van de huidige map geretourneerd.
EXEC xp_cmdshell 'dir *.exe';
GO
De rijen worden geretourneerd in een nvarchar(255) kolom. Als de NO_OUTPUT
optie wordt gebruikt, wordt alleen de volgende uitvoer geretourneerd:
The command(s) completed successfully.
Opmerkingen
Het Windows-proces dat is voortgekomen door xp_cmdshell
heeft dezelfde beveiligingsrechten als het SQL Server-serviceaccount.
Voorzichtigheid
xp_cmdshell
is een krachtige functie en standaard uitgeschakeld.
xp_cmdshell
kan worden ingeschakeld en uitgeschakeld met behulp van beheer op basis van beleid of door sp_configure
uit te voeren. Zie surface area configuration and xp_cmdshell (server configuration option)voor meer informatie. Met xp_cmdshell
kunt u hulpprogramma's voor beveiligingscontrole activeren.
xp_cmdshell
werkt synchroon. Het besturingselement wordt pas teruggezet naar de aanroeper als de opdrachtshell-opdracht is voltooid. Als xp_cmdshell
wordt uitgevoerd in een batch en een fout retourneert, mislukt de batch.
xp_cmdshell proxyaccount
Wanneer deze wordt aangeroepen door een gebruiker die geen lid is van de sysadmin vaste serverfunctie, maakt xp_cmdshell
verbinding met Windows met behulp van de accountnaam en het wachtwoord die zijn opgeslagen in de referentie met de naam ##xp_cmdshell_proxy_account##. Als deze proxyreferentie niet bestaat, mislukt xp_cmdshell
.
De proxyaccountreferentie kan worden gemaakt door sp_xp_cmdshell_proxy_account
uit te voeren. Als argumenten gebruikt deze opgeslagen procedure een Windows-gebruikersnaam en -wachtwoord. Met de volgende opdracht maakt u bijvoorbeeld een proxyreferentie voor windows-domeingebruikers SHIPPING\KobeR
met het Windows-wachtwoord sdfh%dkc93vcMt0
.
EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', 'sdfh%dkc93vcMt0';
Zie sp_xp_cmdshell_proxy_accountvoor meer informatie.
Machtigingen
Omdat kwaadwillende gebruikers soms proberen hun bevoegdheden te verhogen met behulp van xp_cmdshell
, wordt xp_cmdshell
standaard uitgeschakeld. Gebruik sp_configure
of op beleid gebaseerd beheer om dit in te schakelen. Zie xp_cmdshell Serverconfiguratieoptievoor meer informatie.
Wanneer xp_cmdshell
voor het eerst is ingeschakeld, is CONTROL SERVER-machtiging vereist om uit te voeren en heeft het Windows-proces dat door xp_cmdshell
is gemaakt, dezelfde beveiligingscontext als het SQL Server-serviceaccount. Het SQL Server-serviceaccount heeft vaak meer machtigingen dan nodig is voor het werk dat is uitgevoerd door het proces dat door xp_cmdshell
is gemaakt. Om de beveiliging te verbeteren, moet de toegang tot xp_cmdshell
worden beperkt tot gebruikers met hoge bevoegdheden.
Voer de volgende stappen uit om niet-beheerders toe te staan xp_cmdshell
te gebruiken en SQL Server toe te staan onderliggende processen te maken met het beveiligingstoken van een account met minder bevoegdheden:
Maak en pas een lokaal Windows-gebruikersaccount of een domeinaccount aan met de minste bevoegdheden die uw processen nodig hebben.
Gebruik de
sp_xp_cmdshell_proxy_account
-systeemprocedure omxp_cmdshell
te configureren voor het gebruik van dat minst bevoegde account.Notitie
U kunt dit proxyaccount ook configureren met BEHULP van SQL Server Management Studio door met de rechtermuisknop te klikken op Eigenschappen op de servernaam in Objectverkenner en te kijken naar het tabblad Security voor het Server-proxyaccount sectie.
Voer in Management Studio met behulp van de
master
-database de volgende Transact-SQL instructie uit om specifieke niet-sysadmin- gebruikers de mogelijkheid te geven omxp_cmdshell
uit te voeren. De opgegeven gebruiker moet aanwezig zijn in demaster
-database.GRANT exec ON xp_cmdshell TO N'<some_user>';
Niet-beheerders kunnen nu besturingssysteemprocessen starten met xp_cmdshell
en deze processen worden uitgevoerd met de machtigingen van het proxyaccount dat u hebt geconfigureerd. Gebruikers met de machtiging CONTROL SERVER (leden van de sysadmin vaste serverrol) blijven de machtigingen van het SQL Server-serviceaccount ontvangen voor onderliggende processen die door xp_cmdshell
worden gestart.
Voer de volgende instructie uit om te bepalen welk Windows-account wordt gebruikt door xp_cmdshell
bij het starten van besturingssysteemprocessen:
EXEC xp_cmdshell 'whoami.exe';
Voer de volgende Transact-SQL code uit om de beveiligingscontext voor een andere aanmelding te bepalen:
EXEC AS LOGIN = '<other_login>';
GO
xp_cmdshell 'whoami.exe';
REVERT;
Voorbeelden
Een. Een lijst met uitvoerbare bestanden retourneren
In het volgende voorbeeld ziet u de xp_cmdshell
uitgebreide opgeslagen procedure voor het uitvoeren van een mapopdracht.
EXEC master..xp_cmdshell 'dir *.exe'
B. Geen uitvoer retourneren
In het volgende voorbeeld wordt xp_cmdshell
gebruikt om een opdrachtreeks uit te voeren zonder de uitvoer naar de client te retourneren.
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks', NO_OUTPUT;
GO
C. Retourstatus gebruiken
In het volgende voorbeeld stelt de xp_cmdshell
uitgebreide opgeslagen procedure ook de retourstatus voor. De retourcodewaarde wordt opgeslagen in de variabele @result
.
DECLARE @result INT;
EXEC @result = xp_cmdshell 'dir *.exe';
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure';
D. Inhoud van variabele naar een bestand schrijven
In het volgende voorbeeld wordt de inhoud van de variabele @var
naar een bestand met de naam var_out.txt
in de huidige servermap geschreven.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'Hello world';
SET @cmd = 'echo ' + @var + ' > var_out.txt';
EXEC master..xp_cmdshell @cmd;
E. Het resultaat van een opdracht vastleggen in een bestand
In het volgende voorbeeld wordt de inhoud van de huidige map naar een bestand met de naam dir_out.txt
in de huidige servermap geschreven.
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';
EXEC master..xp_cmdshell @cmd;