求VC版本如何利用WMI获得磁盘信息 VC/MFC / 进程/线程/DLL - 社区 community.csdn.net
2008-10-12 23:33
856 查看
导读:
WMI使用技巧集
很多的朋友对WMI可能见过但理解不深,我也是十分想了解关于WMI的知识,可一直找不对太合适的资料,在网上的一些资料不是有很多错误,就是讲解不清,我有空的时候将关于WMI的知识集中一下,放在这里便于大家学习。本贴会不断增加。
1、 什么是WMI
WMI是英文Windows Management Instrumentation的简写,它的功能主要是:访问本地主机的一些信息和服务,可以管理远程计算机(当然你必须要拥有足够的权限),比如:重启,关机,关闭进程,创建进程等。
2、 如何用WMI获得本地磁盘的信息?
首先要在VS.NET中创建一个项目,然后在添加引用中引用一个.net的装配件:System.Management.dll,这样你的项目才能使用WMI。代码如下:
using System;
using System.Management;
class Sample_ManagementObject
{
public static int Main(string[] args)
{
SelectQuery query=new SelectQuery("Select * From Win32_LogicalDisk");
ManagementObjectSearcher searcher=new ManagementObjectSearcher(query);
foreach(ManagementBaseObject disk in searcher.Get())
{
Console.WriteLine("/r/n"+disk["Name"] +" "+disk["DriveType"] + " " + disk["VolumeName"]);
}
Console.ReadLine();
return 0;
}
}
disk["DriveType"] 的返回值意义如下:
1 No type
2 Floppy disk
3 Hard disk
4 Removable drive or network drive
5 CD-ROM
6 RAM disk
3、如何用WMI获得指定磁盘的容量?
using System;
using System.Management;
// This example demonstrates reading a property of a ManagementObject.
class Sample_ManagementObject
{
public static int Main(string[] args)
{
ManagementObject disk = new ManagementObject(
"win32_logicaldisk.deviceid=/"c:/"");
disk.Get();
Console.WriteLine("Logical Disk Size = " + disk["Size"] + " bytes");
Console.ReadLine();
return 0;
}
}Top
vc6中使用比较的方法资料很少Top
Top
http://www.codeguru.com/Cpp/W-P/system/misc/article.php/c5675/
另外98的wmi下载
http://www.lingbo.cn/download.asp
wmi9x.exe
Top
foreach(ManagementBaseObject disk in searcher.Get())
{
Top
//tested by onega VC20003,windows 2003
#include "stdafx.h"
#define _WIN32_DCOM
#include
using namespace std;
#include
#include
#include
# pragma comment(lib, "wbemuuid.lib")
struct InitOle
{
InitOle()
{
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
}
~InitOle() { ::CoUninitialize(); }
HRESULT hres;
} _init_InitOle_;
HRESULT PrintObject(IWbemClassObject* spInstance)
{
if(!spInstance)
return S_OK;
std::cout<<__FUNCTION__<<" start " WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY,
NULL,
&psa);
long lLower, lUpper;
SafeArrayGetLBound(psa , 1, &lLower);
SafeArrayGetUBound(psa , 1, &lUpper);
for (long i = lLower; i <= lUpper; ++i)
{
CComBSTR bstrPropName;
if (S_OK != (hres = SafeArrayGetElement(psa, &i, &bstrPropName)) )
{
if (NULL != psa)
SafeArrayDestroy(psa);
return hres;
}
//if(bstrPropName!="name")
// continue;
std::cout<<" "<<(LPCTSTR)_bstr_t(bstrPropName);
_variant_t varProperty;
HRESULT hr = spInstance->Get(bstrPropName,0,&varProperty,NULL,0);
std::cout<<" = ";
if(varProperty.vt !=VT_EMPTY && VT_NULL != varProperty.vt)
{
_variant_t vDest;
hr = VariantChangeType(&vDest, &varProperty,0,VT_BSTR);
if(SUCCEEDED(hr))
std::cout<< (LPCTSTR)_bstr_t(varProperty);
else
{
if(varProperty.vt == (VT_ARRAY|VT_I4))
{
SAFEARRAY* psa = varProperty.parray;
int *pIntArray = NULL;
SafeArrayAccessData(psa,(VOID**)&pIntArray);
UINT uDim = SafeArrayGetDim(psa);
if(1==uDim)
{
long lLbound,lRbound;
SafeArrayGetLBound(psa,1,&lLbound);
SafeArrayGetUBound(psa,1,&lRbound);
for(long i=lLbound;i<=lRbound;i++)
{
std::cout<< pIntArray[i]<<" ";
}
}
SafeArrayUnaccessData(psa);
}
else
{
std::cout<< varProperty.vt << " type ";
}
}
}
else
{
if(varProperty.vt == VT_EMPTY)
std::cout<< "VT_EMPTY ";
else
std::cout<< "VT_NULL";
}
std::cout<& pSvc,_bstr_t classname)
{
// Step 6: --------------------------------------------------
// Use the IWbemServices pointer to make requests of WMI ----
_bstr_t wmi_query_str("SELECT * FROM ");
wmi_query_str +=classname;
CComPtr pEnumerator;//IEnumWbemClassObject* pEnumerator = NULL;
HRESULT hres = pSvc->ExecQuery(
bstr_t("WQL"),
wmi_query_str,
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
cout << "Query for "<<(LPCSTR)classname<<" failed."
<< " Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
// Step 7: -------------------------------------------------
// Get the data from the query in step 6 -------------------
ULONG uReturn = 0;
while (pEnumerator)
{
CComPtr pclsObj;//IWbemClassObject *pclsObj;
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if(0 == uReturn)
{
break;
}
PrintObject(pclsObj);
}
return 0;
}
int main(int argc, char **argv)
{
HRESULT hres = S_OK;
if (FAILED(_init_InitOle_.hres))
{
cout << "Failed to initialize COM library. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
// Step 2: --------------------------------------------------
// Set general COM security levels --------------------------
// Note: If you are using Windows 2000, you need to specify -
// the default authentication credentials for a user by using
// a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
// parameter of CoInitializeSecurity ------------------------
hres = CoInitializeSecurity(
NULL,
-1, // COM authentication
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres))
{
cout << "Failed to initialize security. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
// Step 3: ---------------------------------------------------
// Obtain the initial locator to WMI -------------------------
CComPtr pLoc;//IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hres))
{
cout << "Failed to create IWbemLocator object."
<< " Err code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
// Step 4: -----------------------------------------------------
// Connect to WMI through the IWbemLocator::ConnectServer method
CComPtr pSvc;//IWbemServices *pSvc = NULL;
// Connect to the root/cimv2 namespace with
// the current user and obtain pointer pSvc
// to make IWbemServices calls.
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT//CIMV2"), // Object path of WMI namespace
NULL, // User name. NULL = current user
NULL, // User password. NULL = current
0, // Locale. NULL indicates current
NULL, // Security flags.
0, // Authority (e.g. Kerberos)
0, // Context object
&pSvc // pointer to IWbemServices proxy
);
if (FAILED(hres))
{
cout << "Could not connect. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
cout << "Connected to ROOT//CIMV2 WMI namespace" << endl;
// Step 5: --------------------------------------------------
// Set security levels on the proxy -------------------------
hres = CoSetProxyBlanket(
pSvc, // Indicates the proxy to set
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // client identity
EOAC_NONE // proxy capabilities
);
if (FAILED(hres))
{
cout << "Could not set proxy blanket. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
get_wmi_info(pSvc,"Win32_NetworkAdapter");
return 0; // Program successfully completed.
}Top
本文转自
http://www.80diy.com/home/20050325/16/3881377.html
WMI使用技巧集
很多的朋友对WMI可能见过但理解不深,我也是十分想了解关于WMI的知识,可一直找不对太合适的资料,在网上的一些资料不是有很多错误,就是讲解不清,我有空的时候将关于WMI的知识集中一下,放在这里便于大家学习。本贴会不断增加。
1、 什么是WMI
WMI是英文Windows Management Instrumentation的简写,它的功能主要是:访问本地主机的一些信息和服务,可以管理远程计算机(当然你必须要拥有足够的权限),比如:重启,关机,关闭进程,创建进程等。
2、 如何用WMI获得本地磁盘的信息?
首先要在VS.NET中创建一个项目,然后在添加引用中引用一个.net的装配件:System.Management.dll,这样你的项目才能使用WMI。代码如下:
using System;
using System.Management;
class Sample_ManagementObject
{
public static int Main(string[] args)
{
SelectQuery query=new SelectQuery("Select * From Win32_LogicalDisk");
ManagementObjectSearcher searcher=new ManagementObjectSearcher(query);
foreach(ManagementBaseObject disk in searcher.Get())
{
Console.WriteLine("/r/n"+disk["Name"] +" "+disk["DriveType"] + " " + disk["VolumeName"]);
}
Console.ReadLine();
return 0;
}
}
disk["DriveType"] 的返回值意义如下:
1 No type
2 Floppy disk
3 Hard disk
4 Removable drive or network drive
5 CD-ROM
6 RAM disk
3、如何用WMI获得指定磁盘的容量?
using System;
using System.Management;
// This example demonstrates reading a property of a ManagementObject.
class Sample_ManagementObject
{
public static int Main(string[] args)
{
ManagementObject disk = new ManagementObject(
"win32_logicaldisk.deviceid=/"c:/"");
disk.Get();
Console.WriteLine("Logical Disk Size = " + disk["Size"] + " bytes");
Console.ReadLine();
return 0;
}
}Top
3 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-03-25 18:22:18 得分 0
C#等对WMI支持比较好,使用也方便,vc6中使用比较的方法资料很少Top
4 楼gooyan(超级替补)回复于 2005-03-28 09:41:13 得分 0
问一下,win98能支持WMI吗?我看有的人说支持,也有人说不支持Top5 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-03-28 10:26:49 得分 15
WMI基本是独立于系统的,在某些系统中默认包含WMI,其他系统需要安装WMI支持。Top
6 楼keiy()回复于 2005-03-28 10:52:09 得分 15
VC的例子http://www.codeguru.com/Cpp/W-P/system/misc/article.php/c5675/
另外98的wmi下载
http://www.lingbo.cn/download.asp
wmi9x.exe
Top
7 楼goodheartppl(goodheart)回复于 2005-03-28 13:11:14 得分 5
ManagementObjectSearcher searcher=new ManagementObjectSearcher(query);foreach(ManagementBaseObject disk in searcher.Get())
{
Top
8 楼masterz(www.fruitfruit.com)回复于 2005-04-13 18:04:49 得分 30
// Get WMI information.//tested by onega VC20003,windows 2003
#include "stdafx.h"
#define _WIN32_DCOM
#include
using namespace std;
#include
#include
#include
# pragma comment(lib, "wbemuuid.lib")
struct InitOle
{
InitOle()
{
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
}
~InitOle() { ::CoUninitialize(); }
HRESULT hres;
} _init_InitOle_;
HRESULT PrintObject(IWbemClassObject* spInstance)
{
if(!spInstance)
return S_OK;
std::cout<<__FUNCTION__<<" start "
NULL,
&psa);
long lLower, lUpper;
SafeArrayGetLBound(psa , 1, &lLower);
SafeArrayGetUBound(psa , 1, &lUpper);
for (long i = lLower; i <= lUpper; ++i)
{
CComBSTR bstrPropName;
if (S_OK != (hres = SafeArrayGetElement(psa, &i, &bstrPropName)) )
{
if (NULL != psa)
SafeArrayDestroy(psa);
return hres;
}
//if(bstrPropName!="name")
// continue;
std::cout<<" "<<(LPCTSTR)_bstr_t(bstrPropName);
_variant_t varProperty;
HRESULT hr = spInstance->Get(bstrPropName,0,&varProperty,NULL,0);
std::cout<<" = ";
if(varProperty.vt !=VT_EMPTY && VT_NULL != varProperty.vt)
{
_variant_t vDest;
hr = VariantChangeType(&vDest, &varProperty,0,VT_BSTR);
if(SUCCEEDED(hr))
std::cout<< (LPCTSTR)_bstr_t(varProperty);
else
{
if(varProperty.vt == (VT_ARRAY|VT_I4))
{
SAFEARRAY* psa = varProperty.parray;
int *pIntArray = NULL;
SafeArrayAccessData(psa,(VOID**)&pIntArray);
UINT uDim = SafeArrayGetDim(psa);
if(1==uDim)
{
long lLbound,lRbound;
SafeArrayGetLBound(psa,1,&lLbound);
SafeArrayGetUBound(psa,1,&lRbound);
for(long i=lLbound;i<=lRbound;i++)
{
std::cout<< pIntArray[i]<<" ";
}
}
SafeArrayUnaccessData(psa);
}
else
{
std::cout<< varProperty.vt << " type ";
}
}
}
else
{
if(varProperty.vt == VT_EMPTY)
std::cout<< "VT_EMPTY ";
else
std::cout<< "VT_NULL";
}
std::cout<& pSvc,_bstr_t classname)
{
// Step 6: --------------------------------------------------
// Use the IWbemServices pointer to make requests of WMI ----
_bstr_t wmi_query_str("SELECT * FROM ");
wmi_query_str +=classname;
CComPtr pEnumerator;//IEnumWbemClassObject* pEnumerator = NULL;
HRESULT hres = pSvc->ExecQuery(
bstr_t("WQL"),
wmi_query_str,
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
cout << "Query for "<<(LPCSTR)classname<<" failed."
<< " Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
// Step 7: -------------------------------------------------
// Get the data from the query in step 6 -------------------
ULONG uReturn = 0;
while (pEnumerator)
{
CComPtr pclsObj;//IWbemClassObject *pclsObj;
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if(0 == uReturn)
{
break;
}
PrintObject(pclsObj);
}
return 0;
}
int main(int argc, char **argv)
{
HRESULT hres = S_OK;
if (FAILED(_init_InitOle_.hres))
{
cout << "Failed to initialize COM library. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
// Step 2: --------------------------------------------------
// Set general COM security levels --------------------------
// Note: If you are using Windows 2000, you need to specify -
// the default authentication credentials for a user by using
// a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
// parameter of CoInitializeSecurity ------------------------
hres = CoInitializeSecurity(
NULL,
-1, // COM authentication
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres))
{
cout << "Failed to initialize security. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
// Step 3: ---------------------------------------------------
// Obtain the initial locator to WMI -------------------------
CComPtr pLoc;//IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hres))
{
cout << "Failed to create IWbemLocator object."
<< " Err code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
// Step 4: -----------------------------------------------------
// Connect to WMI through the IWbemLocator::ConnectServer method
CComPtr pSvc;//IWbemServices *pSvc = NULL;
// Connect to the root/cimv2 namespace with
// the current user and obtain pointer pSvc
// to make IWbemServices calls.
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT//CIMV2"), // Object path of WMI namespace
NULL, // User name. NULL = current user
NULL, // User password. NULL = current
0, // Locale. NULL indicates current
NULL, // Security flags.
0, // Authority (e.g. Kerberos)
0, // Context object
&pSvc // pointer to IWbemServices proxy
);
if (FAILED(hres))
{
cout << "Could not connect. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
cout << "Connected to ROOT//CIMV2 WMI namespace" << endl;
// Step 5: --------------------------------------------------
// Set security levels on the proxy -------------------------
hres = CoSetProxyBlanket(
pSvc, // Indicates the proxy to set
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // client identity
EOAC_NONE // proxy capabilities
);
if (FAILED(hres))
{
cout << "Could not set proxy blanket. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
get_wmi_info(pSvc,"Win32_NetworkAdapter");
return 0; // Program successfully completed.
}Top
本文转自
http://www.80diy.com/home/20050325/16/3881377.html
相关文章推荐
- 重大问题:怎样动态维护socket连接! VC-MFC - 基础类 - CSDN社区 community.csdn.net
- 求教:AfxEnableControlContainer(); VC/MFC / 基础类 - CSDN社区 community.csdn.net
- 工作区的RESOURCES提示载入失败? VC/MFC / Visual C++ 资源 - CSDN社区 community.csdn.net
- 在sqlserver中如何对text类型的数据进行replace操作。 MS-SQL Server / 基础类 - CSDN社区 community.csdn.net
- VC中利用动态链接库工程生成dll和lib文件http://blog.csdn.net/li_canhui/article/details/6775918
- vc mfc代码中获得程序资源中版本信息的方法
- vc mfc代码中获得程序资源中版本信息的方法
- 若用MASM写操作系统的启动部分如何实现? 其他开发语言 / 汇编语言 - CSDN社区 community.csdn.net
- 如何将浮动的DIV位置一直居中?~ Web 开发 / ASP - CSDN社区 community.csdn.net
- 用于运行 ASP.NET 的进程帐户必须具有对 IIS 元数据库(如 IIS://servername/W3SVC)的读访问权。有关如何修改元数据库权限的信息,请参见...
- vc操作wmi遍历进程信息
- K:利用System.getProperties()方法获得的虚拟机进程的信息
- 通过WMI获取系统.进程.CPU.磁盘.分区.网卡.主板.内存.显卡.共享.键盘.鼠标等信息
- VC++ MFC中如何将应用程序的配置信息保存到注册表中(二)
- NET(C#)使用WMI事件查询实现对进程和可移动磁盘的监控
- ASP.NET中如何获得当前已登录用户的Email信息呢?
- VC 利用DLL共享区间在进程间共享数据及进程间广播消息
- 在.Net Framework中获得Windows目录、机器名、操作系统版本信息等系统环境信息
- 在VC中如何获得USB设备的Product ID,Vendor ID等信息
- 如何使用WMI获取进程信息