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:
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
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