Невозможно создать процесс в COM-объекте с сайта asp - PullRequest
1 голос
/ 14 января 2011

Я обновляю старый процесс, который уже существует, который работает следующим образом:

Пользователь отправляет форму, которая запускает следующую asp (упрощенно, имена изменены):

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

RecordBuilder.SomeObject был старой библиотекой VB6, у меня нет 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.

1 Ответ

0 голосов
/ 14 января 2011

Убедитесь, что у учетной записи анонимного пользователя веб-сайта есть необходимые разрешения для папки 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
...