[VBS] Exit Code of Remote Process

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • ThomasBogaert
  • Registratie: Oktober 2009
  • Laatst online: 15-04-2024
Hoi,

Ik had een vraag over hoe je de exit code opvangt van een process dat je remote gelanceerd hebt. M'n script draait bijvoorbeeld op server A en lanceert een batch process op server B via WMI functionaliteit en de process.create functie. Deze functie geeft de process ID terug en deze kan ik dan gebruiken om te checken of het process al dan nie afgelopen is. Maar ik zou ook de return code moeten hebben van dat process en ik geraak er niet echt uit. Hieronder staat een extract uit m'n vb script:


VBScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Dim objEventSink
Dim objWshShell 
Dim objWMIService
Dim lngID

Set objEventSink = CreateObject("WbemScripting.SWbemSink")
WScript.ConnectObject objEventSink,"EVENTSINK_"
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\ServerB\root\cimv2") 

msgbox "about to start"
call RunRemoteProcessASync("ServerB","C:\","batchexecutor.exe","-modelid 1 -batch refreshsys", lngID)

Do While CheckProcessStillActive("ServerB",lngID)
    Wscript.Sleep 1000
Loop

msgbox "done"

Function RunRemoteProcessAsync(strServer, strPath, strExe, strParameters, ByRef lngProcessID)   
    Dim strCommand, objWMIService, objStartup, objConfig, objProcess, lngReturn, strMsg
   
    'Build up the command
    If Len(strParameters) > 0 Then
        strCommand = strPath & strExe & " " & strParameters
    Else
        strCommand = strPath & strExe
    End If
    
    'Create Remote Control objects
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strServer & "\root\cimv2") 
    Set objStartup = objWMIService.Get("Win32_ProcessStartup")
    Set objConfig = objStartup.SpawnInstance_
    objConfig.ShowWindow = 1        
    
    'Launch the actual process
    lngProcessID = 0
    Set objProcess = objWMIService.Get("Win32_Process")
    On Error Resume Next
    lngReturn = objProcess.Create(strCommand, strPath, objConfig, lngProcessID)
    If err.number <> 0 Then
       msgbox "Error launching remote process " & err.number & " - " & err.description
       On Error Goto 0
       RunRemoteProcessAsync = -1
       Exit Function
    End If
    On Error Goto 0
    
    Call WatchProcess(lngProcessID)
    RunRemoteProcessAsync = 0   
End Function

Function CheckProcessStillActive(strServerName, lngProcessID)
    Dim objWMIService, colProcesses, objProcess

    'Create Remote Control Objects
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strServerName & "\root\cimv2")
    'Query for the requested process ID
    Set colProcesses = objWMIService.ExecQuery("select * from Win32_Process WHERE ProcessId = " & lngProcessID)
    If colProcesses.count > 0 Then
        CheckProcessStillActive = true
    Else
        CheckProcessStillActive = false
    End If
End Function

Sub WatchProcess(ByVal lngProcessID)
  Dim strQuery
    
  strQuery                = ""
  strQuery                = strQuery & "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance "
  strQuery                = strQuery & "ISA 'Win32_Process' AND TargetInstance.ProcessID='" & lngProcessID & "'"
  objWMIService.ExecNotificationQueryAsync objEventSink, strQuery   
End Sub

Sub EVENTSINK_OnObjectReady(objInstance, objAsyncContext)
    Dim strMsg
    If objInstance.Path_.Class = "__InstanceDeletionEvent" Then
      strMsg                = "Process " & objInstance.TargetInstance.ProcessID & " terminated at " & Now() & vbCRLF
      'How to get exit code??
      
      msgbox strMsg            
      objEventSink.Cancel()
      WScript.Quit    
  End If      
End Sub

Sub EVENTSINK_OnCompleted(objInstance, objAsyncContext)
  Dim strMsg  
  strMsg                = "ExecQueryAsync completed"
  msgbox strMsg  
End Sub


Op MSDN vind ik er niet bijzonder veel over terug over alle methodes of properties. Ook Google kon me het antwoord niet geven. Er zijn wel andere methodes om een process te lanceren, maar enkel deze methode geeft me de process ID terug en kan ik iets uitvoeren op een andere server dan waarop het script draait. Vandaar dat ik process.create gebruik...

Alvast bedankt,
Thomas

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Wat is de waarde van lngReturn na uitvoering van regel 39 in jouw codevoorbeeld? nevermind

Volgens google books kun je de OnCompleted definieren met 3 parameters, waarbij de eerste parameter de return code is van je proces. Tenminste, dat is mijn conclusie. Het boek in kwestie lijkt me handig leesvoer voor jou op dit moment :)

[ Voor 77% gewijzigd door bigbeng op 07-10-2009 04:13 ]