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 には Explorer.exe のインスタンスが 3 つあり、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!"
4

2 に答える 2

1

そもそも、Windows 以外のコンピューターが WMI クエリに応答すると考える根拠は何ですか? ほとんどの Windows 以外のコンピューターのステートメント

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

WMI (Windows Management Instrumentation の略) をサポートしていないため、単純に失敗します。このエラーのため、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

上記を ping テストと組み合わせることで、到達不能なコンピューターと Windows を実行していないように見えるコンピューターを区別できます。

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
于 2013-10-09T18:05:59.170 に答える