C 中的ManagementClass类

ManagementClass是一种在C中使用的类,它可以用于管理和控制操作系统和应用程序的各种资源。它是Microsoft Windows Management Instrumentation (WMI) API 的一部分,可以使用WMI API实现对Windows操作系统的远程管理。下面我们来详细介绍一下ManagementClass类的使用方法、案例及其作用。

一、使用方法

1. 引用命名空间

在C++中使用ManagementClass之前,需要在程序中先引用相关的命名空间,如下所示:

```

#include

#include

#include

#include

#include

#pragma comment(lib, "wbemuuid.lib")

using namespace std;

```

2. 创建ManagementClass对象

创建ManagementClass对象的方式如下所示:

```

IWbemServices *pSvc = NULL; // 连接到WMI的服务

IWbemLocator *pLoc = NULL; // WMI locator对象

HRESULT hResult = NULL;

hResult = CoInitializeEx(0, COINIT_MULTITHREADED);

if (FAILED(hResult))

{

cout << "CoInitializeEx failed, hResult=" << hResult << endl;

return 1;

}

hResult = CoInitializeSecurity(NULL,

-1,

NULL,

NULL,

RPC_C_AUTHN_LEVEL_DEFAULT,

RPC_C_IMP_LEVEL_IMPERSONATE,

NULL,

EOAC_NONE,

NULL);

if (FAILED(hResult))

{

cout << "CoInitializeSecurity failed, hResult=" << hResult << endl;

CoUninitialize();

return 1;

}

hResult = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);

if (FAILED(hResult))

{

cout << "CoCreateInstance failed, hResult=" << hResult << endl;

CoUninitialize();

return 1;

}

hResult = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);

if (FAILED(hResult))

{

cout << "pLoc->ConnectServer failed, hResult=" << hResult << endl;

pLoc->Release();

CoUninitialize();

return 1;

}

// 设置安全

hResult = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL,

RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);

if (FAILED(hResult))

{

cout << "CoSetProxyBlanket failed, hResult=" << hResult << endl;

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

// 创建ManagementClass对象

IWbemClassObject *pClass = NULL;

hResult = pSvc->GetObject(_bstr_t(L"Win32_OperatingSystem"), 0, NULL, &pClass, NULL);

if (FAILED(hResult))

{

cout << "pSvc->GetObject failed, hResult=" << hResult << endl;

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

IWbemClassObject *pOutParams = NULL;

hResult = pClass->GetMethod(_bstr_t(L"Win32_Shutdown"), 0, NULL, &pOutParams);

if (FAILED(hResult))

{

cout << "pClass->GetMethod failed, hResult=" << hResult << endl;

pClass->Release();

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

```

上述代码创建了一个ManagementClass对象,并定义了一个名为“Win32_OperatingSystem”的类,它表示Windows操作系统。代码中还定义了一个名为“Win32_Shutdown”的方法,它是在类“Win32_OperatingSystem”中定义的方法。

3. 使用ManagementClass对象

创建并定义了ManagementClass对象之后,可以使用该对象来获取或设置资源属性、执行方法等。下面是一些使用ManagementClass对象的例子。

- 获取Windows操作系统的版本信息

```

IWbemClassObject *pClass = NULL;

IWbemClassObject *pClassInstance = NULL;

HRESULT hResult = pSvc->GetObject(_bstr_t(L"Win32_OperatingSystem"), 0, NULL, &pClass, NULL);

if (FAILED(hResult))

{

cout << "pSvc->GetObject failed, hResult=" << hResult << endl;

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

hResult = pClass->SpawnInstance(0, &pClassInstance);

if (FAILED(hResult))

{

cout << "pClass->SpawnInstance failed, hResult=" << hResult << endl;

pClass->Release();

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

VARIANT vtProp;

hResult = pClassInstance->Get(L"Caption", 0, &vtProp, 0, 0);

wcout << vtProp.bstrVal << endl;

VariantClear(&vtProp);

```

- 获取CPU信息

```

IWbemClassObject *pClass = NULL;

IWbemClassObject *pClassInstance = NULL;

HRESULT hResult = pSvc->GetObject(_bstr_t(L"Win32_Processor"), 0, NULL, &pClass, NULL);

if (FAILED(hResult))

{

cout << "pSvc->GetObject failed, hResult=" << hResult << endl;

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

hResult = pClass->SpawnInstance(0, &pClassInstance);

if (FAILED(hResult))

{

cout << "pClass->SpawnInstance failed, hResult=" << hResult << endl;

pClass->Release();

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

VARIANT vtProp;

hResult = pClassInstance->Get(L"Name", 0, &vtProp, 0, 0);

wcout << vtProp.bstrVal << endl;

VariantClear(&vtProp);

```

- 执行Windows操作系统的关机操作

```

IWbemClassObject *pInParams = NULL;

hResult = pOutParams->SpawnInstance(0, &pInParams);

if (FAILED(hResult))

{

cout << "pOutParams->SpawnInstance failed, hResult=" << hResult << endl;

pOutParams->Release();

pClass->Release();

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

hResult = pInParams->Put(L"Flags", 0, &vtProp, 0);

if (FAILED(hResult))

{

cout << "pInParams->Put failed, hResult=" << hResult << endl;

pInParams->Release();

pOutParams->Release();

pClass->Release();

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

hResult = pSvc->ExecMethod(_bstr_t(L"Win32_OperatingSystem"), _bstr_t(L"Win32_Shutdown"), 0, NULL, pInParams, NULL, NULL);

if (FAILED(hResult))

{

cout << "pSvc->ExecMethod failed, hResult=" << hResult << endl;

pInParams->Release();

pOutParams->Release();

pClass->Release();

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

pOutParams->Release();

pInParams->Release();

pClass->Release();

pSvc->Release();

pLoc->Release();

CoUninitialize();

```

