2013-10-09 3 views
1

Я пытаюсь создать сценарий, который будет подключаться к удаленным компьютерам в пределах диапазона IP-адресов, а затем эхо, какой из них запускает процесс explorer.exe.Эхо, работает ли процесс на нескольких удаленных компьютерах

Когда я запускаю скрипт в небольшом диапазоне (10.2.1.1 - 10.2.1.10), я знаю, что 10.2.1.4 находится в автономном режиме и что 10.2.1.9 и 10.2.1.10 не являются компьютерами на базе Windows и поэтому должны эхо- Explorer.exe не работает. Однако это не так. Кажется, они возвращают тот же результат предыдущего сервера. Например, 10.2.1.3 имеет 3 экземпляра Explorer.exe и echo 3 раза, тогда я получаю тот же результат для 10.2.1.4, который отключен.

Мой сценарий выглядит следующим образом:

On Error Resume Next 

intStartingAddress = InputBox("Please enter a starting address: (e.g. 1)", "Starting Address") 
intEndingAddress = InputBox("Please enter an ending address: (e.g. 254)", "Ending Address") 
strSubnet = InputBox("Please enter a subnet excluding the last octet: (e.g. 10.2.1.)", "Subnet") 

For i = intStartingAddress to intEndingAddress 
    strComputer = strSubnet & i 

    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 

    Set colProcess = objWMIService.ExecQuery("Select * From Win32_Process Where Name = 'Explorer.exe'") 

    For Each objProcess in colProcess 
     If colProcess.Count > 0 Then 
      Wscript.Echo strComputer & " Explorer.exe is running." 
     Else 
      Wscript.Echo strComputer & " Explorer.exe is not running." 
     End If 
    Next 
Next 

Wscript.Echo "That's all folks!" 
+0

Может ли компьютер, не относящийся к Windows, ответить на этот код? – foxidrive

ответ

1

Что заставляет вас думать, что компьютеры, отличные от Windows, будут отвечать на запросы WMI в первую очередь? Для большинства компьютеров не-Windows, данного заявления

Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" _ 
    & strComputer & "\root\cimv2") 

просто не будет, потому что они не поддерживают WMI (который короток для инструментария управления Windows). Из-за этой ошибки объект objWMIService остается таким же, как и в предыдущем цикле цикла, поэтому ваши последующие инструкции запрашивают тот же хост, который вы делали раньше. Вы никогда не видите ошибку, хотя, потому что она замаскирована глобальным On Error Resume Next.

Это может быть смягчен путем удаления глобального On Error Resume Next и изменения этого цикла:

For i = intStartingAddress to intEndingAddress 
    strComputer = strSubnet & i 

    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 

    ... 
Next 

во что-то вроде этого:

For i = intStartingAddress to intEndingAddress 
    strComputer = strSubnet & i 
    Set objWMIService = Nothing 

    On Error Resume Next 
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _ 
    & strComputer & "\root\cimv2") 
    On Error Goto 0 

    If Not objWMIService Is Nothing Then 
    ... 
    Else 
    WScript.Echo strComputer & " cannot be accessed." 
    End If 
Next 

Вы можете различать недостижимые компьютеры и компьютеры, которые не появляются для запуска Windows путем объединения вышеперечисленного с испытанием ping:

Set wmi = GetObject("winmgmts://./root/cimv2") 

qry = "SELECT * FROM Win32_PingStatus WHERE Address='" & strComputer & "'" 
For Each ping In wmi.ExecQuery(qry) 
    reachable = (0 = ping.StatusCode) 
Next 

If reachable Then 
    If objWMIService Is Nothing Then 
    'computer is not running Windows 
    Else 
    'computer is running Windows 
    End If 
Else 
    'computer is offline 
End If 
+0

Я не верю, что не Windows ответит, но мой код делает эхо, что проводник работал на них, когда это не должно. Перемещение «Включить« Ошибка при повторном запуске »и добавление« On Error GoTo 0 », а также« If Nothing Then »сделали трюк. – cvandal

+0

Как объяснялось выше, это связано с неправильным представлением в вашем коде. Он утверждает, что в настоящее время обработанный хост запускает «Explorer.exe», потому что он фактически запрашивает другой хост, на котором запущен «Explorer.exe». –

1

Во-первых: я бы переместить проверку colProcess.Count произойти перед циклом colProcess. Если в объекте нет коллекций, вы не получите ответ эха.

Во-вторых: я проверил бы значение в запросе WMI, таком как ProcessID, и проверял, является ли он Null или имеет значение, что означает, что он фактически запущен.

intStartingAddress = InputBox("Please enter a starting address: (e.g. 1)", "Starting Address") 
intEndingAddress = InputBox("Please enter an ending address: (e.g. 254)", "Ending Address") 
strSubnet = InputBox("Please enter a subnet excluding the last octet: (e.g. 10.2.1.)", "Subnet") 

For i = intStartingAddress to intEndingAddress 
    strComputer = strSubnet & i 

    Set objWMIService = Nothing 

    On Error Resume Next 
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
    On Error Goto 0 

    If objWMIService Is Nothing Then 
     Wscript.Echo strComputer & " Explorer.exe is not running." 
    Else 
     Set colProcess = objWMIService.ExecQuery("Select * From Win32_Process Where Name = 'Explorer.exe'") 

     If colProcess.Count = 0 Then 
      Wscript.Echo strComputer & " Explorer.exe is not running." 
     Else 
      For Each objProcess in colProcess 
       If IsNull(objItem.ProcessID) Or Not IsNumeric(objItem.ProcessID) Then 
        Wscript.Echo strComputer & " Explorer.exe is not running." 
       Else 
        Wscript.Echo strComputer & " Explorer.exe is running. (Process ID: " & objItem.ProcessID & ")" 
       End If 
      Next 
     End If 
    End If 
Next 

Wscript.Echo "That's all folks!" 

EDIT: Модифицированный скрипт, чтобы принять во внимание WMI запрос не будет на Non-Windows Операционные системы, как отметил Ansgar Wiechers.

+1

Это * не * решает проблему, потому что проблема заключается в том, что 'GetObject' терпит неудачу для компьютеров, отличных от Windows. Из-за этого 'objWMIService' сохраняет свое значение из предыдущего цикла цикла, и запрос запускается на том же компьютере, что и раньше, что неудивительно производит тот же результат, что и раньше. –

+1

@ ansgar-wiechers Вы делаете хороший момент, и я прошу прощения за надзор; однако это можно было бы легко исправить. Я не понимаю, почему его стоит опросить ответ, особенно когда я мог бы легко его исправить. –

+1

Ответы, которые на самом деле ошибочны, заслуживают того, чтобы их нивелировали. Когда они исправляются, они заслуживают того, чтобы их не использовали. –

Смежные вопросы