WMI访问系统服务

3 篇文章 0 订阅
书接上文

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以后的系统,要求你的应用程序拥有管理员权限才能成功执行~



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值