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?
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
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
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).
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.
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é!
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**