我有一个带有几种方法的网络服务,这些方法试图在系统上运行或发送消息另一个 .EXE 以执行特定任务。
我们可以使用某些参数启动 .EXE 进程,或者向其发送 WndProc 消息以使其执行所需的操作。这在我的系统上本地运行良好,使用 cmd 中的参数调用 exe 或在 Visual Studio 中调试时从 web 服务发送 WndProc 消息。
然而,这些都不适用于真实环境。我让带有参数方法(DoSomething)的运行.Exe将异常写入文件:
System.ComponentModel.Win32Exception (0x80004005): No Access
at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start()
at Someprogram.ProgramService.DoSomething(String text)
wndproc sendmessage 的另一种方法我也包含在 try/catch 中,但没有抛出异常。它实际上定位了该过程,尽管我让它打印了一个文件:
public static void SendMessageToSomeProgram(string message) {
Process[] processes = Process.GetProcessesByName("SomeProgram");
if (processes.Length >= 1) {
//iterate through all running target applications
foreach (Process p in processes) {
//test write if process found
TextWriter tw = new StreamWriter(@"c:\wndprocfile.txt"); //this file is printed
tw.WriteLine(DateTime.Now.ToString());
tw.Close();
//do stuff
try {
byte[] sarr = System.Text.Encoding.Default.GetBytes(message);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)100;
cds.lpData = message;
cds.cbData = len + 1;
SendMessage(p.MainWindowHandle, WM_COPYDATA, 0, ref cds);
} catch (Exception ex) {
TextWriter tw2 = new StreamWriter(@"c:\wndProc_errorfile.txt"); //not printed
tw2.WriteLine(DateTime.Now.ToString() + "Exception: " + ex.ToString());
tw2.Close();
}
}
}
现在我明白了为什么拥有这样的安全性很好,但是有没有简单的方法解决这个问题?也许只是 IIS 中的一些设置?
更新信息:服务器正在运行 IIS 5.1,因此没有应用程序池功能。