web-dev-qa-db-fra.com

Activer SQL Server 'xp_cmdshell'

Je veux exécuter EXEC master..xp_cmdshell @bcpquery 

Mais j'obtiens l'erreur suivante:

SQL Server a bloqué l'accès à la procédure 'sys.xp_cmdshell' du composant 'xp_cmdshell' car ce composant est désactivé dans la configuration de la sécurité pour ce serveur. Un administrateur système peut activer l'utilisation de 'xp_cmdshell' à l'aide de sp_configure. Pour plus d'informations sur l'activation de 'xp_cmdshell', voir "Configuration de la surface d'exposition" dans la documentation en ligne de SQL Server.

Est-il possible d'activer ceci ou d'exécuter quelque chose avant d'activer la fonctionnalité? 

Comment le résoudre?

164
cMinor

Vous devez l'activer. Consultez la section Permission du xp_cmdshell MSDN docs

http://msdn.Microsoft.com/en-us/library/ms190693.aspx :

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO
344
Pero P.

Vous pouvez également masquer à nouveau l'option avancée après reconfiguration:

-- show advanced options
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
-- enable xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
-- hide advanced options
EXEC sp_configure 'show advanced options', 0
GO
RECONFIGURE
GO
36
hoggar

Clic droit sur le serveur -> Facettes -> Configuration de la surface d'exposition -> XPCmshellEnbled -> true  enter image description here

13
arnav

Comme indiqué dans d'autres réponses, l'astuce (dans SQL 2005 ou ultérieure) consiste à modifier les paramètres de configuration globale de show advanced options et xp_cmdshell en 1, dans cet ordre.

En ajoutant à cela, si vous voulez conserver les valeurs précédentes, vous pouvez les lire à partir de sys.configurations , puis les appliquer dans l’ordre inverse à la fin. Nous pouvons également éviter les appels reconfigure inutiles:

declare @prevAdvancedOptions int
declare @prevXpCmdshell int

select @prevAdvancedOptions = cast(value_in_use as int) from sys.configurations where name = 'show advanced options'
select @prevXpCmdshell = cast(value_in_use as int) from sys.configurations where name = 'xp_cmdshell'

if (@prevAdvancedOptions = 0)
begin
    exec sp_configure 'show advanced options', 1
    reconfigure
end

if (@prevXpCmdshell = 0)
begin
    exec sp_configure 'xp_cmdshell', 1
    reconfigure
end

/* do work */

if (@prevXpCmdshell = 0)
begin
    exec sp_configure 'xp_cmdshell', 0
    reconfigure
end

if (@prevAdvancedOptions = 0)
begin
    exec sp_configure 'show advanced options', 0
    reconfigure
end

Notez que cela repose sur SQL Server version 2005 ou ultérieure (la question initiale était pour 2008).

8
Geoff

Bien que la réponse acceptée fonctionne la plupart du temps, j’ai rencontré (je ne sais toujours pas pourquoi) certains cas qui ne l’ont pas été. Une légère modification de la requête en utilisant le WITH OVERRIDE dans RECONFIGURE donne la solution

Use Master
GO

EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO

EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO

La sortie attendue est 

L'option de configuration 'afficher les options avancées' est passée de 0 à 1. Exécutez l'instruction RECONFIGURE à installer.
L'option de configuration 'xp_cmdshell' est passée de 0 à 1. Exécutez l'instruction RECONFIGURE à installer.

4
Athafoud

Même si cette question est résolue, je souhaite ajouter mon conseil à ce sujet .... car j'ai ignoré en tant que développeur.

Il est important de savoir que nous parlons de MSSQL xp_cmdshell activé est essentiel à la sécurité, comme indiqué dans le message d'avertissement:

Blockquote SQL Server a bloqué l'accès à la procédure 'sys.xp_cmdshell' du composant 'xp_cmdshell' car ce composant est désactivé dans le cadre de la configuration de la sécurité pour ce serveur. [...]

Laisser le service activé est une sorte de faiblesse , qui par exemple dans une application Web pourrait refléter et exécuter des commandes SQL d'un attaquant. Le populaire CWE-89 : SQL Injection pourrait être une faiblesse de notre logiciel, et donc ce type de scénario pourrait ouvrir la voie à des attaques éventuelles, telles que CAPEC-108 : Command Line Execution through SQL Injection

J'espère avoir fait quelque chose d'agréable, nous développeurs et ingénieurs faisons les choses avec conscience et nous serons plus en sécurité!

3
sawyer

Pour moi, le seul moyen d'utiliser SQL 2008 R2 était le suivant:

EXEC sp_configure 'Show Advanced Options', 1    
RECONFIGURE **WITH OVERRIDE**    
EXEC sp_configure 'xp_cmdshell', 1    
RECONFIGURE **WITH OVERRIDE**
0
David Bru