📄 8.3 windows management instrumentation.htm
字号:
<TD vAlign=top>
<TABLE cellSpacing=0 cellPadding=10 align=left border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE>
<DIV class=content id=ArticleBody
style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
<P class=content>
<TABLE style="LINE-HEIGHT: 25px" border=0>
<TBODY style="LINE-HEIGHT: 25px">
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px" align=middle><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2><FONT style="LINE-HEIGHT: 25px" face=arial
color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 图8-7 </B></FONT>编译TimeServiceStart.mof档后,显示在CIM
Studio中的Richter_TimeServiceProvider类别</FONT></TD></TR></TBODY></TABLE>
<CENTER></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在Welcome对话方块中,按下Next开始执行精灵。在下一个对话方块新增适当的文字到Description文字方块中。然后检查Override
Inherited
Properties核取方块,并在属性清单中核取名称属性,以使提供者从基础类别覆写。您必须覆写名称属性,因为它用物件管理者决定是否经由被取得之提供者供应您提供之符合实例的属性。对话方块看起来应该像图8-8的内容(请注意您可能无法看到核取的名称属性)。</FONT></P>
<P><BR style="LINE-HEIGHT: 25px"> </P>
<CENTER style="LINE-HEIGHT: 25px">
<P><INPUT id=8 style="LINE-HEIGHT: 25px" type=image height=408
width=555 src="8.3 Windows Management Instrumentation.files/8-8.gif"
border=0 onclick="imgclick"></P></CENTER>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE style="LINE-HEIGHT: 25px" border=0>
<TBODY style="LINE-HEIGHT: 25px">
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px" align=middle><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2><FONT style="LINE-HEIGHT: 25px" face=arial
color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 图8-8 </B></FONT>用来指定名称与属性的WMI
Provider Code
Generator精灵对话方块</FONT></TD></TR></TBODY></TABLE></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>按下Next按钮以显示如图8-9所示之对话方块。您可以用这个对话方块给予提供者DLL一个文件名称和说明,以及指定您想存放产生程序代码的目录。按下Finish按钮即可产生提供者的原始程序代码。精灵会产生六个文件:MAINDLL.cpp、Richter_TimeServiceProvider.cpp、Richter_TimeServiceProvider.h、TimeServiceProvider.def、TimeServiceProvider.mak以及TimeServiceProvider.mof。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">修改精灵产生的程序代码<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您还需要对已产生的程序代码做些修正,该程序代码才可以正确执行。在预设的情形下,TimeServiceProvider类别会被放置在root\default命名空间内。您必须在TimeServiceProvider.mof的上方加入以下的Pragma,以使它成为root\CIMV2命名空间的一部份。</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">#pragma namespace("\\\\.\\root\\cimv2")</PRE></FONT></DIV>
<P><BR style="LINE-HEIGHT: 25px"> </P>
<CENTER style="LINE-HEIGHT: 25px">
<P><INPUT id=9 style="LINE-HEIGHT: 25px" type=image height=408
width=555 src="8.3 Windows Management Instrumentation.files/8-9.gif"
border=0 onclick="imgclick"></P></CENTER>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE style="LINE-HEIGHT: 25px" border=0>
<TBODY style="LINE-HEIGHT: 25px">
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px" align=middle><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2><FONT style="LINE-HEIGHT: 25px" face=arial
color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 图8-9 </B></FONT>用来指定提供者之文件名称、说明以及输出目录的WMI
Provider Code Generator精灵</FONT></TD></TR></TBODY></TABLE></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>将TimeServiceProvider.mof与TimeServiceStart.mof文件结合会使提供者的部署工作更方便。我附加了TimeServiceStart.mof的内容至被精灵产生之TimeServiceProvider.mof文件的底部,还新增了以下几行程序,以使WinMgmt服务察觉这个动态地产生的类别属性值。列表8-2显示经过修改后的TimeServiceProvider.mof文件内容。</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">[provider("TimeServiceProvider"), dynamic]</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>现在让我们集中在Richter_TimeServiceProvider.cpp文件上,在它可以使用前必须做些修改。首先寻找这一行程序:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">CRichter_TimeServiceProvider MyRichter_TimeServiceProviderSet<BR> (PROVIDER_NAME_RICHTER_TIMESERVICEPROVIDER, L"NameSpace");</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>以适当的命名空间取代NameSpace:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">CRichter_TimeServiceProvider MyRichter_TimeServiceProviderSet<BR> (PROVIDER_NAME_RICHTER_TIMESERVICEPROVIDER, L"root\\cimv2");</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>第二,修改EnumerateInstances函数,使它回传正确的属性值。对TimeService服务来说,这是非当容易的,因为它只有一个属性,即匿名管道的名称。以下的程序代码说明了EnumerateInstances函数修改后看起来的样子。</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">HRESULT CRichter_TimeServiceProvider::EnumerateInstances ( <BR> MethodContext* pMethodContext,long lFlags ){ <BR> HRESULT hRes = WBEM_S_NO_ERROR; <BR> // 基于被传递进来的MethodContext建立一个新的实例 <BR> // 注意到CreateNewInstance可能会被丢出,但是它永远不会回传NULL <BR> CInstance* pInstance = CreateNewInstance(pMethodContext); <BR> // 类别名称必须符合服务的程序设计名称 <BR> pInstance->SetCHString(pName, <BR> "Programming Server-Side Applications Time"); <BR> pInstance->SetCHString(pPipeName, "TimeService"); <BR> hRes = pInstance->Commit(); <BR> pInstance->Release(); <BR> return(hRes); <BR>}</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>第叁,您必须修改GetObject函数,让它回传一个给定的资料。对一个服务来说,修改这个函数是很容易的,因为在每个被给定时间的机器上,它是唯一的一个服务实例。以下的程序代码说明GetObject函数修改后的样子。列表8-1显示了Richter_TimeServiceProvider.cpp文件内容。</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">HRESULT CRichter_TimeServiceProvider::GetObject (CInstance* pInstance, <BR> long lFlags) <BR>{ <BR> HRESULT hr = WBEM_E_NOT_FOUND; <BR> // 类别名称必须与服务的程序设计名称相符 <BR> pInstance->SetCHString(pName, <BR> "Programming Server-Side Applications Time"); <BR> pInstance->SetCHString(pPipeName, "TimeService"); <BR> hr = WBEM_S_NO_ERROR; <BR> return(hr); <BR>}</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">建构TimeServiceProvider范例<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>为了建构提供者DLL,我用Visual Studio建立了一个空的Win32 Dynamic-Link
Library专案,接着加入MAINDLL.cpp、Richter_TimeServiceProvider.cpp、Richter_TimeServiceProvider.h以及TimeServiceProvider.def文件至专案中。您必须记得连结FrameDyn.lib程序库(由WMI
SDK提供)。透过以下这行放置在Richter_TimeServiceProvider.cpp文件中的程序代码来确定对程序库的连结:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">#pragma comment(lib, "FrameDyn.lib")</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>最后,我为此专案的Debug Build和Release Build加入了USE_POLARITY符号。在Project
Settings对话方块的C/C++ 页签上可以完成这个动作,如图8-10所示。您可能想用Warning level
3的设定来编译文件,因为若使用Warning level 4设定来编译文件时,标头文件架构会产生很多警告讯息。</FONT></P>
<P><BR style="LINE-HEIGHT: 25px"> </P>
<CENTER style="LINE-HEIGHT: 25px">
<P><INPUT id=10 style="LINE-HEIGHT: 25px" type=image height=402
width=610
src="8.3 Windows Management Instrumentation.files/8-10.gif" border=0
onclick="imgclick"></P></CENTER>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE style="LINE-HEIGHT: 25px" border=0>
<TBODY style="LINE-HEIGHT: 25px">
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px" align=middle><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2><FONT style="LINE-HEIGHT: 25px" face=arial
color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 图8-10 </B></FONT>加入符号以及设定文件警告层的C/C++
页签</FONT></TD></TR></TBODY></TABLE></CENTER>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">部署TimeServiceProvider范例<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您必须执行MOF
Compiler,传递TimeServiceProvider.mof文件,以部署提供者。这会使WinMgmt服务察觉WMI类别提供者的资讯。接下来您要执行RegSvr32,传递「08
Time-ServiceProvider.dll」文件给它。最后,您必须确定TimeService服务(显示名称为「Programming
Server-Side Applications
Time」)已经被安装在机器上。请注意此服务不一定为执行状态,但是必须已经安装。您可以用安装选项("03
TimeService.exe" -install)来安装服务。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>为了察看这一切努力的成果,请开启CIM Studio并浏览至以下的节点:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">CIM_ManagedSystemElement\CIM_LogicalElement\CIM_Service\ <BR> Win32_BaseService\Win32_Service\Richter_TimeServiceProvider</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在右窗格上方按下Instances按钮,选到Win32_Service类别的新PipeName属性,您将会看到从TimeServiceProvider
DLL回传的资讯,如图8-11所示。</FONT></P>
<P><BR style="LINE-HEIGHT: 25px"> </P>
<CENTER style="LINE-HEIGHT: 25px">
<P><INPUT id=11 style="LINE-HEIGHT: 25px" type=image height=547
width=787
src="8.3 Windows Management Instrumentation.files/8-11.gif" border=0
onclick="imgclick"></P></CENTER>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE style="LINE-HEIGHT: 25px" border=0>
<TBODY style="LINE-HEIGHT: 25px">
<TR style="LINE-HEIGHT: 25px">
<TD style="LINE-HEIGHT: 25px" align=middle><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2><FONT style="LINE-HEIGHT: 25px" face=arial
color=#3e80d7 size=2><B
style="LINE-HEIGHT: 25px"> 图8-11 </B></FONT>在CIM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -