当我从我的控制台应用程序运行System.Diagnostics.Process.Start
时它可以工作,但当我从IIS中托管的我的Web服务运行时,相同的代码不起作用。
是否与ASP.Net权限有关?如果是,我如何从我的C#代码配置它。
答案 0 :(得分:16)
ASP.NET Web页面和服务器控制代码在Web服务器上的ASP.NET辅助进程的上下文中执行。如果在ASP.NET网页或服务器控件中使用Start方法,则新进程将在具有受限权限的Web服务器上执行。该过程不会在与客户端浏览器相同的上下文中启动,也无法访问用户桌面。 http://msdn.microsoft.com/en-us/library/0w4h05yb.aspx
与桌面交互或允许ASP.NET辅助进程在SYSTEM帐户中运行。
要进行配置,请按照以下步骤操作。
一个。打开控制面板并按照以下步骤操作: 对于Windows NT:单击“服务”。 对于Windows 2000,Windows XP和.NET Server:单击“管理工具”,然后单击“服务”。
湾双击IIS Admin Service。
答案 1 :(得分:3)
答案 2 :(得分:2)
我遇到了类似的问题,从服务访问桌面的能力不是问题。它在没有模仿其他用户时工作正常,但是当尝试以不同的用户身份运行该过程时,它失败了。 当它无法启动时要做的第一件事就是找出有关该问题的所有信息。第一个问题是Process.Start是返回true还是false。其次,在尝试启动该过程时,您是否遇到任何异常。
在你完全调查之前,知道是否使用UseShellExecute运行Process.Start是相关的 - 对于模拟,这必须是假的,否则你可以选择是否使用它并根据此设置调用不同的Win32函数
如果您正在执行需要以其他用户身份运行的进程,请不要尝试使用.NET模拟 - 您需要设置StartInfo用户名,密码,域。但是,在IIS下你有一些额外的锁定,我在Windows Server 2008上找到的唯一解决方案实际上涉及一些Win32调用和抽象安全库的实现。您可以遇到的许多方案都在此处列出:http://asprosys.blogspot.co.uk/2009/03/perils-and-pitfalls-of-launching.html
该页面中的示例代码显示了在以该用户身份启动进程之前如何调用库并向用户添加Windows Station和Desktop访问权限。这就是我需要让Process.Start从IIS工作,排除了UAC,DEP和我能想到的任何其他三个字母的缩写;)
答案 3 :(得分:0)
如果你的应用程序正在运行Windows 7那么你就不能。基本上服务运行会话0和用户桌面运行会话1,因此您无法从会话0到会话1进行通信。即使您尝试从win登录进程(用于为每个新用户启动用户会话)进行通信,您也可以得到一些本地信息(浏览器设置,如本地存储信息)
答案 4 :(得分:0)
对我而言,工作是这样的:
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);
`
答案 5 :(得分:0)
我有类似的问题,这使我花费大量时间来寻找解决方案。但是我尝试过的每个解决方案仍然无法正常工作。
我试图在本地PC上运行我的API。它运行良好。.pdf可以启动。但是在Windows Server 2019上部署到IIS(版本10)中时,它始终会引发错误消息“系统找不到指定的文件”
我希望你能给我一些线索。
我需要放下一些* .pdf文件。
“ System.Diagnostics.Process.Start”。我在REST API的GET方法中运行此脚本。这是我完整的代码
`public class SomeController : ApiController
{
public string Get(int id)
{
try
{
using (SomeEntities se = new SomeEntities ())
{
List<M_DocumentControlPathFile> lstDat = (from dc in se .M_DocumentControlPathFile
where dc.SharepointListItemID == id
&& dc.ValidTo == null
orderby dc.ID descending
select dc).ToList();
System.Diagnostics.Process.Start(@lstDat[0].StringPath);-
return @lstDat[0].StringPath;
//StringPath is path location + file name of pdf like ("C:\someFoler\a.pdf")
}
}
catch (Exception ex)
{
return ex.message;
}
return "test";
}
}`