通过asp.net应用程序启用process.start需要哪些权限?

通过asp.net应用程序启用process.start需要哪些权限?,asp.net,permissions,process.start,Asp.net,Permissions,Process.start,我有一个asp.net应用程序,它使用process.start调用可执行文件(Graphviz)。所有这些在我的开发环境中都能很好地工作,但是当我转到生产环境时,我无法让流程运行。以下是详细情况 我创建了这个简单的sub来显示问题 Protected Sub-Page\u Load(发送方作为对象,e作为事件参数)处理我。Load 将ProcessInfo设置为ProcessStartInfo ProcessInfo=新的ProcessStartInfo 'ProcessInfo.Domain

我有一个asp.net应用程序,它使用process.start调用可执行文件(Graphviz)。所有这些在我的开发环境中都能很好地工作,但是当我转到生产环境时,我无法让流程运行。以下是详细情况

我创建了这个简单的sub来显示问题

Protected Sub-Page\u Load(发送方作为对象,e作为事件参数)处理我。Load
将ProcessInfo设置为ProcessStartInfo
ProcessInfo=新的ProcessStartInfo
'ProcessInfo.Domain=“xxxxxxx”
ProcessInfo.UserName=“xxxxxx”
尺寸PwdString为String=“xxxxxxx”
将newPass设置为System.Security.SecureString
newPass=New System.Security.SecureString
对于PwdString中的每个c作为字符
newPass.AppendChar(c)
下一个c
ProcessInfo.Password=newPass
'ProcessInfo.FileName=“”C:\Windows\System32\Notepad.exe”“”
'ProcessInfo.FileName=“”C:\Test.bat”“”
ProcessInfo.FileName=“”C:\Program Files(x86)\Graphviz2.30\bin\dot.exe”“”
ProcessInfo.Arguments=“-Kdot-Tsvg C:\Test.dot-pC:\Test.svg”
ProcessInfo.RedirectStandardOutput=True
ProcessInfo.UseShellExecute=False
ProcessInfo.CreateNoWindow=True
作为过程的Dim过程
流程=新流程
Process.StartInfo=ProcessInfo
Process.Start()
'等待进程传回退出代码
Process.WaitForExit()
尝试
将ProcessResults设置为String=Process.StandardOutput.ReadToEnd
Output.Text=ProcessResults
特例
Output.Text=ex.ToString
结束尝试
端接头
这里有三种情况。首先,我只是在测试启动记事本。 -开发工程 -生产工作(这是我能在生产中工作的唯一情况)

其次,我创建了一个简单的批处理文件,可以在记事本中打开一个文档。(记事本c:\test.dot)

  • 开发工程
  • 生产不起作用
第三,我正在调用Graphviz的dot.exe。这就是我试图在另一个页面中进行的工作

  • 开发工程
  • 生产不起作用
在所有生产不起作用的情况下,我都可以复制这种行为 -如果我在我的web.config中添加一个impersonate=true,那么我不会返回任何错误。页面运行时就像它是成功的一样

  • 如果我没有添加模拟配置,而是将凭据添加到ProcessInfo对象,那么页面将再次运行,不会出现错误。不过,这一过程并未在生产中开始

  • 如果我没有添加模拟或ProcessInfo凭据,那么我将得到一个错误。这是错误输出

访问被拒绝

描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源

异常详细信息:System.ComponentModel.Win32Exception:访问权限为
否认
源错误:
第36行:流程=新流程
第37行:Process.StartInfo=ProcessInfo
第38行:Process.Start()
第39行:
第40行:“等待进程传回退出代码
源文件:C:\Inetpub\vhosts\leapfrogbi.com\httpdocs\test\ProcessStart.aspx.vb行:38
堆栈跟踪:
[Win32Exception(0x80004005):访问被拒绝]
系统.诊断.流程.开始创建流程(流程startInfo startInfo)+2161
系统.诊断.过程.启动()+150
在C:\Inetpub\vhosts\leapfrogbi.com\httpdocs\Test\ProcessStart.aspx.vb中加载(对象发送方,事件参数e)测试\ProcessStart.Page\u
System.Web.UI.Control.OnLoad(EventArgs e)+91
System.Web.UI.Control.LoadRecursive()+74
System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+2207
我尝试了各种与安全相关的设置。当前我的应用程序池正在以本地管理员身份运行。我还尝试将所有人添加到administrators组中,以查看安全性是否是根本问题

此外,我正在使用Plesk来管理我的域。我已经广泛搜索了可能影响这种情况的任何选项,但还没有找到。同样,在生产过程中,当简单地调用启动记事本时,process start也可以工作。如果没有更详细的日志,很难缩小范围


提前感谢您提供的任何帮助。这让我抓狂。

找到运行站点的池,然后查看运行的用户

如果无法执行此操作,则可以运行此代码以查看池正在运行的用户:

var user = System.Security.Principal.WindowsIdentity.GetCurrent().User;
var userName = user.Translate(typeof(System.Security.Principal.NTAccount));
然后授予该用户运行这些文件的权限


参考:

我没有使用进程,使用shell,它正在成功运行

  • 创建包含命令的批处理文件。 不要将批保存在系统文件夹中

  • 在IIS中,打开运行网站的应用程序池的设置对话框。 将进程池的ID设置为“localsystem”

  • 使用shell(“path\batchfile”)执行批处理文件


  • 谢谢你,亚里士多德。我按照您的建议执行了操作,但应用程序池标识当前是本地管理员组的一部分。我已验证这是Security.Windowsidentity.GetCurrent.user返回的同一用户。我还明确地给了文件相同的用户权限&与请求有关,但结果相同。请记住,我可以使用管理员帐户运行应用程序,但除了第一个启动记事本的示例外,该过程实际上并没有运行。请取消上一个示例。我找到了一个用户没有权限访问的文件。批处理文件已运行。我将使用目标exe进行进一步测试并报告。更新-我能够运行目标exe。谢谢你,亚里士多德给我指出了正确的方向