実行中の HTTP リクエストの情報を表示する方法 (IIS WMI)

手順としては WorkerProcess オブジェクトを取得し、 それの GetExecutingRequests メソッドを呼ぶことにより、 現在実行中の HTTP リクエストに対応する HttpRequest オブジェクトを取得可能です。

下の例では SELECT * FROM WorkerProcess の結果を For Each することによってそれぞれの WorkerProcess に対する処理を行っています。

ただ、ワーカープロセスが存在しないときに For Each を呼ぶと Invalid pointer というエラーが発生してしまったので、あまり使いたくなかったのですが、On Error Resume Next で処理を流し、 Err オブジェクトをチェックすることで成否を確認しています。

On Error Resume Next

Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

Set oW3WPs = oWebAdmin.ExecQuery( "SELECT * FROM WorkerProcess" )


For Each oW3WP In oW3WPs

     If Err.Number <> 0 Then
          If Err.Number = -2147467261 Then
               WScript.Echo "実行中のリクエストはありません。(ワーカープロセス未起動)"
          Else
               WScript.Echo "不明のエラーです。" + CStr( Err.Number )
          End If
          
          Exit For
          
     End If
     
     oW3WP.GetExecutingRequests arrReqs
          
     If IsNull(arrReqs) Then

          WScript.Echo "実行中のリクエストはありません。"

     Else
          
         WScript.Echo "現在実行中のリクエスト数: " + CStr( UBound(arrReqs) + 1 )
         WScript.Echo ""
              
         For Each oRequest In arrReqs
             WScript.Echo "ClientIPAddress: " + oRequest.ClientIPAddress
             WScript.Echo "ConnectionId:    " + oRequest.ConnectionId
             WScript.Echo "CurrentModule:   " + oRequest.CurrentModule
             WScript.Echo "GUID:            " + NullSafeCStr( oRequest.GUID )
             WScript.Echo "HostName:        " + oRequest.HostName
             WScript.Echo "LocalIPAddress:  " + oRequest.LocalIPAddress
             WScript.Echo "LocalPort:       " + NullSafeCStr( oRequest.LocalPort )
             WScript.Echo "PipelineState:   " + NullSafeCStr( oRequest.PipelineState )
             WScript.Echo "Site ID:         " + NullSafeCStr( oRequest.SiteID )
             WScript.Echo "TimeElapsed:     " + NullSafeCStr( oRequest.TimeElapsed )
             WScript.Echo "TimeInModule:    " + NullSafeCStr( oRequest.TimeInModule )
             WScript.Echo "TimeInState:     " + NullSafeCStr( oRequest.TimeInState )
             WScript.Echo "Url:             " + oRequest.Url
             WScript.Echo "Verb:            " + oRequest.Verb
             WScript.Echo ""
         Next
     End If
Next


Function NullSafeCStr( o )

     If IsNull( o ) Then
          NullSafeCStr = "(null)"
     Else
          NullSafeCStr = CStr( o )
     End If

End Function

上記のスクリプトを enum_req.vbs という名前で保存し、実行した結果は以下のようになります。

> cscript enum_req.vbs
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.

現在実行中のリクエスト数: 1

ClientIPAddress: ::1
ConnectionId:    fc000001600001a9
CurrentModule:   ManagedPipelineHandler
GUID:            (null)
HostName:        localhost
LocalIPAddress:  ::1
LocalPort:       8080
PipelineState:   128
Site ID:         1
TimeElapsed:     3276
TimeInModule:    3011
TimeInState:     3011
Url:             /vdir/test1.aspx
Verb:            GET

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説