错误信息为:
Win32ExceptionSystem.ComponentModel.Win32Exception (0x80004005): 拒绝访问。
at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start()
本地,和测试服务器都正常,本地系统为win8,测试服务器为windows server 2008 r2 sp1。服务器为:Windows Server 2008 r2 Enterprise。
实现功能:通过pdf2swf软件将pdf转换为swf格式文件。
代码为:通过日志确定代码在pc.Start()处报的错。
public static String Document2SWFBySwftools(String pdfPath, String swfPath) { String result = String.Empty; String ToolPath = System.Configuration.ConfigurationManager.AppSettings["SwfInstallDir"]; try { Process pc = new Process(); ProcessStartInfo psi = new ProcessStartInfo(ToolPath, String.Format(@"""{0}"" -o ""{1}"" -s flashversion=9 -G", pdfPath, swfPath)); //ProcessStartInfo psi = new ProcessStartInfo(ToolPath, String.Format(@" {0} -o {1} -s flashversion=9 languagedir=C:\xpdf\chinese-simplified", pdfPath, swfPath)); //ProcessStartInfo psi = new ProcessStartInfo(ToolPath, String.Format(@" -o {1} -t {0} -s languagedir=C:\xpdf\chinese-simplified", pdfPath, swfPath)); psi.UseShellExecute = false; psi.RedirectStandardOutput = true; pc.StartInfo = psi; pc.Start(); using (StreamReader sr = pc.StandardOutput) { result = sr.ReadToEnd(); } pc.WaitForExit(); } catch (Exception e) { throw e; } return result; }
网上试了很多种都没效果,文件夹权限都是everyone。
实在找不到解决方案了,求大神们指点,急在线等,谢谢了。
还有csdn上面说:
Process.Start 方法平台为:
Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)
最后这句:Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)是只支持Windows Server 2008 R2 sp1以及以上版本还是怎么什么,没理解。服务器是Windows Server 2008 r2 Enterprise不支持吗?
但是我做了测试:
测试代码:
static void Main(string[] args) { try { //Process.Start("explorer.exe", "C:\\Program Files (x86)\\SWFTools\\gpdf2swf.exe"); System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.FileName = "iexplore.exe"; //IE浏览器,可以更换 process.StartInfo.Arguments = "http://www.baidu.com"; process.Start(); } catch (Exception ex) { Console.WriteLine("系统错误:" + ex.Message); } Console.ReadKey(); }
这段代码能正常执行,并能打开IE,打开百度。
你把 Document2SWFBySwftools 放到 Console 程序中去服务器测试i下。
非常感谢,刚测试过,是可以的,相同的代码在控制台程序和winForm中都能正常使用,就是在web中不能正常使用。
@刘满意: 你这个方法 Document2SWFBySwftools 的代码不要变,只是把 new ProcessStartInfo 中的 exe 指定为 notepad.exe ,然后在 web 中测试下。
@Launcher: 换成notepad.exe不行。
@刘满意: 是不是跟你启动 pdf2swf 进程报的相同的错误:Win32ExceptionSystem.ComponentModel.Win32Exception (0x80004005): 拒绝访问?
@Launcher: 对的。
@刘满意: 我告诉你个比较靠谱的做法,把这个转换放在一个独立的进程中去做(比如 Console,Winform,WPF,Windows Service,COM),这个独立的进程可以通过进程间通信方式同你的 Web 应用程序交互。
此做法有以下几点好处:
1、职责分离,如果以后修改了转换的方法, Web 应用程序不需要修改和重新部署;
2、安全,不用为 Web 应用程序设置高的权限,也不用使用模拟身份,保证 Web 应用程序在它允许的权限内运行。
3、容错,不会因为转换程序的崩溃或错误导致 Web 应用程序不可用。
PS:我再告诉你个测试方法,找到你的 Web 应用程序使用的应用程序池,然后将应用程序池标识修改为可以登录此机器的管理员组中的一个帐户,填写正确的用户名和密码。然后测试能否启动 notepad.exe。
@Launcher: 非常感谢您给的建议。下面那个测试方法我也试过了,也不行。有点理解不了了。唉!
@刘满意: <identity impersonate="true" userName="MySpecifiedUser" password="MyPassword" /> 这个试过了吗?
@Launcher: 恩,试过了。
@刘满意: 很好,这样你就会放弃提升 web 应用程序的权限,我就不用为安全担心了。
@Launcher: 哈哈
修改IIS的设置,将应用程序池的标识修改为LocalSystem试试~
试过了,不行,谢谢回答。
@刘满意: 如二楼,把Document2SWFBySwftools放到正式服务器上用命令行调用一下吧。
是不是你的那个文件没有被释放掉,就是说在某个地方用着,没有关闭
应该不会,我用控制台程序调用是可以正常使用的。
最后改成了,用wcf执行pdf转swf的功能,在asp.net中调用wcf解决。@Launcher哥的提示。