11
votes

FOO.CMD ne produira pas de lignes en cours (sur le site Web)

J'ai un problème de comprendre les intestins et la sortie de la classe Processstartinfo dans .NET. J'utilise cette classe pour exécuter des programmes .exe tels que FFMPEG sans problème.

Mais quand j'utilise processstartinfo pour lancer un programme .cmd comme un simple Foo.cmd contenant uniquement @echo Hello World code> ne produit rien. P>

    ProcessStartInfo oInfo = new ProcessStartInfo("cmd", "/c start foo.cmd")
    {
        UseShellExecute = false,
        RedirectStandardError = true,
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        WorkingDirectory = @"C:\Program Files (x86)\itms"
    };


0 commentaires

4 Réponses :


1
votes

Ceci est un code légèrement modifié mais cela devrait vous donner une meilleure idée de la classe xxx

Ceci redirigera la sortie de la fenêtre CMD sur la console, il suffit d'ajuster si nécessaire.


4 commentaires

Merci Bali C, mais malheureusement, aucune sortie n'est retournée.


Ok, je l'ai exécuté sur mon PC et cela a fonctionné bien, il peut s'agir d'espaces dans le chemin du fichier le causant, essayez de joindre le chemin avec \ " comme " / c \ " C: \ Fichiers du programme (x86) \ itms \ foo.cmd \ "";


Eh bien, cela fonctionne pour moi localement, mais pas lorsque j'exécute le code sur notre site Web. La question pourrait-elle être liée aux autorisations? Les sites Web sont-ils en quelque sorte limités à l'exécution des commandes via cmd.exe et refuser à toutes les sorties? Cela semble plutôt étrange cependant


Pour être honnête, je ne suis pas sûr, cela semble étrange bien que votre droite. Je ne fais pas grand chose avec des sites Web, je ne peux malheureusement pas vous aider là-bas :(



1
votes

Vous devrez l'utiliser de cette façon

   using (Process p = Process.Start(oInfo))
    {
.....


3 commentaires

Merci pour la clarification, Hatsoft.


@ Marle1 a fait ma réponse vous a aidé et avez-vous résolu votre problème


J'ai peur pas hatsoft. J'ai modifié ma question pour mieux refléter mon problème, ce qui est peut-être lié aux restrictions des utilisateurs de quelque sorte.



18
votes

J'ai trouvé la réponse moi-même et posterai une solution pour toute personne intéressée.

La source du problème est assez difficile à déboguer, car le problème provient de la manière dont l'IIS gère les utilisateurs et les processus.

Comme je la pensais, il n'y avait rien de mal avec le code lui-même.

réponse

Dans IIS, un site Web est en cours d'exécution dans un AppPool. Un AppPool est attribué à une identité d'utilisateur. L'identité par défaut est un compte intégré virtuel nommé ApplicationPooLidentity . Cet utilisateur n'a pas le privilège d'appeler (autant que je sache) des scripts externes par lots / commandes externes.

Fournir un nom d'utilisateur, un mot de passe et un domaine pour un utilisateur administratif lors du démarrage d'un nouveau processus, ne rien résoudre pour moi - c'était peut-être que je ne comprends que mal comprendre tout le concept.

Utiliser dans le Webconfig n'a rien résolu non plus. Ceci est apparemment parce que l'utilisateur AppPool attribué est toujours l'auteur de tous les processus.

Qu'est-ce qui m'a vraiment dérangé, était-ce que je pouvais exécuter des fichiers .exe, mais pas des fichiers .cmd ou .bat.

La solution pour moi était de créer un nouvel utilisateur avec des privilèges pour exécuter des scripts par lots et de sélectionner cet utilisateur en tant qu'utilisateur AppPool dans IIS.

EDIT: Comme je l'ai mentionné dans les commentaires, l'utilisateur avec lequel je travaille est créé sur un serveur Active Directory car ce serveur de fichiers particulier est sur une part de réseau. L'utilisateur fait partie du groupe de serveurs local IIS_IUSRS sur mon serveur Web et a lire / écrire / exécuter privilèges dans le dossier où les programmes exécutables sont stockés.

EDIT2: La solution fonctionne pour les comptes d'utilisateurs locaux ainsi que longtemps que l'utilisateur fait partie du groupe de serveurs local IIS_IUSRS et a lire / écrire / exécuter privilèges le dossier où les programmes exécutables sont stockés.


7 commentaires

Je sais que c'est un post ancien Veeeerrrryyy, mais je veux juste savoir quel type de "nouvel utilisateur" parlez-vous? Nouvel utilisateur Windows?


Oui ou utilisateur réseau. Nous avons créé un utilisateur dans notre annonce et avons utilisé cela comme identité dans l'Apppool.


Je vois. J'ai créé un utilisateur administrateur et toujours non Go .. Je ne peux même pas extraire un fichier EXE ni aucun fichier ..


Veuillez poster où et comment créer l'utilisateur avec un tel privilège


@ Marle1, je suis également confronté à un problème similaire. Après avoir hébergé une application sur IIS, l'application n'est pas en mesure d'exécuter des commandes sur CMD. Avez-vous trouvé une solution de contournement?


@Sagar, j'ai décrire la solution qui a fonctionné pour moi au mieux de mes capacités, mais si cela ne fonctionne pas pour vous, s'il vous plaît laissez-moi savoir quoi ce qui précède que vous avez essayé et quel problème vous faites face.


Changer l'identité Le pool d'applications fonctionne sous malgré moi. Mon patron a déclaré qu'une meilleure option (au lieu d'appeler le processus.Start) serait de mettre la fonctionnalité dont vous avez besoin dans un service Windows et d'appeler cela - apparemment IIS n'est pas vraiment conçu pour se connecter au processus.



0
votes

Qu'est-ce qui a fonctionné pour moi (au lieu de créer un nouvel utilisateur pour le pool d'applications) basculait sur Compte intégré "Système local" (sur IIS 8.5 sur Windows Server 2012 R2).


0 commentaires