首页 新闻 会员 周边 捐助

ASP.NET 使用一个process启动一个cmd.exe 执行command,vs 调试模式下运行成功,但发布到IIS7上就启动不了cmd

0
悬赏园豆:50 [已解决问题] 解决于 2012-11-07 19:04

我为了实现一个HPC批处理,ASP.NET 使用一个process启动一个cmd.exe 执行command,vs 调试运行成功,但发布到IIS7上就启动不了cmd.exe。

显示的状况是,我等待的时间很长时间,调用cmd.exe 的process一直没有执行command,而且也没有抛出异常;

我把process.StartInfo.CreateNoWindows设为了false。正常情况下是应该弹出一个黑屏,但IIS下这个黑屏也没有弹出。在vs中调试是可以弹出来的。

 

请问这个哪位遇到过这样的情况,请帮助。感激不尽

cctext的主页 cctext | 初学一级 | 园豆:156
提问于:2012-11-07 16:40
< >
分享
最佳答案
0

没权限吧

收获园豆:20
向往-SONG | 老鸟四级 |园豆:4853 | 2012-11-07 16:44

1.但我试着去修改 了cmd.exe权限 甚至给了它 everyone,同时把它给考配到了~/bin/cmd。exe

2.直接通过路径调用 process.FileName=HttpContext.Current.Server.MapPath("~/bin/cmd.exe") 也不可以;

3.修改了machine.config <processModel userName="my comp login account" password="my comp login password" enable="true"/> 也不可以。

我使用的是 IIS7

cctext | 园豆:156 (初学一级) | 2012-11-07 17:00

@cctext: 

试试:

[DllImport("shell32.dll ")]
        public static extern int ShellExecute(IntPtr hwnd, StringBuilder lpszOp, StringBuilder lpszFile, StringBuilder lpszParams, StringBuilder lpszDir, int FsShowCmd);

调用:

ShellExecute(IntPtr.Zero, new StringBuilder("Open"), new StringBuilder("要执行程序的名称"), new StringBuilder("参数"), new StringBuilder("要执行程序的目录"), 1);

并设置权限。

向往-SONG | 园豆:4853 (老鸟四级) | 2012-11-07 17:15

@向往-SONG: 这种call api (c++ dll)在iis上是正常运行的,

但你这里的ShellExecute() 或这个接口的用法还是值得借鉴的,我之前也是这个封成一个.exe(调用cmd.exe执行批处理),使用process去调用这个。exe,也没有成功,也可能是我当时程序调式过程中出现的有问题。

 

看看有人能帮忙把这个iis问题解决不,如果是在没有办法,我就试试这个。

cctext | 园豆:156 (初学一级) | 2012-11-07 17:20

@cctext: 我之前也是 去调c++ dll的接口时,直接使用 调这个extern 修饰的方法,不能直接执行,需要一个c# console Env封装一个。exe,之后再在代码使用process去调这个C#。exe,很费解。

类似的问题,你遇到过没有?还好我通过process调用。exe是成功的。

cctext | 园豆:156 (初学一级) | 2012-11-07 17:26

@cctext: 

我现在项目里就是刚那样用的,直接调用不用封装什么的没问题。

不过我是去执行一个winform的程序。

向往-SONG | 园豆:4853 (老鸟四级) | 2012-11-07 17:30

@向往-SONG: winform 和webform是执行还不一样。

cctext | 园豆:156 (初学一级) | 2012-11-07 17:44

@cctext: 

是web的,我是说要调用执行的程序是个winform程序。

向往-SONG | 园豆:4853 (老鸟四级) | 2012-11-07 17:48

@向往-SONG: en  webform也可以 调用extern修饰的 接口方法的。

cctext | 园豆:156 (初学一级) | 2012-11-07 17:52
其他回答(5)
0

和我遇到的问题类似啊,我前几天刚发布的解决方案

http://www.cnblogs.com/tianlin/archive/2012/10/26/2741813.html

收获园豆:15
田林九村 | 园豆:2367 (老鸟四级) | 2012-11-07 16:48

首先你要弄明白,我在vs中调试是可以正常运行的,成功执行 HPC 批处理(通过asp.net process 成功调用了CMD.EXE并成功执行了调用批处理命令)

我之后把它发布在IIS上后不可以执行的,这个不是我的process.StartInfo.WorkDirectory 指定的路径不对的问题。

支持(0) 反对(0) cctext | 园豆:156 (初学一级) | 2012-11-07 17:04

@cctext: 嗯,受教了

支持(0) 反对(0) 田林九村 | 园豆:2367 (老鸟四级) | 2012-11-07 17:25

@cctext: 我发布IIS后没有遇到你说的问题。

可借助别的方法检查,比如记日志,将你怀疑出问题的地方都用日志记下来,当然不一定能发现问题,不过可以试试

支持(0) 反对(0) 田林九村 | 园豆:2367 (老鸟四级) | 2012-11-07 17:32

@向往-SONG: 这个时候 他不抛出错误,只是一直卡机,如果会过一段时间 process 会自动回收掉了。

支持(0) 反对(0) cctext | 园豆:156 (初学一级) | 2012-11-07 17:45
0

这种方式的运行真的太扯淡了啊,能换一个思路吗?为何老是要web程序去运行exe文件什么的

收获园豆:15
chenping2008 | 园豆:9836 (大侠五级) | 2012-11-07 17:05

cmd.exe 去执行的是一个.PS1(hpc 批处理命令),是需要的动态的参数地,执行一个 HPC 批处理,你可以通过C#代码实现吗?

支持(0) 反对(0) cctext | 园豆:156 (初学一级) | 2012-11-07 17:07

@cctext: 这种运行cmd.exe的方式是在什么样子的情况下触发的?

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-11-07 17:11

@chenping2008: 

Process process=new Process();

process.FileName=HttpContext.Current.Server.MapPath("~/bin/cmd.exe");

process.StartInfo......

....

if(process.Start())

{

    // doo

}

else

{

  throw new Exception("Error:start process call cmd.exe failed!");

}

支持(0) 反对(0) cctext | 园豆:156 (初学一级) | 2012-11-07 17:14
0

这个问题 最终还是从IIS的权限上我找到了问题的解决办法,

默认IIS Pool中的 模式是Network Service内置账户权限,这个权限不够大。

1.提升Network Service内置账户的权限;

2.修改运行账户模式,设为一个本地内置域账户。

cctext | 园豆:156 (初学一级) | 2012-11-07 19:01

这里应该怎么设置。。求助。

支持(0) 反对(0) Rookier | 园豆:652 (小虾三级) | 2013-11-21 22:07
0

http://q.cnblogs.com/q/57207/ 同一个问题么

Rookier | 园豆:652 (小虾三级) | 2013-11-21 22:07
0

我也遇到了类似的问题,最后解决方案是:将IIS里面你程序用到的程序池的高级设置中“启用32位应用程序”置为true,“加载用户配置文件”置为true。

进击の程序猿 | 园豆:206 (菜鸟二级) | 2017-11-16 17:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册