Я пытаюсь найти конкретное правило в брандмауэре в C ++, используя приведенный ниже код,
HRESULT WFCOMInitialize(INetFwPolicy2** ppNetFwPolicy2)
{
HRESULT hr = S_OK;
hr = CoCreateInstance(
__uuidof(NetFwPolicy2),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(INetFwPolicy2),
(void**)ppNetFwPolicy2);
return hr;
}
int _tmain(int argc, _TCHAR* argv[])
{
CComVariant var;
IUnknown *pEnumerator;
BSTR bstrName;
HRESULT hrComInit = S_OK;
HRESULT hr = S_OK;
ULONG cFetched = 0;
IEnumVARIANT* pVariant = NULL;
INetFwPolicy2 *pNetFwPolicy2 = NULL;
INetFwRules *pFwRules = NULL;
INetFwRule *pFwRule = NULL;
hrComInit = CoInitialize(NULL);
if (hrComInit != RPC_E_CHANGED_MODE)
if (FAILED(hrComInit))
goto Cleanup;hr = WFCOMInitialize(&pNetFwPolicy2);
hr = pNetFwPolicy2->get_Rules(&pFwRules);
if (FAILED(hr))
goto Cleanup;
pFwRules->get__NewEnum(&pEnumerator);
if (pEnumerator)
hr = pEnumerator->QueryInterface(__uuidof(IEnumVARIANT), (void **)&pVariant);
while (SUCCEEDED(hr) && hr != S_FALSE)
{
var.Clear();
hr = pVariant->Next(1, &var, &cFetched);
if (S_FALSE != hr)
{
if (SUCCEEDED(hr))
hr = var.ChangeType(VT_DISPATCH);
if (SUCCEEDED(hr))
hr = (V_DISPATCH(&var))->QueryInterface(__uuidof(INetFwRule3), reinterpret_cast<void**>(&pFwRule));
if (SUCCEEDED(hr))
if (SUCCEEDED(pFwRule->get_Name(&bstrName)))
if(!wcscmp(bstrName, L"Mail, Calendar, and People"))
CurrentProfilesBitMask++;
}
}
Cleanup:
if (pFwRule)
pFwRule->Release();
if (pNetFwPolicy2)
pNetFwPolicy2->Release();
if (SUCCEEDED(hrComInit))
CoUninitialize();
return 0;
}
Я могу найти правило по имени Mail, Calendar, and People
в брандмауэре. Но используя QueryInterface
это не доступно (то есть, if(!wcscmp(bstrName, L"Mail, Calendar, and People"))
это провал для всех правил). QueryInterface успешен, но сравнение строк не совпадает. но правило в брандмауэре.
я пытался этот VBScript предоставляется в MSDN и результат такой же, как указано выше. Указанное правило не может быть найдено по коду VBScript или C ++.
Задача ещё не решена.
Других решений пока нет …