二、案例说明

1. 获取Windows版本信息

下面是一个获取Windows版本信息的例子,该例子使用了ManagementClass类。

```

#include

#include

#include

#include

#include

#pragma comment(lib, "wbemuuid.lib")

using namespace std;

int main()

{

IWbemServices *pSvc = NULL; // 连接到WMI的服务

IWbemLocator *pLoc = NULL; // WMI locator对象

HRESULT hResult = NULL;

hResult = CoInitializeEx(0, COINIT_MULTITHREADED);

if (FAILED(hResult))

{

cout << "CoInitializeEx failed, hResult=" << hResult << endl;

return 1;

}

hResult = CoInitializeSecurity(NULL,

-1,

NULL,

NULL,

RPC_C_AUTHN_LEVEL_DEFAULT,

RPC_C_IMP_LEVEL_IMPERSONATE,

NULL,

EOAC_NONE,

NULL);

if (FAILED(hResult))

{

cout << "CoInitializeSecurity failed, hResult=" << hResult << endl;

CoUninitialize();

return 1;

}

hResult = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);

if (FAILED(hResult))

{

cout << "CoCreateInstance failed, hResult=" << hResult << endl;

CoUninitialize();

return 1;

}

hResult = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);

if (FAILED(hResult))

{

cout << "pLoc->ConnectServer failed, hResult=" << hResult << endl;

pLoc->Release();

CoUninitialize();

return 1;

}

// 设置安全

hResult = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL,

RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);

if (FAILED(hResult))

{

cout << "CoSetProxyBlanket failed, hResult=" << hResult << endl;

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

// 创建ManagementClass对象

IWbemClassObject *pClass = NULL;

IWbemClassObject *pClassInstance = NULL;

hResult = pSvc->GetObject(_bstr_t(L"Win32_OperatingSystem"), 0, NULL, &pClass, NULL);

if (FAILED(hResult))

{

cout << "pSvc->GetObject failed, hResult=" << hResult << endl;

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

hResult = pClass->SpawnInstance(0, &pClassInstance);

if (FAILED(hResult))

{

cout << "pClass->SpawnInstance failed, hResult=" << hResult << endl;

pClass->Release();

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

VARIANT vtProp;

hResult = pClassInstance->Get(L"Caption", 0, &vtProp, 0, 0);

if (SUCCEEDED(hResult))

{

wcout << vtProp.bstrVal << endl;

VariantClear(&vtProp);

}

pClassInstance->Release();

pClass->Release();

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 0;

}

```

2. 获取CPU信息

下面是一个获取CPU信息的例子,该例子使用了ManagementClass类。

```

#include

#include

#include

#include

#include

#pragma comment(lib, "wbemuuid.lib")

using namespace std;

int main()

{

IWbemServices *pSvc = NULL; // 连接到WMI的服务

IWbemLocator *pLoc = NULL; // WMI locator对象

HRESULT hResult = NULL;

hResult = CoInitializeEx(0, COINIT_MULTITHREADED);

if (FAILED(hResult))

{

cout << "CoInitializeEx failed, hResult=" << hResult << endl;

return 1;

}

hResult = CoInitializeSecurity(NULL,

-1,

NULL,

NULL,

RPC_C_AUTHN_LEVEL_DEFAULT,

RPC_C_IMP_LEVEL_IMPERSONATE,

NULL,

EOAC_NONE,

NULL);

if (FAILED(hResult))

{

cout << "CoInitializeSecurity failed, hResult=" << hResult << endl;

CoUninitialize();

return 1;

}

hResult = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);

if (FAILED(hResult))

{

cout << "CoCreateInstance failed, hResult=" << hResult << endl;

CoUninitialize();

return 1;

}

hResult = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);

if (FAILED(hResult))

{

cout << "pLoc->ConnectServer failed, hResult=" << hResult << endl;

pLoc->Release();

CoUninitialize();

return 1;

}

// 设置安全

hResult = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL,

RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);

if (FAILED(hResult))

{

cout << "CoSetProxyBlanket failed, hResult=" << hResult << endl;

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

// 创建ManagementClass对象

IWbemClassObject *pClass = NULL;

IWbemClassObject *pClassInstance = NULL;

hResult = pSvc->GetObject(_bstr_t(L"Win32_Processor"), 0, NULL, &pClass, NULL);

if (FAILED(hResult))

{

cout << "pSvc->GetObject failed, hResult=" << hResult << endl;

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

hResult = pClass->SpawnInstance(0, &pClassInstance);

if (FAILED(hResult))

{

cout << "pClass->SpawnInstance failed, hResult=" << hResult << endl;

pClass->Release();

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 1;

}

VARIANT vtProp;

hResult = pClassInstance->Get(L"Name", 0, &vtProp, 0, 0);

if (SUCCEEDED(hResult))

{

wcout << vtProp.bstrVal << endl;

VariantClear(&vtProp);

}

pClassInstance->Release();

pClass->Release();

pSvc->Release();

pLoc->Release();

CoUninitialize();

return 0;

}

```

三、作用

ManagementClass类是使用WMI API进行Windows操作系统的远程管理的关键之一。使用ManagementClass类,可以轻松地获取和设置Windows操作系统或应用程序的各种属性和配置,以及执行各种功能,如关机、重启、查询系统事件等。在Windows系统管理、网络管理、安全管理等领域,ManagementClass类都是非常实用的工具。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(13) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部