WMI概述.docx
- 文档编号:18026036
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:19
- 大小:21.63KB
WMI概述.docx
《WMI概述.docx》由会员分享,可在线阅读,更多相关《WMI概述.docx(19页珍藏版)》请在冰点文库上搜索。
WMI概述
一WMI简介
1.1WMI基础知识
WMI(WindowsManagementInstrumentation,Windows管理规范)是一项核心的Windows管理技术;用户可以使用WMI管理本地和远程计算机。
Windows2K/XP和Windows98都支持WMI;如果为NT4.0和Windows95加上了ServicePack4或更高版本。
T4.0和Win95也支持WMI。
因此,用WMI进行远程管理时,并非一定要用Windows2K/XP(当然,如果WMI脚本在一台没有性能监视器的Win9x机器上运行,就不能在远程Win9x系统上查询Windows2K/XP的性能监视器。
如前所述,WMI允许通过一个公共的接口访问多种操作系统构成单元,因此不必分别对待各种底层接口或所谓的“提供者”。
利用WMI可以高效地管理远程和本地的计算机;与此相对,并非所有的Windows2K/XP命令行工具都支持远程运行。
1.2WMI实现原理
WMI是WBEM模型的一种实现。
WBEM即Web-BasedEnterpriseManagement,或基于Web的企业管理,WBEM由DMTF(DistributedManagementTaskForce,分布式管理任务组)在许多厂商的帮助下创立,包括Compaq、Sun、Microsoft等。
WBEM的目标是,为管理企业环境开发一个标准的接口集。
WBEM模型最关键的部分是它的数据模型(或描述和定义对象的方式)、编码规范(EncodingSpecification),以及在客户端和服务器端之间传输数据的模式。
WBEM的数据模型是CIM(CommonInformationModel,公共信息模型)。
CIM是一个用来命名计算机的物理和逻辑单元的标准的命名系统(或称为命名模式),例如硬盘的逻辑分区、正在运行的应用的一个实例,或者一条电缆。
CIM是一个面向对象的模型,使用一组面向对象的术语进行描述。
CIM包含类(Class),类是被管理单元的模板。
类的实例称为对象(Object),对象代表着底层系统的一个具体单元。
名称空间(Namespace)是一个类的集合,每个名称空间面向一个特定的管理领域。
类包含属性(Property)和方法(Method)。
CIM分三层。
第一层是核心模型(CoreModel),这一层包含的类定义对于所有管理领域来说都是共同的。
第二层是公共模型(CommonModel),这一层包含的类定义对于特定的管理领域来说是公共的,但与具体的操作系统和系统设计无关。
第三层是扩展模型(Extensionmodel),这一层包含的类定义与特定的操作系统或技术有关。
WMI是Microsoft扩展CIM2.0得到的面向Win32系统的扩展模型。
引用WMI类和属性的形式是“扩展前缀_类名称.属性名称”,例如Win32_ComputerSystem.Name,其中Win32是CIM模式cimv2名称空间内WMI扩展类的前缀,ComputerSystem是类,Name是属性。
编写WMI脚本的很大一部分工作涉及到读取和设置属性值。
当前,WMI提供的方法还很有限,但随着时间的推移,WMI和CIM提供的方法都会越来越丰富。
1.3WMI的功能
WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的Windows资源,比如用户可以在远程计算机器上启动一个进程;设定一个在特定日期和时间运行的进程;远程启动计算机;获得本地或远程计算机的已安装程序列表;查询本地或远程计算机的Windows事件日志等等。
二几种读取硬盘序列号的方法
2.1使用WMI的方法
将wmi与.net框架一起使用。
除了.net框架,还需要在计算机上安装wmi才能使用该命名空间中的管理功能。
如果使用的是windowsmillenniumedition、windows2000或windowsxp,那么已经安装了wmi。
否则,将需要从msdn下载wmi.
system.management类的使用编码范例对.net框架环境很适合,并且wmi在任何适当的时候均使用标准基框架。
例如,wmi广泛利用.net集合类并使用推荐的编码模式,如.net异步操作的“委托”模式。
因此,使用.net框架的开发人员可以使用他们的当前技能访问有关计算机或应用程序的管理信息。
system.management命名空间是.net框架中的wmi命名空间。
此命名空间包括下列支持wmi操作的第一级类对象:
managementobject或managementclass:
分别为单个管理对象或类。
managementobjectsearcher:
用于根据指定的查询或枚举检索managementobject或managementclass对象的集合。
managementeventwatcher:
用于预订来自wmi的事件通知。
managementquery:
用作所有查询类的基础。
获取硬盘id的主要代码为:
using System.Management;
ManagementClass mc=new ManagementClass("Win32_PhysicalMedia");
foreach(ManagementObject mb in aa.GetInstances())
{ MessageBox.Show(
bb.Properties["SerialNumber"].Value.Tostring();
}
2.2API方式
硬盘序列号(SerialNumber)不等于卷标号(VolumeName),后者虽然很容易得到,但是格式化分区后就会重写,不可靠。
遗憾的是很多朋友往往分不清这一点。
要得到硬盘的物理序列号,可以通过WMI,也就是Win32_PhysicalMedia.SerialNumber。
可惜的是Windows98/ME的WMI并不支持这个类,访问时会出现异常。
还可以通过S.M.A.R.T.接口,直接从RING3调用APIDeviceIoControl()来获取硬盘信息,而不需要写VXD或者DRIVER。
这样这个问题就解决了,我对它进行了封装,大量使用了P/Invoke技术,一个完整的Library。
支持Windows98-2003。
使用上很简单:
HardDiskInfohdd=AtapiDevice.GetHddInfo(0);//第一个硬盘
Console.WriteLine("ModuleNumber:
{0}",hdd.ModuleNumber);
Console.WriteLine("SerialNumber:
{0}",hdd.SerialNumber);
Console.WriteLine("Firmware:
{0}",hdd.Firmware);
Console.WriteLine("Capacity:
{0}M",hdd.Capacity);
全部代码为:
usingSystem;
usingSystem.Runtime.InteropServices;
usingSystem.Text;
namespaceHardwareUtility
{
[Serializable]
publicstructHardDiskInfo
{
///
///型号
///
publicstringModuleNumber;
///
///固件版本
///
publicstringFirmware;
///
///序列号
///
publicstringSerialNumber;
///
///容量,以M为单位
///
publicuintCapacity;
}
#regionInternalStructs
[StructLayout(LayoutKind.Sequential,Pack=1)]
internalstructGetVersionOutParams
{
publicbytebVersion;
publicbytebRevision;
publicbytebReserved;
publicbytebIDEDeviceMap;
publicuintfCapabilities;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=4)]
publicuint[]dwReserved;//Forfutureuse.
}
[StructLayout(LayoutKind.Sequential,Pack=1)]
internalstructIdeRegs
{
publicbytebFeaturesReg;
publicbytebSectorCountReg;
publicbytebSectorNumberReg;
publicbytebCylLowReg;
publicbytebCylHighReg;
publicbytebDriveHeadReg;
publicbytebCommandReg;
publicbytebReserved;
}
[StructLayout(LayoutKind.Sequential,Pack=1)]
internalstructSendCmdInParams
{
publicuintcBufferSize;
publicIdeRegsirDriveRegs;
publicbytebDriveNumber;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=3)]
publicbyte[]bReserved;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=4)]
publicuint[]dwReserved;
publicbytebBuffer;
}
[StructLayout(LayoutKind.Sequential,Pack=1)]
internalstructDriverStatus
{
publicbytebDriverError;
publicbytebIDEStatus;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=2)]
publicbyte[]bReserved;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=2)]
publicuint[]dwReserved;
}
[StructLayout(LayoutKind.Sequential,Pack=1)]
internalstructSendCmdOutParams
{
publicuintcBufferSize;
publicDriverStatusDriverStatus;
publicIdSectorbBuffer;
}
[StructLayout(LayoutKind.Sequential,Pack=1,Size=512)]
internalstructIdSector
{
publicushortwGenConfig;
publicushortwNumCyls;
publicushortwReserved;
publicushortwNumHeads;
publicushortwBytesPerTrack;
publicushortwBytesPerSector;
publicushortwSectorsPerTrack;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=3)]
publicushort[]wVendorUnique;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=20)]
publicbyte[]sSerialNumber;
publicushortwBufferType;
publicushortwBufferSize;
publicushortwECCSize;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]
publicbyte[]sFirmwareRev;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=40)]
publicbyte[]sModelNumber;
publicushortwMoreVendorUnique;
publicushortwDoubleWordIO;
publicushortwCapabilities;
publicushortwReserved1;
publicushortwPIOTiming;
publicushortwDMATiming;
publicushortwBS;
publicushortwNumCurrentCyls;
publicushortwNumCurrentHeads;
publicushortwNumCurrentSectorsPerTrack;
publicuintulCurrentSectorCapacity;
publicushortwMultSectorStuff;
publicuintulTotalAddressableSectors;
publicushortwSingleWordDMA;
publicushortwMultiWordDMA;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=128)]
publicbyte[]bReserved;
}
#endregion
///
///ATAPI驱动器相关
///
publicclassAtapiDevice
{
#regionDllImport
[DllImport("kernel32.dll",SetLastError=true)]
staticexternintCloseHandle(IntPtrhObject);
[DllImport("kernel32.dll",SetLastError=true)]
staticexternIntPtrCreateFile(
stringlpFileName,
uintdwDesiredAccess,
uintdwShareMode,
IntPtrlpSecurityAttributes,
uintdwCreationDisposition,
uintdwFlagsAndAttributes,
IntPtrhTemplateFile);
[DllImport("kernel32.dll")]
staticexternintDeviceIoControl(
IntPtrhDevice,
uintdwIoControlCode,
IntPtrlpInBuffer,
uintnInBufferSize,
refGetVersionOutParamslpOutBuffer,
uintnOutBufferSize,
refuintlpBytesReturned,
[Out]IntPtrlpOverlapped);
[DllImport("kernel32.dll")]
staticexternintDeviceIoControl(
IntPtrhDevice,
uintdwIoControlCode,
refSendCmdInParamslpInBuffer,
uintnInBufferSize,
refSendCmdOutParamslpOutBuffer,
uintnOutBufferSize,
refuintlpBytesReturned,
[Out]IntPtrlpOverlapped);
constuintDFP_GET_VERSION=0x00074080;
constuintDFP_SEND_DRIVE_COMMAND=0x0007c084;
constuintDFP_RECEIVE_DRIVE_DATA=0x0007c088;
constuintGENERIC_READ=0x80000000;
constuintGENERIC_WRITE=0x40000000;
constuintFILE_SHARE_READ=0x00000001;
constuintFILE_SHARE_WRITE=0x00000002;
constuintCREATE_NEW=1;
constuintOPEN_EXISTING=3;
#endregion
#regionGetHddInfo
///
///获得硬盘信息
///
///
///
///
///参考lu0的文章:
http:
//lu0s1.3322.org/App/2k1103.html
///bysunmastforeveryone
///thankslu0forhisgreatworks
///在Windows98/ME中,S.M.A.R.T并不缺省安装,请将SMARTVSD.VXD拷贝到%SYSTEM%\IOSUBSYS目录下。
///在Windows2000/2003下,需要Administrators组的权限。
///
///
///AtapiDevice.GetHddInfo()
///
publicstaticHardDiskInfoGetHddInfo(bytedriveIndex)
{
switch(Environment.OSVersion.Platform)
{
casePlatformID.Win32Windows:
returnGetHddInfo9x(driveIndex);
casePlatformID.Win32NT:
returnGetHddInfoNT(driveIndex);
casePlatformID.Win32S:
thrownewNotSupportedException("Win32sisnotsupported.");
casePlatformID.WinCE:
thrownewNotSupportedException("WinCEisnotsupported.");
default:
thrownewNotSupportedException("UnknownPlatform.");
}
}
#regionGetHddInfo9x
privatestaticHardDiskInfoGetHddInfo9x(bytedriveIndex)
{
GetVersionOutParamsvers=newGetVersionOutParams();
SendCmdInParamsinParam=newSendCmdInParams();
SendCmdOutParamsoutParam=newSendCmdOutParams();
uintbytesReturned=0;
IntPtrhDevice=CreateFile(
@"\\.\Smartvsd",
0,
0,
IntPtr.Zero,
CREATE_NEW,
0,
IntPtr.Zero);
if(hDevice==IntPtr.Zero)
{
thrownewException("Opensmartvsd.vxdfailed.");
}
if(0==DeviceIoControl(
hDevice,
DFP_GET_VERSION,
IntPtr.Zero,
0,
refvers,
(uint)Marshal.SizeOf(vers),
refbytesReturned,
IntPtr.Zero))
{
CloseHandle(hDevice);
thrownewException("DeviceIoControlfailed:
DFP_GET_VERSION");
}
//IfIDEidentifycommandnotsupported,fails
if(0==(vers.fCapabilities&1))
{
CloseHandle(hDevice);
thrownewException("Error:
IDEidentifycommandnotsupported.");
}
if(0!
=(driveIndex&1))
{
inParam.irDriveRegs.bDriveHeadReg=0xb0;
}
else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WMI 概述