System.Diagnostics.Process.Start不能从IIS工作
当我从我的控制台应用程序运行System.Diagnostics.Process.Start
,它的工作原理,但是当我从IIS中托pipe我的Web服务运行相同的代码不起作用。
是否与ASP.Net权限有关? 如果是的话我怎样才能从我的C#代码进行configuration。
ASP.NET Web页面和服务器控件代码在Web服务器上的ASP.NET工作进程的上下文中执行。 如果在ASP.NET网页或服务器控件中使用“启动”方法,则新进程将在具有受限权限的Web服务器上执行。 该进程不会在与客户端浏览器相同的上下文中启动,并且无法访问用户桌面。 http://msdn.microsoft.com/en-us/library/0w4h05yb.aspx
– 为ASP.NET工作进程帐户授予权限
与桌面交互或允许ASP.NET工作进程在SYSTEM帐户中运行。
- 要知道如何允许工作进程在SYSTEM帐户中运行,并知道ASPNET帐户的默认权限,请查看本文信息:ASP.NET中的进程和请求标识: http : //support.microsoft.com/default.aspx? ln=zh-cn SCID = KB; EN-US; 317012
– 启用IISpipe理服务与桌面交互
要configuration此,请按照此步骤。
-
一个。 打开控制面板并按照下列步骤操作:对于Windows NT:单击服务。 对于Windows 2000,Windows XP和.NET Server:单击pipe理工具,然后单击服务。
-
湾 双击IISpipe理服务。
- C。 在“login”选项卡上,选中“允许服务与桌面进行交互”checkbox。 请记住以本地系统身份运行IIS Admin Service。
- d。 停止并重新启动IISpipe理服务。
我有一个类似的问题,从服务访问桌面的能力不是问题。 当不模仿其他用户时,它工作得很好,但是当试图以不同的用户身份运行进程失败时。 要做的第一件事情就是不要开始,找出所有关于这个问题的信息。 第一个问题是Process.Start是否返回true或false。 其次,在试图开始这个过程时,你是否遇到过任何exception情况?
在完全调查之前,需要知道Process.Start是否使用UseShellExecute运行 – 这对于模拟是必须的,否则可以select是否使用它,并根据此设置调用不同的Win32函数。
如果你正在做一个需要以另一个用户身份运行的进程,那么不要试图使用.NET模拟 – StartInfo的用户名,密码,域是你需要设置的。 然而,在IIS下你有一些额外的locking,而我在Windows Server 2008上find的唯一解决scheme实际上涉及到一些Win32调用和抽象安全库的实现。 您可以运行的许多场景在这里列出: http : //asprosys.blogspot.co.uk/2009/03/perils-and-pitfalls-of-launching.html
来自该页面的示例代码显示如何调用该库,并以该用户的身份启动进程之前向用户添加Windows Station和Desktop访问权限。 这就是我需要从IIS获得Process.Start才能工作的原因,排除了UAC,DEP和其他任何我能想到的三字母缩写;)
如果你是应用程序正在运行的Windows 7,那么你不能。 基本上服务运行会话0和用户桌面运行会话1,所以你不能从会话0通信到会话1.即使你尝试从winlogin进程(这是用来启动每个新用户的用户会话)通信,你可以不会得到一些本地信息(浏览器设置,如本地存储信息)
对我来说,工作是这样的:
ProcessStartInfo psi = new ProcessStartInfo(); psi.UseShellExecute = true; psi.LoadUserProfile = true; psi.WorkingDirectory = sender.Server.MapPath("../");// This line solved my problem psi.FileName = sender.Server.MapPath("../myexecutable.exe"); psi.Arguments = "Myargument1 Myargument2"; Process.Start(psi);
`