autoit 发表于 2008-5-3 14:19:52

在Autoit中使用WMI:第一部分

<p><strong>一、什么是WMI</strong></p><p>WMI是Windows 2K/XP管理系统的核心;对于其他的Win32操作系统,WMI是一个有用的插件。有了WMI,工具软件和脚本程序访问操作系统的不同部分时不需要使用不同的API;相反,操作系统的不同部分都可以插入WMI。</p><p>也就是说,利用WMI我们能更方便地管理 Windows 资源 &mdash; 例如磁盘、事件日志、文件、文件夹、文件系统、网络组件、操作系统设置、性能数据、打印机、进程、注册表设置、安全性、服务、共享、用户、组等等。。</p><p><strong>二、对WMI中一些名词的解释</strong></p><p>首先看到下面的一个例子,这段代码能够输出物理内存的大小(不是用已有的函数):</p><blockquote dir="ltr" style="margin-right: 0px"><p><span class="re0">$strComputer</span> = <span class="st0">&quot;.&quot;</span><br /><br /><span class="re0">$wbemServices</span> = <span class="kw3">ObjGet</span><span class="br0">(</span><span class="st0">&quot;winmgmts:&#92;&#92;&quot;</span> &amp; <span class="re0">$strComputer</span> &amp; <span class="st0">&quot;&#92;root&#92;cimv2&quot;</span><span class="br0">)</span><br /><br /><span class="re0">$wbemObjectSet</span>= <span class="re0">$wbemServices</span>.<span class="me1">InstancesOf</span><span class="br0">(</span><span class="st0">&quot;Win32_LogicalMemoryConfiguration&quot;</span><span class="br0">)</span><br /><br /><span class="kw1">For</span> <span class="re0">$wbemObject</span> <span class="kw1">In</span> <span class="re0">$wbemObjectSet</span><br /><span class="kw3">ConsoleWrite</span><span class="br0">(</span><span class="st0">&quot;Total Physical Memory (kb): &quot;</span> &amp; <span class="re0">$wbemObject</span>.<span class="me1">TotalPhysicalMemory</span><span class="br0">)</span><br /><span class="kw1">Next</span></p></blockquote><p>在对代码解释前,我先解释一下一些名词的含义:</p><p><strong>对象</strong>:所谓对象,就是建立COM组件时的返回值,像$wbemServices就是,我们称之为SwbemServicesWMI服务对象,至于$wbemObjectSet则叫做SwbemObject类实例集合对象,后文我还会提到SwbemLocator教本库对象。它们的层级关系如下:SwbemLocator教本库对象&rarr;SwbemServicesWMI服务对象&rarr;SwbemObject类实例集合对象&rarr;SwbemObject类的实例。</p><p><strong>属性</strong>:以$wbemServices.InstancesOff为例,我们就说$wbemServices对象的InstancesOff属性。</p><p><strong>类:</strong>WMI能实现的操作有很多种,不同种类的操作都是分开的,我们称之为类,上面代码中的&quot;Win32_LogicalMemoryConfiguration&quot;就是一个类。</p><p><strong>命名空间</strong>:类也分很多种,功能相近的类分在一起就是命名空间,比如说上面代码中的&#92;root&#92;cimv2。而另一个常用的命名空间是root&#92;DEFAULT。例如,事件日志、性能计数器、Windows 安装程序和 Win32 提供程序都存储在 root&#92;cimv2 命名空间中。另一方面,注册表提供程序存储在 root&#92;DEFAULT 命名空间中。</p><p><strong>集合</strong>:<span class="re0">$wbemObjectSet的数据类型属于集合,用FOR...IN...能对其进行列举。</span></p><p><strong>三、使用WMI的基本步骤</strong></p><p>1.获取SwbemServicesWMI服务对象,或者说连接到目标计算机的命名空间</p><blockquote dir="ltr" style="margin-right: 0px"><p><span class="re0">$strComputer</span> = <span class="st0">&quot;.&quot;</span><br /><br /><span class="re0">$wbemServices</span> = <span class="kw3">ObjGet</span><span class="br0">(</span><span class="st0">&quot;winmgmts:&#92;&#92;&quot;</span> &amp; <span class="re0">$strComputer</span> &amp; <span class="st0">&quot;&#92;root&#92;cimv2&quot;</span><span class="br0">)</span></p></blockquote><p><span class="re0">2.获取类的集合对象</span></p><blockquote dir="ltr" style="margin-right: 0px"><p><span class="re0"><span class="re0">$wbemObjectSet</span>= <span class="re0">$wbemServices</span>.<span class="me1">InstancesOf</span><span class="br0">(</span><span class="st0">&quot;Win32_LogicalMemoryConfiguration&quot;</span><span class="br0">)</span></span></p></blockquote><p>3.使用指定对象的属性进行操作</p><blockquote dir="ltr" style="margin-right: 0px"><p><span class="kw1">For</span> <span class="re0">$wbemObject</span> <span class="kw1">In</span> <span class="re0">$wbemObjectSet</span><br /><span class="kw3">ConsoleWrite</span><span class="br0">(</span><span class="st0">&quot;Total Physical Memory (kb): &quot;</span> &amp; <span class="re0">$wbemObject</span>.<span class="me1">TotalPhysicalMemory</span><span class="br0">)</span><br /><span class="kw1">Next</span></p></blockquote><p>上面三步仅仅是对WMI操作的概括,实际操作时每一步都很复杂,下面将对这3步逐一进行讲解。</p><p><strong>四、连接到命名空间的方法</strong></p><p>方法1.用moniker名字法建立WMI服务的连接</p><blockquote dir="ltr" style="margin-right: 0px"><p>这一方法也就是本文的例子所用到的,它的要点就是通过编写一个moniker字符串作为ObjGet函数的参数,然后返回一个SwbemServices对象。</p><p>关于moniker字符串的完整格式如下:</p><p>&quot;winmgmts:[{SecuritySettings}!][&#92;&#92;ComputerName][&#92;Namespace][:ClassName][.KeyProperty='Value']&quot; </p><p>&quot;winmgmts:&quot;是前缀, 表示为WMI服务,必须使用;第二部分用来验证权限和假冒级别的,省略。第三部分为计算机名字:&quot;&#92;&#92;.&#92;&quot;是本机的计算机名字,默认可省略,,其余同上;第四部分命名空间:缺省的命名空间为&quot;root&#92;CIMV2&quot;,默认可省略。也就是说我给的那个例子中的相关代码可简写为:$wbemServices = ObjGet(&quot;winmgmts:&quot;),但我绝不建议这样做。</p><p>第五部分为类名。第六部分为属性值。注意:当该moniker字符串不包括最后2项时(即为:&quot;winmgmts:[&#92;&#92;ComputerName][&#92;Namespace]&quot;),则ObjGet(moniker字符串)返回的是一个命名空间的已验证的连接(SwbemServices对象);当不包括最后1项时,返回的是一个类(SWbemObject对象);当包括最后2项时,返回的是一个类的单独实例(SWbemObject对象)。</p></blockquote><p>方法2.通过建立SwbemLocator对象</p><blockquote dir="ltr" style="margin-right: 0px"><p>这第二种方法我并不推荐,因为操作很繁琐,但是这种方法却能直观反应WMI操作的原理。下面是具体步骤:</p><p>1.建立SwbemLocator对象</p><blockquote dir="ltr" style="margin-right: 0px"><p><span class="re0">$objLocator</span> = <span class="kw3">ObjCreate</span><span class="br0">(</span><span class="st0">&quot;WbemScripting.SWbemLocator&quot;</span><span class="br0">)</span></p></blockquote><p dir="ltr">2.通过ConnectServer属性登录到目标计算机,下面的代码是登录到本机</p><blockquote dir="ltr" style="margin-right: 0px"><p dir="ltr"><span class="re0">$objService</span> = <span class="re0">$objLocator</span>.<span class="me1">ConnectServer</span><span class="br0">(</span><span class="st0">&quot;.&quot;</span>, <span class="st0">&quot;root&#92;cimv2&quot;</span><span class="br0">)</span></p></blockquote><p dir="ltr">3.设置impersonation等级</p><blockquote dir="ltr" style="margin-right: 0px"><p dir="ltr"><span class="re0">$objService</span>.<span class="me1">Security_</span>.<span class="me1">ImpersonationLevel</span> = <span class="nu0">3</span></p></blockquote><p dir="ltr">5.执行你的代码,还是以显示物理内存为例</p><blockquote dir="ltr" style="margin-right: 0px"><p dir="ltr"><span class="re0">$objLocator</span> = <span class="kw3">ObjCreate</span><span class="br0">(</span><span class="st0">&quot;WbemScripting.SWbemLocator&quot;</span><span class="br0">)</span><br /><span class="re0">$objService</span> = <span class="re0">$objLocator</span>.<span class="me1">ConnectServer</span><span class="br0">(</span><span class="st0">&quot;.&quot;</span>, <span class="st0">&quot;root&#92;cimv2&quot;</span><span class="br0">)</span><br /><span class="re0">$objService</span>.<span class="me1">Security_</span>.<span class="me1">ImpersonationLevel</span> = <span class="nu0">3</span><br /><br /><span class="co0">;和第一个例子不同,这里使用了ExecQuery属性来获取Win32_LogicalMemoryConfiguration类的对象</span><br /><span class="re0">$wbemObjectSet</span> = <span class="re0">$objService</span>.<span class="me1">ExecQuery</span><span class="br0">(</span><span class="st0">&quot;SELECT * FROM Win32_LogicalMemoryConfiguration&quot;</span><span class="br0">)</span><br /><br /><span class="kw1">For</span> <span class="re0">$wbemObject</span> <span class="kw1">In</span> <span class="re0">$wbemObjectSet</span><br /><span class="kw3">ConsoleWrite</span><span class="br0">(</span><span class="st0">&quot;Total Physical Memory (kb): &quot;</span> &amp; <span class="re0">$wbemObject</span>.<span class="me1">TotalPhysicalMemory</span><span class="br0">)</span><br /><span class="kw1">Next</span></p></blockquote></blockquote>

qop1830 发表于 2008-7-13 07:10:34

没人顶??那我占沙发了!

顽固不化 发表于 2008-7-13 16:04:27

用wmi时,是不是要对要用到的东西有比较的了解?比如类名什么的都是固定的吧?就像调用API函数一样,需要知道固定的子函数名称,参数类型,排列方式等等。

gjxk999 发表于 2008-10-26 10:44:09

学习了,谢谢搂主,谢谢分享!
:face (19): :face (2):

fangfangma 发表于 2008-10-28 17:38:52

先收藏资料了.

k1727 发表于 2008-11-10 17:15:53

好东西呀.在找后续的文章,不知道在那里?

juyz 发表于 2008-11-10 18:37:25

这东东是不是有人发过了啊

xichao007521 发表于 2008-12-11 21:53:57

很好,正在学习,谢谢楼主

UID 发表于 2008-12-16 11:20:56

:face (13): 学习一下

askask150 发表于 2008-12-18 04:22:45

读完第一的时候我 很明白
读完第二的时候我 一般明白
读完第三的时候我 不明白
(它后面写的“下面将对这3步逐一进行讲解”,但怎么就跳到第四了。??费解)
读完第四的时候我 明白了
(这其实是解说第三段 第一小节的嘛 应该改成 3.1或其他什么的)

谢谢楼主了学习了 (顺手一下,拿走一份:face (24): )

lantu 发表于 2009-1-13 10:04:42

学习研究中,大好啦

okbak02 发表于 2009-5-3 14:49:17

:face (29):

foolbyrd 发表于 2009-10-13 20:47:31

正在学习找这方面的资料,学习了,谢谢LZ

汲水先生 发表于 2009-10-22 14:52:53

先收藏资料了.

871224 发表于 2009-10-30 10:10:43

顶一个顶一个顶一个
页: [1] 2
查看完整版本: 在Autoit中使用WMI:第一部分