为什么执行外部程序会失败?

nethawkc 2006-11-07 03:05:50
我在ASP.Net去执行外部程序, 在两部机器上执行同样的程序却出现了不同的情况.

A 和 B 两部主机都是Win2K+.Net Framework 1.1

在ASP.NET的程序上去呼叫一个外部的程序(.Net写的WinForm), 在Web.Config中都加入了

<identity
impersonate="true"
userName="具有Administrator的权限帐号"
password="密码"/>

在 A 的机器很正确的执行完外部的程序,
但是在 B 的机器执行到Application.Run()就停了, 变成一直挂在内存当中, 就像是没有仿真Administrator的情形一样.

然而在web程序中我还有一行程序用来判断外部程序是否正在执行
if (System.Diagnostics.Process.GetProcessesByName("import_stopcall").Length > 0) {
showMsg.Text = "程序正被执行中, 请稍后再执行. ";
showMsg.ForeColor = System.Drawing.Color.Red;
return;
} else {
//执行外部程序
BeginImport();
}
System.Diagnostics.Process.GetProcessesByName("import_stopcall").Length 这一行若没有仿真Administrator来执行是会出错, 但在 B 机器这一行的执行确没有问题, 也就是说看来在web.config的设定仿真Administrator执行是对的, 可是为什么执行外部的程序却出了问题呢? 请问有谁知道这是什么情况?

PS.我曾试着在B机器web.config中改成使用administrator这个帐号, 也一样是失败.
...全文
169 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nethawkc 2006-11-08
  • 打赏
  • 举报
回复
IIS安全性设置我也想过, 但两台的设置是一样的.
lengfo 2006-11-07
  • 打赏
  • 举报
回复
设置一下IIS 的 目录安全性 选项
我猜的,你试试吧!
nethawkc 2006-11-07
  • 打赏
  • 举报
回复
剛剛又做了一次測試
在B的機器上將web.config中的< identity>節段拿掉後, 也順便將web 程式上檢查外部程式是否正在執行的檢查拿掉
// if (System.Diagnostics.Process.GetProcessesByName("import_stopcall").Length > 0)
web上就只留下啟動外部程式的區段
try {
Process.Start(“外部程式.exe”, args);
} catch (ApplicationException er) {
showMsg.Text = "執行程式失敗。" + er.Message;
showMsg.ForeColor = System.Drawing.Color.Red;
}
沒想到這樣子在 B 的機器上竟然可以正確的執行外部程式了, 然而去掉了<identity>這樣子就沒辦法在web上去檢查程式是否被執行了.
更奇怪的是, 在 A 的機器上完全沒有這些問題, A的機器上有設定<identity>的節段, 啟動執行外部程式也很正常.
scow 2006-11-07
  • 打赏
  • 举报
回复
不是模仿的问题,那就只能是环境差异, b装了什么防火墙吗
nethawkc 2006-11-07
  • 打赏
  • 举报
回复
去掉<identity>节段在Web程序执行就不行了
因为在Web程序上
System.Diagnostics.Process.GetProcessesByName("外部程序名称").Length
还是需要以仿真Administrator的身份去执行的.

而且去掉<identity>节段, 在激活外部程序也一样会出问题.
scow 2006-11-07
  • 打赏
  • 举报
回复
如果把identity 配置节去掉(不设模仿), A还能正常运行吗
nethawkc 2006-11-07
  • 打赏
  • 举报
回复
好象有朋友不是很清楚我前面描述的问题, 所以我重新描述一次.

有两部机器 A 和 B 环境一样是Win2k Server+.Net Framework 1.1
目的是由Asp.Net的程序去激活一支外部的程序(这个外部的程序也是自己撰写的WinForm程序).
所撰写的外部程序可以直接手动执行, 在A和B的机器上都试过, 没有问题.

A 的机器由Web程序去呼叫外部的程序可以很正常的执行, 并且程序在执行后顺利的自动结束.
但是 B 的机器就出了问题了, 由工作管理员的处理程序中可以看到外部程序被执行了, 但事实上程序是被hold住了.

Web 程序
========================================================================
if (System.Diagnostics.Process.GetProcessesByName("外部程序名称").Length > 0) {
showMsg.Text = "程序正被执行中, 请稍后再执行. ";
showMsg.ForeColor = System.Drawing.Color.Red;
return;
} else {
//执行汇档
try {
Process.Start("外部的WinForm程序", args); //激活程序
} catch (ApplicationException er) {
showMsg.Text = "执行外部程序失败. " + er.Message;
showMsg.ForeColor = System.Drawing.Color.Red;
}
}

=============================================================================
WinForm程序
=============================================================================
/// <summary>
/// 应用程序的主进入点.
/// </summary>
[STAThread]
static void Main(string[] args){
FileInfo fi=null;
StreamWriter sw=null;

try{
fi=new FileInfo(@"D:\TEMP\Debug.log");
sw=fi.AppendText();
sw.WriteLine("[Debug]在Main的地方");
sw.Flush();
sw.Close();
Application.Run(new Form1());
}
程序追踪到此, Form1()中就没有再增加任何的记录, 也就是程序由Web激活之后到执行Application.Run就不再动了, 程序挂在内存中看起来像是在执行但实际上是没有任何动作.

这种情形佷像是Web程序没有仿真Administrator的方式在执行, 也就是执行权限不足的样子.
然而我已在web.config中加入了 <identity>的节段
<identity
impersonate="true"
userName="具有Administrator的权限帐号"
password="密码"/>
并且在上述Web程序中System.Diagnostics.Process.GetProcessesByName("外部程序名称").Length 这一行如果没有以仿真Administrator的方式执行上会出错, 会出现"存取错误", 也就是权限不足. 不过在 B 的机器上Web 执行这行程序是正常的, 因此理论说来, 我设定的<identity>节段是有效的.

除了web.config中的<identity>节段中设定了具有Administrator权限帐号的user, 对于ASPNET这个帐号也给了Administrator的权限, 我现在一直百思不解, 两部机器设定相同, 一台可以正常执行, 一台不行, 到底出了什么问题呢?
nethawkc 2006-11-07
  • 打赏
  • 举报
回复
Zyip你可能误解了我的意思, Application.Run() 是外部程序WinForm的, 我是用C#撰写的,Application.Run()是C# WinForm在Main程序中的.

我在Web的激活外部程序,我使用过.Net 的Process.start,也用过呼叫Win32 API的方式来激活外部程序, 基本上在A的机器用那一种方式呼叫外部程序都可以, 在 B 的机器就不行, 出现的情况就像是没有仿真Administrator的感觉.
zyip 2006-11-07
  • 打赏
  • 举报
回复
不要用Application.Run,试下下面的方案
一:
1.在项目属性中添加Microsoft.VisualBasic的引用
2.
Microsoft.VisualBasic.Interaction.Shell("ping 172.16.0.1",AppWinStyle.MaximizedFocus,true,0);
二:
System.Diagnostics.Process.Start("app");

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