web-dev-qa-db-fra.com

Exécutez la commande xp_cmdshell en tant qu'utilisateur spécifique

Je voudrais exécuter xp_cmdshell (procédure TSQL) afin de monter un lecteur réseau et d’accéder ensuite aux fichiers mdb distants.

Je suis administrateur sur le serveur MS SQL et j'ai autorisé xp_cmdshell execution en conséquence.

Cependant, il y a toujours un problème:

  • Lorsque j'appelle xp_cmdshell, l'utilisateur qui exécute la commande est le SQL SysAdmin , c'est-à-dire le compte qui exécute le processus SQL Server.

  • Je souhaite xp_cmdshell s'exécute sous le compte avec lequel je suis connecté au serveur SQL, c'est-à-dire Administrateur

Ces deux comptes appartiennent au groupe d'administrateurs, le groupe SQLAdmin, et sont attribués à CONTROL SERVER. Les deux utilisateurs appartiennent au même domaine. Tout cela est exécuté sur la même machine.

En raison de ce conflit, je ne peux pas utiliser un lecteur réseau car il est monté pour SysAdmin et pas pour Administrateur
J'ai essayé d'utiliser sp_ xp_ cmdshell_ proxy_ compte pour spécifier le compte avec lequel je souhaite exécuter xp_cmdshell , mais SysAdmin est toujours le compte utilisé.

Par conséquent, ce code:
select user_name(), suser_name;
exec xp_cmdshell 'echo %username%'; 

affiche:
Administrator Administrator
SysAdmin

Est-ce que quelqu'un sait comment se faire passer pour la commande xp_cmdshell ? Y a-t-il quelque chose à (re) configurer?

Merci de votre aide.

15
Antwan

Étant donné que vous vous connectez à SQL en tant que connexion dans le groupe sysadmin, xp_cmdshell est exécuté en tant que compte de service. 

Si vous vous connectez en tant que connexion à faible privilège, il utilisera plutôt le xp_cmdshell_proxy_account. Donc, essayez d'abord EXECUTE AS LOGIN='lowprivaccount' pour voir si cela aide.

Bien entendu, ce que vous demandez en réalité n'est pas l'utilisation attendue. L'utilisation attendue est que les comptes à privilèges élevés puissent autoriser xp_cmdshell à utiliser le compte de service, alors que tout le monde doit accepter le compte proxy à privilèges inférieurs.

8
Rob Farley

En fait, j’ai dû utiliser cette méthode dans le passé pour des choses similaires sur des partages réseau, essayez ceci ... 

- mappez votre lecteur et rendez-le persistant.

xp_cmdshell "Net utiliser t: \\ <serveur>\<partage> <mot de passe>/utilisateur: <nom d'utilisateur>/persistent: oui"

- code t-sql utilisant le lecteur t

- supprimer le mappage de lecteur xp_cmdshell "Net Use t:/delete"

vous pouvez réellement configurer un travail qui s'exécute au démarrage du service SQL et lui demander de mapper ce lecteur afin de toujours avoir accès au partage tant que SQL s'exécute. Il vous suffit de configurer un sproc qui mappe le lecteur, de le mapper initialement et d'utiliser sp_procoption ( http://msdn.Microsoft.com/en-us/library/ms181720. aspx )

3
tcnolan

Peut-être que vous pourriez essayer PsExec? Téléchargez le fichier à cette adresse URL et copiez-le dans un dossier membre de la variable d'environnement% Path%.

http://technet.Microsoft.com/en-us/sysinternals/bb897553.aspx

exec xp_cmdshell 'psexec -u Administrator -p password Net Use ...'
1
EricV

J'ai trouvé que cette page permettait de combler les lacunes du processus d'ajout et de lien du compte de domaine.

http://sqlblog.com/blogs/tibor_karaszi/archive/2007/08/23/xp-cmdshell-and-permissions.aspx

0
Tyler W. Cox

Vous pouvez essayer "Net Use" avec un nom d'utilisateur et un mot de passe dans xp_cmdshell. Ceci établit les informations d'identification pour la connexion à l'UNC.

Cependant, je ne sais pas combien de temps cela durerait. S'il persiste indéfiniment (par exemple jusqu'au redémarrage du serveur), vous pouvez avoir une procédure stockée de démarrage qui effectue "Net Use" et garantit sa disponibilité pour une utilisation ultérieure.

Un xp_cmdshell ultérieur (pour accéder aux fichiers MDB) ne nécessiterait pas d'authentification, car les informations d'identification sont déjà établies dans le système d'exploitation.

0
gbn