To intercept a PowerShell command, like
powershell -Command dir
you can adapt the MSDN code from :
In a Win32 app, I commented the code after Sleep(10000);, to let it running,
I updated the query :
_bstr_t("SELECT * "
"FROM __InstanceCreationEvent WITHIN 1 "
"WHERE TargetInstance ISA 'Win32_Process' and TargetInstance.Name='powershell.exe'"),
and I updated :
HRESULT EventSink::Indicate(long lObjectCount, IWbemClassObject** apObjArray)
{
HRESULT hr = S_OK;
VARIANT vtTargetInstance;
VARIANT vtTargetProp;
for (int i = 0; i < lObjectCount; i++)
{
hr = apObjArray[i]->Get(L"TargetInstance", 0, &vtTargetInstance, NULL, NULL);
if (SUCCEEDED(hr))
{
IWbemClassObject* pTargetInstance = NULL;
hr = vtTargetInstance.punkVal->QueryInterface(IID_IWbemClassObject, reinterpret_cast<void**>(&pTargetInstance));
if (SUCCEEDED(hr))
{
hr = pTargetInstance->Get(L"CommandLine", 0, &vtTargetProp, NULL, NULL);
if (SUCCEEDED(hr))
{
WCHAR wsProp[512] = L"";
lstrcpy(wsProp, vtTargetProp.bstrVal);
// Command Line : "C:\WINDOWS\system32\WindowsPowerShell\v1.0\PowerShell.exe" -Command dir
WCHAR wsText[1024] = L"";
wsprintf(wsText, L"Command Line : %s\r\n", wsProp);
OutputDebugString(wsText);
VariantClear(&vtTargetProp);
}
pTargetInstance->Release();
pTargetInstance = NULL;
}
VariantClear(&vtTargetInstance);
}
}
return WBEM_S_NO_ERROR;
}