【问题标题】:Cannot create a process in a COM object from an asp site无法在 asp 站点的 COM 对象中创建进程
【发布时间】:2011-06-09 05:59:32
【问题描述】:

我正在更新一个已经存在的旧进程,它的工作原理如下:

用户提交一个表单,该表单运行以下 asp(简化,名称已更改):

    <%  
    set rb = Server.CreateObject("RecordBuilder.SomeObject")  
    rb.Calculate()  
    rb.StartProcess()  
    %>

RecordBuilder.SomeObject 是旧的 VB6 DLL,我没有 VB6,所以我将其转换为 VB.Net 4.0

对Calculate() 的调用按预期工作,对StartProcess() 的调用失败。

StartProcess() 如下:

Public Function StartProcess()
    Try
        strProcess = "Starting process"
        Dim proc = New Process()
        proc.StartInfo.RedirectStandardOutput = True
        proc.StartInfo.UseShellExecute = False
        proc.StartInfo.CreateNoWindow = True
        proc.StartInfo.FileName = "d:\App\RecordProcessor.exe"

        Dim procHandle = proc.Start()
        strProcess = "Started process"
    Catch ex As Exception
        Err.Raise(vbObjectError + 9999, "RecordBuilder.SomeObject", strProcess & " failed: " & ex.Message & "<hr />Stack Trace:<br />" & ex.StackTrace)
    End Try
End Function

调用proc.Start() 失败,但是如果我将测试ASP 复制到.vbs 文件,它将按预期工作。

我已更改d:\App\RecordProcessor.exe 的权限,以授予组Everyone 的执行权限。

【问题讨论】:

  • 抛出什么异常?
  • 搞定了。我从 Visual Studio 中重新生成了我的强名称密钥,而不是通过“sn -k”。此外,如果 RedirectStandardOutput、UseShellExecute 和 CreateNoWindow 设置不正确,它会尝试在 Window 中运行应用程序并失败并拒绝访问。

标签: asp.net vb.net vbscript asp-classic com


【解决方案1】:

检查网站的匿名用户帐户是否对d:\app 文件夹及其可能涉及的任何其他文件夹具有必要的权限。

我注意到缺少的一件事是 proc.WaitForExit() 在您的 proc.Start() 之后。

您可能想要这样,以便您也可以从流程本身捕获错误:

Dim stdError As New String
Try
    strProcess = "Starting process"
    Dim proc = New Process()
    proc.StartInfo.RedirectStandardOutput = True
    proc.StartInfo.RedirectStandardError = True
    proc.StartInfo.UseShellExecute = False
    proc.StartInfo.CreateNoWindow = True
    proc.StartInfo.FileName = "d:\App\RecordProcessor.exe"

    Dim procHandle = proc.Start()
    strProcess = "Started process"

    proc.WaitForExit()

    stdError = proc.StandardError.ReadToEnd()
    If stdError.Length > 0 Then
       '' So long since I did VB so next line might need tweaked
       Err.Raise(vbObjectError, "Caught StdError", stdError)
    End If
Catch ex As Exception
    Err.Raise(vbObjectError + 9999, "RecordBuilder.SomeObject", strProcess & _
         " failed: "  & ex.Message & "<hr />Stack Trace:<br />" & ex.StackTrace)
End Try

【讨论】:

  • 谢谢,我已授予“Everyone”组的整个 D:\app 文件夹读取和执行权限。我在我的实际方法中使用 proc.WaitForExit(),但我使用测试方法对 proc.Start 调用进行故障排除。它会在 proc.Start() 调用上引发异常,因此不会从 StandardError 中读取任何内容
  • @user - 抛出什么异常?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2018-11-12
  • 2012-03-27
相关资源
最近更新 更多