web-dev-qa-db-fra.com

Obtenir l'autorisation d'exécution pour xp_cmdshell

Un message d'erreur s'affiche lorsque j'essaie d'exécuter xp_cmdshell à partir d'une procédure stockée.

xp_cmdshell est activé sur l'instance. Et l'autorisation d'exécution a été accordée à mon utilisateur, mais je vois toujours l'exception.

L’autorisation EXECUTE a été refusée sur l’objet «xp_cmdshell», la base de données «mssqlsystemresource», le schéma «sys».

Une partie du problème réside dans le fait qu'il s'agit d'un cluster partagé et que nous ne disposons que d'une seule base de données sur l'instance. Nous ne disposons donc pas d'une gamme complète d'autorisations d'administrateur. Donc, je ne peux pas aller et accorder des autorisations, et ce-pas.

31
David Griffiths

Pour les utilisateurs qui ne sont pas membres du rôle sysadmin sur l'instance SQL Server, vous devez effectuer les actions suivantes pour accorder l'accès à la procédure stockée étendue xp_cmdshell. En outre, si vous avez oublié l'une des étapes, j'ai répertorié l'erreur qui sera générée.

  1. Activer la procédure xp_cmdshell

    Msg 15281, niveau 16, état 1, procédure xp_cmdshell, ligne 1 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. 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. *

  2. Créez une connexion pour l'utilisateur non administrateur système ayant un accès public à la base de données master

    Msg 229, niveau 14, état 5, procédure xp_cmdshell, ligne 1 L'autorisation EXECUTE a été refusée sur l'objet 'xp_cmdshell', la base de données 'mssqlsystemresource', le schéma 'sys'. *

  3. Accorder l'autorisation EXEC sur la procédure stockée xp_cmdshell

    Msg 229, niveau 14, état 5, procédure xp_cmdshell, ligne 1 L'autorisation EXECUTE a été refusée sur l'objet 'xp_cmdshell', la base de données 'mssqlsystemresource', le schéma 'sys'. *

  4. Créez un compte proxy sous lequel xp_cmdshell sera exécuté à l'aide de sp_xp_cmdshell_proxy_account  

    Msg 15153, niveau 16, état 1, procédure xp_cmdshell, ligne 1 Les informations du compte proxy xp_cmdshell ne peuvent pas être récupérées ou ne sont pas valides. Vérifiez que les informations d'identification ## xp_cmdshell_proxy_account ## 'existent et contiennent des informations valides. *

D'après votre erreur, il semblerait que l'une ou l'autre des étapes 2 ou 3 ait été manquée. Je ne connais pas bien les clusters pour savoir s’il existe quelque chose de particulier à cette configuration.

54
user121489

Je veux compléter la réponse de tchester.

(1) Activez la procédure xp_cmdshell:

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO

-- Enable the xp_cmdshell procedure
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO

(2) Créez un nom de domaine 'Domaine\TestUser' (utilisateur Windows) pour l'utilisateur non administrateur système disposant d'un accès public à la base de données master.

(3) Accordez l'autorisation EXEC sur la procédure stockée xp_cmdshell:

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser]

(4) Créez un compte proxy sur lequel xp_cmdshell sera exécuté à l'aide de sp_xp_cmdshell_proxy_account.

EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'pwd'
-- Note: pwd means windows password for [Domain\TestUser] account id on the box.
--       Don't include square brackets around Domain\TestUser.

(5) Accorder l’autorisation du serveur de contrôle à l’utilisateur

USE master;
GRANT CONTROL SERVER TO [Domain\TestUser]
GO
42
nZeus

tchester dit:

(2) Créez une connexion pour l'utilisateur non administrateur système disposant d'un accès public à la base de données master.

Je suis allé dans la liste de la base de données de mon utilisateur (serveur/sécurité/connexions/mon nom d'utilisateur/propriétés/mappage utilisateur) et je voulais cocher la case correspondant à la base de données principale. pour maîtriser la base de données, abandonner l'utilisateur, revenir à "mappage utilisateur" et cocher la case maître. Cochez la case "public" ci-dessous.

Après cela, vous devez émettre à nouveau l'autorisation d'exécuter sur xp_cmdshell sur "mon nom d'utilisateur".

Yves

1
Yves Forget

Pour développer ce qui a été fourni pour exporter automatiquement des données au format csv vers un partage réseau via SQL Server Agent.

(1) Activez la procédure xp_cmdshell:

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO

-- Enable the xp_cmdshell procedure
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO

(2) Créez un nom de domaine 'Domaine\TestUser' (utilisateur Windows) pour l'utilisateur non administrateur système disposant d'un accès public à la base de données master. Fait par mappage utilisateur

(3) Donner la connexion en tant que travail par lots: Accédez à Stratégie de sécurité locale -> Stratégies locales -> Attribution des droits utilisateur. Ajouter un utilisateur à "Connexion en tant que travail par lots"

(4) Accorder des autorisations de lecture/écriture au dossier réseau pour le domaine\utilisateur

(5) Accordez l'autorisation EXEC sur la procédure stockée xp_cmdshell:

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser]

(6) Créez un compte proxy sur lequel xp_cmdshell sera exécuté à l'aide de sp_xp_cmdshell_proxy_account.

EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'password_for_domain_user'

(7) Si la commande sp_xp_cmdshell_proxy_account ne fonctionne pas, créez-la manuellement.

create credential ##xp_cmdshell_proxy_account## with identity = 'Domain\DomainUser', secret = 'password'

(8) Activer l'Agent SQL Server. Ouvrez le Gestionnaire de configuration SQL Server, accédez aux services SQL Server, activez SQL Server Agent.

(9) Créer un travail automatisé. Ouvrez SSMS, sélectionnez Agent SQL Server, puis cliquez avec le bouton droit de la souris sur les tâches et cliquez sur "Nouvelle tâche". 

(10) Sélectionnez "Propriétaire" en tant qu'utilisateur créé. Sélectionnez "Étapes", faites "type" = T-SQL. Remplissez le champ de commande similaire à ci-dessous. Définir le délimiteur comme ','

EXEC master..xp_cmdshell 'SQLCMD -q "select * from master" -o file.csv -s "," 

(11) Remplissez les horaires en conséquence.

0
Schylar