プロが教えるわが家の防犯対策術!

WMIでのプロセスの起動・終了監視について

●環境
Microsoft VC++ 6.0
Windows XP Pro

●質問
http://mrxray.on.coocan.jp/Delphi/plSamples/902_ …
の「04_プロセス(アプリケーション)の起動と終了を監視」を参考に、VCに置き換えて作成したのですが途中で詰まってしまいました。

get_Classによる取得までできて、プロセスの作成・終了までは分かるようになったのですが
そのプロセスの情報が取得できません(プロセスIDや名前など)、参考にしたページ(Delphi)ではTargetInstanceから取得できるようなのですが、VCではそのプロパティ(?)が見つからず情報を取得出来ませんでした
どうすれば、プロセスの情報を取得出来るのでしょうか?
よろしくお願いします。

●ソース
_COM_SMARTPTR_TYPEDEF(ISWbemEventSource, __uuidof(ISWbemEventSource));
_COM_SMARTPTR_TYPEDEF(ISWbemObject, __uuidof(ISWbemObject));
_COM_SMARTPTR_TYPEDEF(ISWbemObjectPath, __uuidof(ISWbemObjectPath));

ISWbemEventSourcePtr SWbemEventSourcePtr;
hResult = SWbemServices->ExecNotificationQuery(_bstr_t(L"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"),
_bstr_t(L"WQL"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&SWbemEventSourcePtr);

while(TRUE)
{
ISWbemObjectPtr SWbemObjectPtr;
hResult = SWbemEventSourcePtr->NextEvent(-1, &SWbemObjectPtr);

CString ccc;
{
ISWbemObjectPathPtr SWbemObjectPathPtr;
hResult = SWbemObjectPtr->get_Path_(&SWbemObjectPathPtr);

CComBSTR ClassString;
hResult = SWbemObjectPathPtr->get_Class(&ClassString);

ccc = ClassString;
}

■■■ここでプロセスに関する情報を取得したい■■■

if(ccc == "__InstanceCreationEvent"){
// プロセス作成
}
else if(ccc == "__InstanceDeletionEvent"){
// プロセス終了
}
}

A 回答 (2件)

} else if( wcscmp( vtClass.bstrVal, L"__InstanceDeletionEvent" ) == 0 ) {


// Get the value of the Name property
hResult = pwbcoProcess->Get( L"TargetInstance", 0, &vtTargetInstance, 0, 0 );
pwbcoInstance = ( IWbemClassObject * )(vtTargetInstance.ppdispVal);
hResult = pwbcoInstance->Get( L"Caption", 0, &vtCaption, 0, 0 );
wprintf( L"%s : Delete\n", vtCaption.bstrVal );
VariantClear( &vtTargetInstance );
VariantClear( &vtCaption );
iCount++;
}

VariantClear( &vtClass);
}

pNameSpace->Release();
pLocator->Release();
pEnumerator->Release();
pwbcoInstance->Release();
pwbcoProcess->Release();
CoUninitialize();

return 0;
}


/////////////////////////////////////////////////////
// stdafax.h
/////////////////////////////////////////////////////
#pragma once

#define _WIN32_DCOM

#include "targetver.h"

#include <windows.h>
#include <wbemidl.h>
#include <comutil.h>

#include <stdio.h>
#include <tchar.h>


VC++6.0 では、そのままではコンパイルが通らないかもしれません。
その場合は、最新の Windows SDK をインストールすればよいでしょう。
    • good
    • 0
この回答へのお礼

お礼が遅くなりすみませんでした。

大変詳しい回答を頂き本当にありがとうございました。
サンプロを参考に、何とかWMIによるキャプション取得に成功しました。
少しですがWMIのコツがつかめた気がします。
本当にありがとうございました。

お礼日時:2010/07/09 23:28

Visual Studio 2008 で作ってみました。


Windows XP(win32)、Windows 7(x64)で動作確認しました。
字数の関係でエラーチェックは省略しています。

// stdafx.h
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hResult = CoInitialize(0);
hResult = CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
IWbemLocator *pLocator = NULL;
hResult = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(LPVOID *)&pLocator);
IWbemServices *pNameSpace = 0;
hResult = pLocator->ConnectServer(_bstr_t(L"\\\\.\\ROOT\\CIMV2"),NULL,NULL,NULL,0,NULL,NULL,&pNameSpace);
hResult = CoSetProxyBlanket(pNameSpace,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
IEnumWbemClassObject* pEnumerator = NULL;
hResult = pNameSpace->ExecNotificationQuery(_bstr_t(L"WQL"),_bstr_t(L"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'" ),WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator);

IWbemClassObject *pwbcoProcess;
VARIANT vtClass;
IWbemClassObject *pwbcoInstance;
VARIANT vtTargetInstance;
VARIANT vtCaption;
ULONG ulReturn = 0;
int iCount = 0;

while(iCount < 100){
hResult = pEnumerator->Next(WBEM_INFINITE,1,&pwbcoProcess,&ulReturn);
if(0 == ulReturn){
break;
}

SAFEARRAY *pNames;
hResult = pwbcoProcess->GetNames(NULL,WBEM_FLAG_ALWAYS,NULL,&pNames);
hResult = pwbcoProcess->Get(L"__CLASS",0,&vtClass,0,0);
if(wcscmp(vtClass.bstrVal,L"__InstanceCreationEvent") == 0){
hResult = pwbcoProcess->Get(L"TargetInstance",0,&vtTargetInstance,0,0);
pwbcoInstance = (IWbemClassObject *)(vtTargetInstance.ppdispVal);
hResult = pwbcoInstance->Get(L"Caption",0,&vtCaption,0,0);
wprintf(L"%s:Create\n",vtCaption.bstrVal);
VariantClear(&vtTargetInstance);
VariantClear(&vtCaption);
iCount++;
}

つづく・・・
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!