有许多设备(服务器,台式机,笔记本电脑,平板电脑,手机等),运行Windows操作系统。我们很多人谁住在基于nix的世界在此系统中工作,或者如果我们不这样做,我们将迟早的事情。除了常规的工具,我们可以从一个*nix的系统(比如了Apache,PHP,MySQL和C/C++编译器等)预计,Windows提供
有许多设备(服务器,台式机,笔记本电脑,平板电脑,手机等),运行Windows操作系统。 我们很多人谁住在基于nix的世界在此系统中工作,或者如果我们不这样做,我们将迟早的事情。 除了常规的工具,我们可以从一个* nix的系统(比如了Apache,PHP,MySQL和C / C + +编译器等)预计,Windows提供了一组不存在任何其他的操作系统独特的功能,和WMI就是其中之一。
在这篇文章中,我们将针对类似的问题:什么是WMI? 如何使用WMI用PHP? 我们将有一些最起码的示例代码要经过基本的编程技术。
什么是WMI和为什么我们需要对付它
MSDN网站已经在其官方WMI的定义在本文中 ,其中几行摘录如下:
Windows管理规范(WMI)是Microsoft基于Web的企业管理(WBEM),这是一个行业计划制定的标准技术在企业环境中访问管理信息的。
三个关键字这里有: 基于Web的管理信息 , 企业环境 。 所以,如果我们管理的IT环境是一个大规模的,基于Windows的体系结构,我们要检索每个节点的管理信息,并在网页的方式呈现,我们将需要使用WMI交互。WMI是还能够做其他事情,比如在远程PC产卵的过程,但是,这将是超出了本文的范围。
WMI提供了一机多用的综合知识,包括硬件和软件。 它有所谓的CIM( 通用信息模型 )来封装信息以面向对象的方式。 它还提供了多种编程接口,以获取所述信息。 在纯Windows环境中,这些将是PowerShell中 ,VB脚本和。NET语言。 但在我们的例子中,这将是PHP的。
其中一个基本问题,当使用WMI编程是:其中“信息”可用? 换句话说,哪些对象/类可用? 幸运的是,微软提供了什么WMI提供了类和它们的属性方面的完整列表。 请访问这里的完整参考。 在WMI编程,大部分时间我们指的是Win32的类 。
先决条件
在Windows主机,WMI必须安装提供的CIM。 默认情况下,任何Windows系统比Windows XP的更新应该具有的WMI安装并启用。
我们可以验证这是通过以下两个步骤的情况下:
-
启动“ Computer Management在你的Windows机器“,看看所谓的”服务Windows Management Instrumentation “执行。 如果没有,则启动该服务。
-
推出“ wbemtest在你的命令提示符窗口“。 题为“对话框Windows Management Instrumentation Test会出现“。 很多在该对话框中的按钮目前已停用,但我们可以单击“ Connect... “ 按钮来调用类似于如下所示的一个新的对话框:
通常情况下,我们不需要改变什么。 root\cimv2是内置的命名空间为我们的WMI界面的系统。 只需点击“Connect此对话框中“按钮。 它会带我们回到先前的窗口,所有已启用的按钮。
能够连接到一台机器的WMI界面仅仅是先决条件之一。 我们还需要确保Windows防火墙将允许WMI调用通过。
在Windows防火墙中,选择“ Advanced Settings “,然后启用WMI相关的条目入站和出站访问规则。 请看下面的截图。
之后,我们能够在远程计算机的WMI防火墙规则,我们可以说明上述步骤2测试连接。 要连接到远程计算机,我们需要前 缀的默认命名空间(“ root\cimv2与我们需要连接(“PC的IP地址或名称”)\\192.168.1.2\root\cimv2 ,例如“),并提供用户名和密码的远程计算机。
PHP扩展的WMI(。net)
在PHP中使用WMI(或更确切地说,NET功能),我们将需要启用php_com_dotnet.dll 。 添加一行到php.ini是这样的:
extension=php_com_dotnet.dll
并重新启动Web服务器。
注: php_com_dotnet.dll是一个仅适用于Windows的扩展。 这意味着我们将不得不在一个WAMP般的环境在* nix的环境中运行的WMI调用PHP文件,而不是。 而且,当然,我们会通过WMI管理的机器都必须是基于Windows的。
什么WMI提供了进一步研究
成就了一切必要的准备,而且我们开始编程的WMI用PHP之前,我们真的需要回到我们前面提出的基本问题:什么“信息”可用?
我们可以预期的WMI提供有关BIOS,CPU,磁盘,内存使用情况等信息,但这种信息是如何呈现的?
除了 挖掘到所提供的官方文件,让我们调出wbemtest对话框再次连接到本地机器。 在WMI Tester对话框中,单击Enum Classes...按钮,弹出如下对话框:
在此对话框中,不要在文本框中输入任何内容,选择Recursive ,然后单击OK 。 它应该弹出另一个对话框是这样的:
这是一个很长的列表(在我的Windows 8.1的PC 1,110对象)。 你的电脑可能会发出不同的清单,但应该或多或少与此相同的。 请花一些时间来翻阅它,看看那个WMI提供的类的名称。 例如,在上图中,我们强调一个类Win32_LogicalDisk 。 这包含所有与机器的逻辑磁盘的信息。 为了得到这个类提供了一个更深入的了解,请双击该类别和另一个Object editor对话框会出现:
仔细看看属性面板。 这里列出的属性是那些我们可以检索。 例如, VolumeName将我们分配给一个逻辑磁盘的名称。
WMI的Win32的类有很多条目翻阅。 一些最常用的是:
-
计算机系统五金类,包括制冷设备,输入设备(键盘,鼠标等),大容量存储,主板,网络设备,印刷,视频和屏幕等
-
安装的应用程序类,包括字体,等等。
-
操作系统课程,包括驱动器,内存,进程,注册表,用户等。
-
性能计数器类,包括所有性能相关的类。
-
等等,等等。
我们现在有WMI类及其相关性质的结构有更清晰的画面。
在PHP编程的WMI
下面的代码片段显示了有关的IP 192.168.1.4的远程计算机的逻辑磁盘的一些基本信息:
ConnectServer($pc, 'root\\cimv2', 'your account', 'your password'); $WbemServices->Security_->ImpersOnationLevel= 3; $disks = $WbemServices->ExecQuery("Select * from Win32_LogicalDisk"); foreach ($disks as $d) { $str=sprintf("%s (%s) %s bytes, %4.1f%% free\n", $d->Name,$d->VolumeName,number_format($d->Size,0,'.',','), $d->FreeSpace/$d->Size*100.0); echo $str; }
在我的系统,上面会打印出来是这样的:
C: (System) 104,864,059,392 bytes, 60.4% free D: (Data) 209,719,963,648 bytes, 84.3% free E: (Misc) 185,521,188,864 bytes, 95.3% free
这是一个很简单的例子,但它奠定了一个PHP的WMI程序的基本结构和流程。
首先,类型的COM对象实例WbemScripting.SWbemLocator被创建。
然后连接到PC将通过建立ConnectServer方法。 这四个参数,这个方法调用都不言自明。 最后,我们需要将安全模拟设置到适当的水平。 3级是WMI脚本的建议水平。 该级别的详细解释被记录在这里 。 第3级指“Impersonation “,这意味着,我们引述如下:
服务器进程可以模拟客户端的安全上下文的本地系统上。 服务器无法模拟客户端在远程系统上。
总之,我们的脚本(与我们创建的服务实例)是“冒充”所提供的帐户/密码的用户。 完美的东西,我们需要在这里。
请注意,上面的代码是创建一个远程COM连接来管理远程PC的方式。 要管理本地PC,语法会稍有不同,但没有太大的:
ExecQuery("Select * from Win32_LogicalDisk"); // Rest of the code is the same as previous remote connection sample
这是有点简单,因为我们并不需要提供凭证和冒充但是这是基于运行这段代码的用户具有管理员权限的假设。
要获得类及其相关数据,我们使用的WQL(WMI查询语言)语句。 这是非常类似于我们发出一个MySQL服务器,但在这种情况下,我们从WMI获取数据的SQL语句。 Win32_LogicalDisk是WMI一“表”的存储与逻辑磁盘上的所有信息。 若要从其他表中的数据,请使用在列出的名称Query Result如上图所示对话框。 这也让我们来筛选结果。 例如, Select * from Win32_LogicalDisk where size > 150000000000将只返回那些逻辑器件与大小超过150G(大约)。
该ExecQuery声明,如果成功,将返回一个variant类型的对象。 一个缺点是,如果我们尝试var_dump该对象时,PHP将只打印类似object (variant) #3... 。 当我们尝试同样的事情发生var_dump的$d变量。其实是没有什么进一步的编程输出有用。
实际上,我们只需要知道该对象是可迭代的。 在这种情况下,当我们使用foreach循环中,每$d实例会保存一个对象引用到一个逻辑磁盘。 然后,我们可以用熟悉的访问该逻辑磁盘实例的属性->符号。 属性列表可以在找到Object editor为特定类对话框,如上图所示。
一定要拼出类名( Win32_LogicalDisk )和属性名称(如Size , Name正确)。 窗户是不区分大小写,但如果我们提供了错误的名称,一个错误就会被抛出并返回。
正如我们前面提到的,WMI的编程可以与其他语言都是要做的事 - 如C#,VB脚本等语言不过,WMI COM接口就是这样一个动态的界面,我们不能对任何一种语言计算提供了代码完成提示可以很方便地访问所有的属性。我们必须依靠上面显示的对话。
一个解决方案,以帮助程序员是进一步封装每个WMI类与必要的方法的PHP类。 这应该是一个非常简单的任务,我会留给那些有兴趣玩弄它。
结论
WMI是一个强大的工具持有一些最隐蔽的秘密保存在Windows操作系统中。 在一个大规模的网络同质基于Windows的机器,我们可以依靠WMI来检索这一重要信息,帮助系统管理员更好地管理所有的机器。
在本文中,我们只介绍WMI和WMI的PHP编程的最基础知识,但已经确立了基本面的进一步工作。
请在下面留下您的意见,如果你想看到更详细的WMI教程!