#vbscript #wmi
#vbscript #wmi
Вопрос:
Я пытаюсь запустить следующий скрипт VB для запуска команды на удаленном компьютере. Я хочу, чтобы этот скрипт подождал, пока команда не будет выполнена полностью.
Вот мой код:
Function RemoteExecute(strServer, strUser, strPassword, strCommand,pro)
Dim objLocator , objWMIService
wbemImpersonationLevelImpersonate = 3
wbemAuthenticationLevelPktPrivacy = 6
RemoteExecute = -1
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
On Error Resume Next
Set objWMIService = objLocator.ConnectServer(strServer,"rootcimv2", strUser,strPassword)
objWMIService.Security_.ImpersonationLevel = wbemImpersonationLevelImpersonate
objWMIService.Security_.AuthenticationLevel = wbemAuthenticationLevelPktPrivacy
If Err.Number <> 0 Then
WScript.Echo "Failed to connect to " amp;strServer, "Error # " amp; CStr(Err.Number) amp; " " amp; Err.Description amp; vbcrlf amp; _
"Please check if " amp; strServer amp; " is pingable from this client amp; credentials are correct"
Err.Clear
On Error GoTo 0
RemoteExecute = -1
Set objWMIService = nothing
Set objLocator = nothing
Exit function
end if
' Configure the process to show a window
Set objStartup = objWMIService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
objConfig.ShowWindow = SW_NORMAL
Set Process = objWMIService.Get("Win32_Process")
'Process.Create Syntax: '
' uint32 Create(
'[in] string CommandLine,
'[in] string CurrentDirectory,
'[in] Win32_ProcessStartup ProcessStartupInformation,
'[out] uint32 ProcessId
');
'Return code Description
'0 Successful Completion
'2 Access Denied
'3 Insufficient Privilege
'8 Unknown failure
'9 Path Not Found
'21 Invalid Parameter
intReturn = Process.Create(strCommand,NULL, objConfig, intProcessID)
If intReturn <> 0 Then
Wscript.Echo "Process could not be created." amp; _
vbNewLine amp; "Command line: " amp; strCommand amp; _
vbNewLine amp; "Return value: " amp; intReturn
Wscript.Quit
Else
Wscript.Echo "Process created." amp; _
vbNewLine amp; "Command line: " amp; strCommand amp; _
vbNewLine amp; "Process ID: " amp; intProcessID
RemoteExecute = intProcessID
End If
' Set objWMIService = GetObject("winmgmts:\" amp; strServer amp; "rootcimv2")
Set colMonitoredProcesses = objWMIService.ExecNotificationQuery_("SELECT *" " FROM __InstanceDeletionEvent " "WITHIN 5 WHERE TargetInstance ISA 'Win32_Process' " )
Do
Set objProcess = colMonitoredProcesses.NextEvent
Wscript.Echo objProcess.TargetInstance.Name
Wscript.Echo objProcess.TargetInstance.ExecutablePath
Wscript.Echo "1"
Wscript.Echo "proc:" amp; objProcess.TargetInstance.ProcessID
Wscript.Echo "int:" amp; intProcessID
If objProcess.TargetInstance.ProcessID = intProcessID Then
Wscript.Echo "I will end the monitoring of the process "
Wscript.Echo pro amp; objProcess.TargetInstance.Name
Exit Do
end If
Loop
Set objWMIService = nothing
Set objLocator = nothing
End Function
strServer = WScript.Arguments.Item(0)
strUser = WScript.Arguments.Item(1)
strPassword = WScript.Arguments.Item(2)
strCommand = WScript.Arguments.Item(3)
pro = WScript.Arguments.Item(4)
Call RemoteExecute(strServer, strUser, strPassword, strCommand,pro)
Но проблема, с которой я сталкиваюсь, заключается в том, что скрипт запускает процесс в фоновом режиме, но не ожидает его.
Еще один момент, который я не понимаю, заключается в том, что при попытке повторить следующее:
Wscript.Echo objProcess.TargetInstance.Name
Wscript.Echo objProcess.TargetInstance.ExecutablePath
Wscript.Echo "proc:" amp; objProcess.TargetInstance.ProcessID
это ничего не повторяет, тогда как следующие должным образом повторяются с помощью приятного всплывающего окна
Wscript.Echo "1"
Wscript.Echo "int:" amp; intProcessID
Кто-нибудь, пожалуйста, может решить мою проблему, возможно, для кого-то эта проблема наивна, извините, что я здесь наивен.
Комментарии:
1. Код работает для меня. Возможно, вы получаете ошибку, которая остается незамеченной, потому что вы не отключаете обработку ошибок после подключения к удаленному хосту? Добавьте
On Error Goto 0
перед строкойSet objStartup = objWMIService.Get("Win32_ProcessStartup")
.2. Из справки WSH. Кажется проще.
set oController = CreateObject("WSHController") set oProcess = oController.CreateScript("c:wsh5.6beenhere.wsf", "remmachine") oProcess.Execute While oProcess.Status <> 2 WScript.Sleep 100 WEnd WScript.Echo "Done"