Delen via


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_configureuit 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_accountuit 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_cmdshellis 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_cmdshellte gebruiken en SQL Server toe te staan onderliggende processen te maken met het beveiligingstoken van een account met minder bevoegdheden:

  1. Maak en pas een lokaal Windows-gebruikersaccount of een domeinaccount aan met de minste bevoegdheden die uw processen nodig hebben.

  2. Gebruik de sp_xp_cmdshell_proxy_account-systeemprocedure om xp_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.

  3. 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 om xp_cmdshelluit te voeren. De opgegeven gebruiker moet aanwezig zijn in de master-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_cmdshellworden 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;