我为了实现一个HPC批处理,ASP.NET 使用一个process启动一个cmd.exe 执行command,vs 调试运行成功,但发布到IIS7上就启动不了cmd.exe。
显示的状况是,我等待的时间很长时间,调用cmd.exe 的process一直没有执行command,而且也没有抛出异常;
我把process.StartInfo.CreateNoWindows设为了false。正常情况下是应该弹出一个黑屏,但IIS下这个黑屏也没有弹出。在vs中调试是可以弹出来的。
请问这个哪位遇到过这样的情况,请帮助。感激不尽
没权限吧
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:
试试:
[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: 这种call api (c++ dll)在iis上是正常运行的,
但你这里的ShellExecute() 或这个接口的用法还是值得借鉴的,我之前也是这个封成一个.exe(调用cmd.exe执行批处理),使用process去调用这个。exe,也没有成功,也可能是我当时程序调式过程中出现的有问题。
看看有人能帮忙把这个iis问题解决不,如果是在没有办法,我就试试这个。
@cctext: 我之前也是 去调c++ dll的接口时,直接使用 调这个extern 修饰的方法,不能直接执行,需要一个c# console Env封装一个。exe,之后再在代码使用process去调这个C#。exe,很费解。
类似的问题,你遇到过没有?还好我通过process调用。exe是成功的。
@cctext:
我现在项目里就是刚那样用的,直接调用不用封装什么的没问题。
不过我是去执行一个winform的程序。
@向往-SONG: winform 和webform是执行还不一样。
@cctext:
是web的,我是说要调用执行的程序是个winform程序。
@向往-SONG: en webform也可以 调用extern修饰的 接口方法的。
和我遇到的问题类似啊,我前几天刚发布的解决方案
http://www.cnblogs.com/tianlin/archive/2012/10/26/2741813.html
首先你要弄明白,我在vs中调试是可以正常运行的,成功执行 HPC 批处理(通过asp.net process 成功调用了CMD.EXE并成功执行了调用批处理命令)
我之后把它发布在IIS上后不可以执行的,这个不是我的process.StartInfo.WorkDirectory 指定的路径不对的问题。
@cctext: 嗯,受教了
@cctext: 我发布IIS后没有遇到你说的问题。
可借助别的方法检查,比如记日志,将你怀疑出问题的地方都用日志记下来,当然不一定能发现问题,不过可以试试
@向往-SONG: 这个时候 他不抛出错误,只是一直卡机,如果会过一段时间 process 会自动回收掉了。
这种方式的运行真的太扯淡了啊,能换一个思路吗?为何老是要web程序去运行exe文件什么的
cmd.exe 去执行的是一个.PS1(hpc 批处理命令),是需要的动态的参数地,执行一个 HPC 批处理,你可以通过C#代码实现吗?
@cctext: 这种运行cmd.exe的方式是在什么样子的情况下触发的?
@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!");
}
这个问题 最终还是从IIS的权限上我找到了问题的解决办法,
默认IIS Pool中的 模式是Network Service内置账户权限,这个权限不够大。
1.提升Network Service内置账户的权限;
2.修改运行账户模式,设为一个本地内置域账户。
这里应该怎么设置。。求助。
我也遇到了类似的问题,最后解决方案是:将IIS里面你程序用到的程序池的高级设置中“启用32位应用程序”置为true,“加载用户配置文件”置为true。