Запуск команды на удаленном компьютере с использованием WMI

#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"