ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文

  メンテナンス 前画面に戻る

対象スレッド 件名: WMI によるプロセスの監視
名前: lightbox
処理選択
パスワード

件名 WMI によるプロセスの監視
名前 lightbox
コメント
http://lightbox.on.coocan.jp/download/wsh/PROCESS_CHECK_NEXT.vbs

[[VBSCript(同期メソッド)の場合]]
@DIV
Set objWMIService = GetObject("winmgmts:" _ 
	& "{impersonationLevel=impersonate}!\\.\root\cimv2") 
Set objMonitor = objWMIService. _
	http://msdn.microsoft.com/en-us/library/aa393864.aspx|(ExecNotificationQuery)("select * from __instancecreationevent " _
	& " within 1 where TargetInstance isa 'Win32_Process'")

Do
	@C:green(' 次に新しいプロセスが開始されるまで、待ちます)
	Set objProcess = objMonitor.NextEvent

	@C:green(' 終了する手段として winver.exe を実行します)
	if Ucase( objProcess.TargetInstance.Name ) = "WINVER.EXE" then
		Wscript.Echo "プロセスの監視を終了します"
		Exit Do
	end if

	Wscript.Echo objProcess.TargetInstance.Name
	Wscript.Echo objProcess.TargetInstance.ExecutablePath
Loop 
@END
http://msdn.microsoft.com/en-us/library/aa394606.aspx(WQL:SQL for WMI)


[[VBSCript(非同期メソッド)の場合]]
@DIV
Set objWMIService = GetObject("winmgmts:" _ 
	& "{impersonationLevel=impersonate}!\\.\root\cimv2") 
Set http://msdn.microsoft.com/en-us/library/aa393877.aspx(objSink) = WScript.CreateObject( _
	"WbemScripting.SWbemSink","SINK_")

objWMIservice.http://msdn.microsoft.com/en-us/library/aa393865.aspx(ExecNotificationQueryAsync) objSink, _
	"SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE " _
	& "TargetInstance ISA 'Win32_Process'"

' イベントを待つ為にプログラムを終わらさないようにする
MsgBox("待機しています...")

Sub SINK_http://msdn.microsoft.com/en-us/library/aa393881.aspx|(OnObjectReady)(objObject, objAsyncContext)

	' 名前
	WScript.Echo objObject.TargetInstance.Name
	' 実行パス
	WScript.Echo objObject.TargetInstance.ExecutablePath

	' プロパティの列挙
	For Each obj IN objObject.http://msdn.microsoft.com/en-us/library/aa393781.aspx(Properties_)
		strProp = obj.Name & vbCrLf
		Set objTarget = obj.Value
		For Each obj2 IN objTarget.Properties_
			strProp = strProp & vbTab & obj2.Name & vbCrLf
		Next
	Next

	WScript.Echo strProp

End Sub
@END



[[VB.NET(同期メソッド)の場合]]
@DIV
Imports System.Threading
Imports System.Management

Public Class Form1

	@C:green(' スレッドの終了をコントロールするフラグ)
	Private stopFlg As Integer = 0

	@C:green(' **************************************************
	' 初期処理
	' **************************************************)
	Private Sub Form1_Load(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles MyBase.Load

		Me.LboxGrid1.UseParentFitForm = Me

		Me.LboxGrid1.AddColumn("TIME", "時刻")
		Me.LboxGrid1.AddColumn("NAME", "名称")
		Me.LboxGrid1.AddColumn("PATH", "ファイル")

		@C:green(' スレッド処理するメソッドを作成)
		Dim ThreadProc As New Thread(AddressOf ThreadEntry)
		@C:green(' スレッド開始)
		ThreadProc.Start()

	End Sub

	@C:green(' **************************************************
	' スレッドの入り口
	' **************************************************)
	Private Sub ThreadEntry()

		Dim Bridge As New ProcBridge(AddressOf SetData)

		Dim Query As New EventQuery( _
		  "SELECT * FROM" & _
		  " __InstanceCreationEvent WITHIN 1 " & _
		  "WHERE TargetInstance isa ""Win32_Process""")

		' 監視用オブジェクト
		Dim Monitor As New http://msdn.microsoft.com/ja-jp/library/s4acy5e2.aspx|(ManagementEventWatcher)(Query)
		@C:green(' 時分秒[ WaitForNextEvent 内での監視時間 ])
		Monitor.Options.http://msdn.microsoft.com/ja-jp/library/system.management.managementoptions.timeout.aspx(Timeout) = New http://msdn.microsoft.com/ja-jp/library/bk8a3558.aspx|(TimeSpan)(0, 0, 1)

		Dim targetProcess As ManagementBaseObject = Nothing

		@C:green(' 参照する為に、常に 0 で比較後等しければ 0 をセット。1 の時にループ終了)
		Do While Interlocked.CompareExchange(stopFlg, 0, 0) = 0

			Try
				@C:green(' タイムアウトでは、エラーで Try を抜ける)
				targetProcess = Monitor.WaitForNextEvent()
				Dim str1 = _
				CType(targetProcess("TargetInstance"), _
				 ManagementBaseObject)("Name")
				Dim str2 = _
				CType(targetProcess("TargetInstance"), _
				 ManagementBaseObject)("ExecutablePath")

				Me.Invoke(Bridge, New Object() {1, str1, str2})
			Catch ex As Exception
			End Try

		Loop

		Monitor.Stop()
		Monitor.Dispose()
		@C:green(' 実際の終了を通知する)
		Me.Invoke(Bridge, New Object() {-1, "終了処理中です...", ""})

	End Sub

	@C:green(' **************************************************
	' 橋渡し用デリゲート
	' **************************************************)
	Delegate Sub ProcBridge(ByVal type As Integer, _
	ByVal str1 As String, ByVal str2 As String)

	@C:green(' **************************************************
	' 橋渡し用実体
	' **************************************************)
	Private Sub SetData(ByVal type As Integer, _
	ByVal Name As String, ByVal Path As String)

		If type = 1 Then
			Me.LboxGrid1.AddRow()
			Me.LboxGrid1.SetColumnText("TIME", Now.ToString())
			Me.LboxGrid1.SetColumnText("NAME", Name)
			Me.LboxGrid1.SetColumnText("PATH", Path)
		End If
		If type = -1 Then
			Me.LboxGrid1.AddRow()
			Me.LboxGrid1.SetColumnText("TIME", Now.ToString())
			Me.LboxGrid1.SetColumnText("NAME", Name)
			Me.LboxGrid1.Update()
			Thread.Sleep(1000)
			@C:green(' 終了通知うけて、実際終了する)
			@C:green(' [ FormClosing と FormClosed が発生する ])
			Application.Exit()
		End If

	End Sub


	@C:green(' **************************************************
	' フォームが閉じる前[ e.Cancel = True でキャンセル可能 ]
	' **************************************************)
	Private Sub Form1_FormClosing(ByVal sender As System.Object, _
	ByVal e As System.Windows.Forms.FormClosingEventArgs) _
	Handles MyBase.FormClosing

		@C:green(' スレッド実行中ならば、スレッドが終了する状態にして、終了処理をキャンセル)
		If Interlocked.CompareExchange(stopFlg, 0, 0) = 0 Then
			Interlocked.Exchange(stopFlg, 1)
			e.Cancel = True
		End If

	End Sub

End Class
@END
http://msdn.microsoft.com/en-us/library/aa394649.aspx(TargetInstance を持つ __InstanceCreationEvent)
http://msdn.microsoft.com/en-us/library/aa394372.aspx(Name と ExecutablePath を持つ Win32_Process)


[[VB.NET(非同期メソッド)の場合]]
@DIV
Imports System.Threading
Imports System.Management

Public Class 非同期

@C:green(	' 監視用オブジェクト)
	Private Monitor As ManagementEventWatcher = Nothing

	@C:green(' **************************************************
	' 初期処理
	' **************************************************)
	Private Sub Form1_Load(ByVal sender As System.Object, _
	 ByVal e As System.EventArgs) Handles MyBase.Load

		Me.LboxGrid1.UseParentFitForm = Me

		Me.LboxGrid1.AddColumn("TIME", "時刻")
		Me.LboxGrid1.AddColumn("NAME", "名称")
		Me.LboxGrid1.AddColumn("PATH", "ファイル")


		Dim Query As New EventQuery( _
		  "SELECT * FROM" & _
		  " __InstanceCreationEvent WITHIN 1 " & _
		  "WHERE TargetInstance isa ""Win32_Process""")

		@C:green(' 監視用オブジェクト作成)
		Monitor = New ManagementEventWatcher(Query)
		@C:green(' イベントハンドラ登録)
		AddHandler Monitor.EventArrived, AddressOf Monitor_EventArrived

		@C:green(' 監視開始)
		Monitor.Start()


	End Sub

	@C:green(' **************************************************
	' イベント
	' **************************************************)
	Public Sub Monitor_EventArrived(ByVal sender As Object, _
	  ByVal e As EventArrivedEventArgs)

		Dim Bridge As New ProcBridge(AddressOf SetData)
		Dim targetProcess As ManagementBaseObject = e.NewEvent

		Dim str1 = _
		CType(targetProcess("TargetInstance"), _
		 ManagementBaseObject)("Name")
		Dim str2 = _
		CType(targetProcess("TargetInstance"), _
		 ManagementBaseObject)("ExecutablePath")
		Me.Invoke(Bridge, New Object() {1, str1, str2})

	End Sub

	@C:green(' ************************************************************
	' 橋渡し用デリゲート
	' ************************************************************)
	Delegate Sub ProcBridge(ByVal type As Integer, _
	ByVal str1 As String, ByVal str2 As String)

	@C:green(' ************************************************************
	' 橋渡し用実体
	' ************************************************************)
	Private Sub SetData(ByVal type As Integer, _
	ByVal Name As String, ByVal Path As String)

		If type = 1 Then
			Me.LboxGrid1.AddRow()
			Me.LboxGrid1.SetColumnText("TIME", Now.ToString())
			Me.LboxGrid1.SetColumnText("NAME", Name)
			Me.LboxGrid1.SetColumnText("PATH", Path)
		End If

	End Sub

	@C:green(' **************************************************
	' フォームが閉じる前[ e.Cancel = True でキャンセル可能 ]
	' **************************************************)
	Private Sub Form1_FormClosing(ByVal sender As System.Object, _
	 ByVal e As System.Windows.Forms.FormClosingEventArgs) _
	 Handles MyBase.FormClosing

		@C:green(' 監視終了)
		Monitor.Stop()
		Monitor.Dispose()

	End Sub

End Class
@END