书接上文
WMI访问系统服务
WMI是可以查询以及启动、停止系统中的服务程序的
于是我又为补充了几个函数
HRESULT CWMI::ExcuteServiceCtrl(UINT uControlCode)
{
HRESULT hr = E_FAIL;
CComPtr<IWbemLocator> pLoc = NULL;
CComPtr<IWbemServices> pSvc = NULL;
do {
hr = InitialCom();
CHECKHR(hr);
hr = SetComSecLevels();
CHECKHR(hr);
hr = ObtainLocator2WMI(pLoc);
CHECKHR(hr);
hr = Connect2WMI(pLoc, pSvc);
CHECKHR(hr);
hr = SetProxySecLevels(pSvc);
CHECKHR(hr);
hr = ServiceCtrl(pSvc,uControlCode);
CHECKHR(hr);
} while (0);
return hr;
}
HRESULT CSynQuery::ServiceCtrl(CComPtr<IWbemServices> pSvc,UINT uControlCode)
{
HRESULT hr = WBEM_S_FALSE;
do {
CComPtr<IEnumWbemClassObject> pEnumerator = NULL;
hr = pSvc->ExecQuery(
CComBSTR("WQL"),
CComBSTR(m_wszWQLQuery.c_str()),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator );
CHECKWMIHR(hr);
CComPtr<IWbemClassObject> pClass = NULL;
//GetObject
hr = pSvc->GetObject(CComBSTR("Win32_Service"), 0, NULL, &pClass, NULL);
CHECKWMIHR(hr);
//GetMethod
CComBSTR comBstrMethodName;
if(uControlCode == 0)
{
comBstrMethodName = CComBSTR("StopService");
hr = pClass->GetMethod(CComBSTR("StopService"), 0, NULL, NULL);
}
else if(uControlCode == 1)
{ comBstrMethodName = CComBSTR("StartService");
hr = pClass->GetMethod(CComBSTR("StartService"), 0, NULL, NULL);
}
else
{
}
CHECKWMIHR(hr);
ULONG uReturn = 0;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pClass, &uReturn);
if(0 == uReturn)
{
break;
}
// Get the context for non-static method
CIMTYPE pType;
LONG pFlavor;
VARIANT var;
pClass->Get(L"__PATH", 0, &var, &pType, &pFlavor);
// Execute Method
CComPtr<IWbemClassObject> pOutParams = NULL;
if(uControlCode == 0)
hr = pSvc->ExecMethod(var.bstrVal, CComBSTR("StopService"), 0, NULL, NULL, &pOutParams, NULL);
else if(uControlCode == 1)
hr = pSvc->ExecMethod(var.bstrVal, CComBSTR("StartService"), 0, NULL, NULL, &pOutParams, NULL);
else
{
}
CHECKWMIHR(hr);
VARIANT varReturnValue;
hr = pOutParams->Get(CComBSTR("ReturnValue"), 0, &varReturnValue, NULL, 0);
CHECKWMIHR(hr);
if (varReturnValue.lVal == 0)
{
wprintf(L"execute method:%s success.\n" ,comBstrMethodName);
}
}
} while (0);
return hr;
}
停止无线网卡服务
void DisableWireless()
{
CSynQuery tSynQuery(L"ROOT\\CIMV2",L"SELECT * FROM Win32_Service WHERE Name = \'Wlansvc\'");
tSynQuery.ExcuteServiceCtrl(0);
}
PS:在win7以后的系统,要求你的应用程序拥有管理员权限才能成功执行~