PHP, la fonction exec() et IIS 7.5 : execution denied :-(

by Jean-françois JOLY on déc.08, 2010, under Developpement Web

Alors aujourd’hui j’ai eu un petit problème avec IIS 7.5 (je suis un newbie) : je voulais exécuter une commande et récupérer la sortie. “Pas de problème” me suis je dis, je vais faire comme sous linux :

<?php
$masortie=array();
$meserreurs=array();
@exec($macommande,$masortie,$meserreurs);
?>

Et là c’est le drame … En effet ça ne marche pas. En fait ce qui ne marche pas ce n’est pas de lancer une commande, mais plutôt d’exécuter un programme arbitraire.
Je m’explique : imaginons que j’ai envie de lancer un programme quelconque dans une directory quelconque et de récupérer la sortie. Par exemple, imaginons que j’ai ajouté les binaires de SVN dans mon path d’environnement me permettant d’appeler une commande svn comme : svn –l 100 –-xml c:\repository\projet
Là j’aimerais beaucoup pouvoir utiliser la sortie XML pour la parser et en retirer des informations intéressantes. Malheureusement pour moi je n’ai pas trouvé comment le faire avec la commande exec() de php. J’ai bien trouvé des techniques en mettant les droits de IS_USER sur le programme cible pour IIS 6.0, sauf qu’en plus d’être complexe, ça ne fonctionne pas du tout sur IIS 7.5.
Résultats des courses j’ai trouvé une alternative beaucoup plus simple que je vous livre toute cuite et qui pourra peut être resservir à quelqu’un Tire la langue.

<?php
class Exec{
	public static function run($command){
		$WScriptShell = new COM("WScript.Shell");
		$objCmd=$WScriptShell->Exec($command);
		$Out = $objCmd->StdOut->ReadAll;
		$Err = $objCmd->StdErr->ReadAll;
		$Out=explode("\r\n",$Out);
		if(empty($Out[count($Out)-1])){
			unset($Out[sizeof($Out)-1]);
		}
		$Err=explode("\r\n",$Err);
		if(empty($Err[count($Err)-1])){
			unset($Err[sizeof($Err)-1]);
		}
		$output=array('output'=>$Out,'error'=>$Err);
		return $output;
	}
}
?>

Cette solution repose tout bêtement sur la capacité de PHP a instancier des objet COM. Nous allons donc pouvoir utiliser l’objet COM qui manipule le shell pour exécuter la commande que l’on veut et récupérer les sorties standards.

Pour l’utiliser c’est relativement simple :

<?php
$retour=Exec::run($macommande);
$masortie=$retour['output'];
$meserreurs=$retour['error'];
?>

Alors si quelqu’un a trouvé comment faire le exec « natif » sous IIS 7/7.5, je suis intéressé car malgré mes recherches sur google je n’ai pas trouvé grand chose de concluant … Donc n’hésitez pas à laisser un petit commentaire pour éclairer le newbie que je suis ^^.


1 Commentaire pour cet article

Laisser un commentaire

A la recherche de quelque chose ?

Utiliser ce champs pour faire votre recherche :

Vous n'avez pas trouvé votre bonheur ? N'hésitez pas à contacter l'auteur de ce blog ou alors laissez un commentaire sur un post !

Les liens !

Quelques liens intéressants...

Les archives

Tout, classé par ordre chronologique ...