🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[COM的功能](https://www.php.net/manual/zh/faq.com.php) [Windows API 参考手册](http://www.office-cn.net/t/api/api_content.htm) COM是*组件对象模型*的缩写;它是DCE RPC(开放标准)之上的面向对象的层(和相关服务),并定义了通用的调用约定,该约定使使用任何语言编写的代码可以调用并与使用任何其他语言编写的代码进行互操作(前提是这些语言是COM意识)。这些代码不仅可以用任何语言编写,甚至都不必成为同一可执行文件的一部分。可以从DLL加载代码,在同一计算机上运行的另一个进程中找到代码,或者使用DCOM(分布式COM)在远程计算机上的另一个进程中找到代码,而这些代码甚至都不需要知道组件的位置居住。 有一个称为OLE Automation的COM子集,它包含一组COM接口,这些接口允许松散地绑定到COM对象,因此可以在运行时对它们进行自省和调用,而无需在编译时知道该对象的工作方式。PHP COM扩展利用OLE自动化接口允许您从脚本中创建和调用兼容对象。从技术上讲,这实际上应称为“*PHP的OLE自动化扩展*”,因为并非所有COM对象都是OLE兼容的。 现在,为什么或应该使用COM?COM是在Windows平台上将应用程序和组件粘合在一起的主要方法之一。使用COM可以启动Microsoft Word,填写文档模板并将结果另存为Word文档,然后将其发送给您的网站的访问者。您还可以使用COM来执行网络的管理任务和配置IIS。这些只是最常见的用途;您可以使用COM做更多的事情。 此外,我们支持使用Microsoft提供的COM互操作性层实例化和创建.Net程序集 从PHP 5.3.15 / 5.4.5开始,这个扩展要求在PHP .ini中启用 **`php_com_dotnet.dll`** ,以便使用这些函数。以前的PHP版本默认支持这些扩展。您负责安装您打算使用的各种COM对象的支持(例如MS Word);我们不能把所有这些都和PHP捆绑在一起。 **php.ini启用此扩展** ``` [com_dotnet] extension=php_com_dotnet.dll ;当它打开时,PHP 将被允许作为 D-COM(分布式 COM)客户端运行,并允许 PHP 脚本在远程服务器上实例化 COM 对象 com.allow_dcom=0 ;当此选项打开时(默认),在初始化 COM 对象时在自动加载的类型库中找到的常量将区分大小写注册。 有关更多详细信息,请参阅 com_load_typelib() com.autoregister_casesensitive=1 ;当它打开时,PHP 将尝试从它实例化的 COM 对象的类型库中注册常量,如果这些对象实现了获取该信息所需的接口。 它注册的常量的大小写敏感度由配置指令控制。 com.autoregister_typelib=0 ;启用此选项后,将使用 PHP 错误机制报告在对象实例化期间加载类型库的任何问题。 默认值为关闭,如果发现或加载类型库时出错,则不会发出任何指示。 com.autoregister_verbose=0 ;它控制默认字符集代码页,以便在传递字符串往返 COM 对象时使用。如果设置为空字符串,PHP 将假设您想要CP_ACP,这是默认系统 ANSI 代码页面。 ;如果使用默认情况下设置的不同编码/字符对脚本中的文本进行编码,则设置此指令将避免您将代码页面作为参数传递给com类构造器。请注意,使用此指令(与任何 PHP 配置指令一样),您的 PHP 脚本变得不那么便携;您应该尽可能使用 COM 构造参数 com.code_page="" ;设置后,这应保留包含应在启动时加载的类型图书馆列表的文件的路径。文件的每行将被视为类型库名称,并加载,仿佛你已经调用com_load_typelib()。常数将持续注册,因此库只需加载一次。如果一个类型的库名称以字符串结尾,或者,则该库的常数将麻不仁地进行注册。#cis#case_insensitive com.typelib_file="" ;用于点网对象的.NET 框架版本。设置的价值是框架版本编号的前三个部分,按点分离,并预设,例如。vv4.0.30319 com.dotnet_version="" ``` 示例: ``` $word = new COM("C:\docs\word.doc"); $obj = new COM("ABC.MyObj"); //一般前边是主文件名、后边是类名,注册表里找这个文件可以找到 ``` 调用vbscript的Wscript.Shell执行windows的ifconfig命令 ``` $cmd="ipconfig"; $phpwsh=new \COM("Wscript.Shell") or die("Create Wscript.Shell Failed!"); $phpexec=$phpwsh->exec("cmd.exe /c $cmd"); $execoutput=$phpexec->stdout(); $result=$execoutput->readall(); echo $result; 结果 Windows IP ���� ��̫�������� ��̫��: �����ض��� DNS ��׺ . . . . . . . : ctc �������� IPv6 ��ַ. . . . . . . . : fe83::a18b:99be:461c:7166%5 IPv4 ��ַ . . . . . . . . . . . . : 192.168.2.6 �������� . . . . . . . . . . . . : 255.255.255.0 Ĭ������. . . . . . . . . . . . . : 192.168.2.1 ��̫�������� VMware Network Adapter VMnet1: �����ض��� DNS ��׺ . . . . . . . : �������� IPv6 ��ַ. . . . . . . . : fe83::8c8a:e576:bed4:620f%7 IPv4 ��ַ . . . . . . . . . . . . : 192.168.148.1 �������� . . . . . . . . . . . . : 255.255.255.0 Ĭ������. . . . . . . . . . . . . : ��̫�������� VMware Network Adapter VMnet8: �����ض��� DNS ��׺ . . . . . . . : �������� IPv6 ��ַ. . . . . . . . : fe83::10cd:f9f7:4a1d:b8b5%16 IPv4 ��ַ . . . . . . . . . . . . : 192.168.159.1 �������� . . . . . . . . . . . . : 255.255.255.0 Ĭ������. . . . . . . . . . . . . : ``` WshShell提供对本地Windows外壳程序的访问。可以通过Wshshell对象模拟键盘,向激活窗口发送键值实现选择,弹出定时提示框,注册表的读写,程序的启动,系统等待,添加Event Log,创建快捷方式等下面我们介绍一下WshShell的几个方法: **Wscript.shell是Wshshell的ProID** >[warning]Wshshell是一个对象,存放在windows系统中的wshom.ocx文件中,可供在windows上运行的程序调用。他可对windows的外壳程序进行访问。 对象(object)是一些相关变量和方法的软件集,或者说库。当你需要这个对象里面的变量,方法,功能的时候,你就可以使用相关语言(代码)来调用。 ProID是程序员给某个CLSID指定的一个易记名字。组成如.. CLSID是windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配的一个唯一表示它的代码。为Class ID的缩写。 **Wscript : Windows Script Host object model (注意,前三个缩写为Wsh )** 简单的说,Wscript就是Windows脚本宿主对象模型(WSHOM) , 而Wscript就是windows内对象存放的一个根对象(官方语言:Wscript是一个基于windows系统脚本宿主对象的根对象), 利用它可以创造两种COM对象:WshShell 与 WshNetwork(主要用于访问局域网环境下的[资源](http://zy.anjian.com/?action-resource)共享). 注释1:(八卦一下,不知道现在的诸如WshEnvironment, WshCollection, WshExec等对象是不是也存放在该根对象下,依照我的理解是的,因为他们都有前缀Wsh,但他们应该不是COM组件,故不再上面列出,应该是这样吧。另需注意Wsh是Wscript对象内置的变量,故在你载入WshShell后,在没有声明的情况下不能使用Wsh作为变量,否则会出现错误) 注释2:(COM对象即the Component Object Model,组件对象模型。COM组件是遵行COM规范编写,以Win32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行二进制代码,能够满足组建对框架的所有需求。简单理解COM对象就是可执行二进制代码存放的根对象)(貌似我搞不懂,如果真是这样,他们为什么非要用model模型这个单词呢,为什么不用Root根或family集合这类单词呢) 对于WshShell对象,其中的Shell是外壳的意思,应该是此对象能够调用windows的外壳程序,故取名shell,个人觉得那么Wscript.shell这个ProID堪称完美。 ***** 例子3 ``` $obj = new COM("server.object")  即可以使用COM对象的属性和方法。  下面以word为例  // 启动 word  $word = new COM("word.application") or die("Unable to instanciate Word");  print "ioaded Word, version {$word->Version}\\n";  //将其置前  $word->Visible = 1;  //打开一个空文档  $word->Documents->Add();  //随便做些事情  $word->Selection->TypeText("This is a test...");  $word->Documents\[1\]->SaveAs("Useless test.doc");  //关闭 word  $word->Quit();  //释放对象  $word->Release();  $word = null; ``` 例子4:PHP隐藏文件的方法 ``` $com=new COM('Scripting.FileSystemObject'); // FSO要使用绝对路径的  $file=$com ->getfile(\_\_FILE\_\_); //绝对路径  $file ->attributes='6'; //修改属性为系统、隐藏  //常数 值 描述  //Normal 0 普通文件。不设置属性。  //ReadOnly 1 只读文件。属性为读/写。  //Hidden 2 隐藏文件。属性为读/写。  //System 4 系统文件。属性为读/写。  //Volume 8 磁盘驱动器卷标。属性为只读。  //Directory 16 文件夹或目录。属性为只读。  //Archive 32 文件在上次备份后已经修改。属性为读/写。  //Alias 64 链接或者快捷方式。属性为只读。  //Compressed 128 压缩文件。属性为只读。 ``` 例子5 ``` //这个就可以实现asp的XMLHTTP传马功能  $xmlhttp=new COM('Microsoft.XMLHTTP') or die("Create Microsoft.XMLHTTP Failed!");  $xmlhttp->open('GET','http://localhost/1.txt',false);  $xmlhttp->send();  echo $xmlhttp->responseText;//输出1.txt的内容 /\*  XMLHTTP方法  Open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword)     bstrMethod: 数据传送方式,即GET或POST。     bstrUrl: 服务网页的URL。     varAsync: 是否同步执行。缺省为True,即异步执行。False,为同步执行。     bstrUser: 用户名,可省略。     bstrPassword:用户口令,可省略。     Send(varBody)     varBody:指令集。可以是XML格式数据,也可以是字符串,流,或者一个无符号整数数组。也可以省略,让指令通过Open方法的URL参数代入。     setRequestHeader(bstrHeader, bstrvalue)     bstrHeader:HTTP 头(header)     bstrvalue: HTTP 头(header)的值   如果Open方法定义为POST,可以定义表单方式上传:     xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")  XMLHTTP属性  onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。     responseBody: 结果返回为无符号整数数组。     responseStream: 结果返回为IStream流。     responseText : 结果返回为字符串。     responseXML: 结果返回为XML格式数据。  \*/ ``` 例子6 Windows Management Instrumentation(WMI)是Microsoft基于Web的企业管理(WBEM)的实现,WBEM是一项行业倡议,旨在开发用于在企业环境中访问管理信息的标准技术 WMI提供了机器的全面知识,包括硬件和软件。 它具有所谓的CIM([通用信息模型](http://msdn.microsoft.com/en-us/library/aa389234.aspx)),以面向对象的方式封装信息。 它还提供了几个编程接口来检索所述信息。 在纯Windows环境中,它们将是[PowerShell](http://technet.microsoft.com/en-us/library/bb978526.aspx),VB脚本和.NET语言。 但是在我们的例子中,它将是PHP 使用WMI进行编程时的基本问题之一是:哪些“信息”可用? 换句话说,哪些对象/类可用? 幸运的是,Microsoft提供了有关WMI提供的类及其属性的完整列表。 请访问[此处](http://msdn.microsoft.com/en-us/library/aa394554.aspx)以获取完整参考。 在WMI编程中,大多数时候我们指的是[Win32类](http://msdn.microsoft.com/en-us/library/aa394084.aspx)。 ### 先决条件(Pre-requisites) 步骤1:计算机管理-服务中查看`Windows Management Instrumentation`服务是否启动,这里需要启动它 步骤2:启动后WIN+R打开cli命令窗口输入`wbemtest`打开标题为“`Windows Management Instrumentation Test`”的对话框该对话框中的许多按钮当前都处于禁用状态,但是我们可以单击“`Connect...`”按钮来调用一个类似于以下所示的新对话框: ![](https://img.kancloud.cn/d2/e4/d2e47c31417747096467e4300989c7bd_520x567.png) 通常,我们不需要更改任何东西。`root\cimv2`是WMI接口的系统内置名称空间。 只需单击此对话框中的“`Connect`”按钮。 启用所有按钮后,它将带我们回到上一个窗口。 能够连接到机器的WMI接口只是前提条件之一。 我们还需要确保Windows防火墙将允许WMI呼叫通过。 在Windows防火墙中,选择“`Advanced Settings`”,然后为WMI相关条目启用入站和出站访问规则。 请查看下面的屏幕截图 ![](https://img.kancloud.cn/89/0e/890e84a4fbcdc2a646b51554ebfd53b4_1038x770.png) ![](https://img.kancloud.cn/56/50/56503330259b50765a83df259907ef4a_1031x740.png) 在远程计算机上启用WMI防火墙规则后,我们可以按照上面的步骤2中所示测试连接。 要连接到远程计算机,我们需要在默认名称空间(“`root\cimv2`”)`root\cimv2`加上我们需要连接的PC的IP或名称(例如“`\\192.168.1.2\root\cimv2`”)并提供该远程计算机的用户名和密码。 我们可以期望WMI提供有关BIOS,CPU,磁盘,内存使用情况等的信息。但是如何显示这些信息? 步骤2WIN+R打开cli命令窗口输入`wbemtest`打开`wbemtest`对话框并连接到我们的本地计算机。 在“`WMI Tester`对话框中,单击“`Enum Classes...(枚举类)`按钮,并弹出以下对话框: ![](https://img.kancloud.cn/16/ee/16eebac296802e7298b37207178f13fa_527x493.png) 在此对话框中,不要在文本框中输入任何内容,选择“`Recursive(递归)`,然后单击“`OK(确定)`。 它应该弹出另一个对话框,如下所示: ![](https://img.kancloud.cn/53/c3/53c320c645a1917cae20cbe773592cc2_555x396.png) 这是一个很长的列表(在Windows 8.1 PC中为1,110个对象)。 您的PC可能会给出不同的列表,但应该与此列表大致相同。 请花一些时间浏览它,并查看WMI提供的类的名称。 例如,在上图中,我们突出显示了`Win32_LogicalDisk`类。 其中包含与计算机逻辑磁盘有关的所有信息。 要深入了解此类提供的内容,请双击该类,然后将出现另一个“`Object editor`对话框,如下图: ![](https://img.kancloud.cn/30/74/3074e0d3607946f7acf73628bc753e7e_551x572.png) 仔细查看“属性”面板。 此处列出的所有属性都是我们可以检索的属性。 例如,`VolumeName`将是我们为逻辑磁盘分配的名称。 WMI的Win32类有很多条目可供浏览。 一些最常用的是: * 计算机系统硬体类,包括冷却设备,输入设备(键盘,鼠标等),大容量存储,主板,网络设备,打印,视频和监视器等。 * 已安装的应用程序类,包括字体等。 * 操作系统类,包括驱动程序,内存,进程,注册表,用户等 * 性能计数器类,包括所有与性能相关的类。 * ... 下面的代码段显示了有关IP 192.168.1.4上的远程计算机的逻辑磁盘的一些基本信息: ``` $pc = "192.168.1.4"; //IP of the PC to manage //首先,创建一个`WbemScripting.SWbemLocator`类型的COM对象实例。 $WbemLocator = new COM ("WbemScripting.SWbemLocator"); //然后,将通过`ConnectServer`方法建立与PC的连接。 此方法调用的四个参数不言自明。 最后,我们需要将安全模拟设置为适当的级别。 建议将级别3用于WMI脚本。 有关级别的详细说明,请参见[此处](http://msdn.microsoft.com/en-us//library/system.security.principal.tokenimpersonationlevel.aspx)。 第3级的意思是“`Impersonation`”,这意味着我们引用:服务器进程可以在其本地系统上模拟客户端的安全上下文。 服务器无法模拟远程系统上的客户端。 $WbemServices = $WbemLocator->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 ``` 请注意,上面的代码是创建远程COM连接以管理远程PC的方法。 要管理本地PC,语法会稍有不同,但差别不大: ``` <?php $pc = "."; $obj = new COM ("winmgmts:\\\\".$pc."\\root\\cimv2"); $disks = $obj->ExecQuery("Select * from Win32_LogicalDisk"); // Rest of the code is the same as previous remote connection sample //其实本地的也可以这样操作 $pc = "127.0.0.1"; //IP of the PC to manage $WbemLocator = new \COM ("WbemScripting.SWbemLocator"); $WbemServices = $WbemLocator->ConnectServer($pc, 'root\\cimv2', '', '');//object(variant)#13 (0) { } $WbemServices->Security_->ImpersonationLevel = 3; ``` 这有点简单,因为我们不需要提供凭据和模拟,但这是基于以下假设:运行此代码段的用户具有管理员权限 为了获得类及其相关数据,我们使用了WQL(WMI查询语言)语句。 它与我们发布给MySQL服务器SQL语句非常相似,但是在这种情况下,我们正在从WMI检索数据。`Win32_LogicalDisk`是WMI中的一个“表”,用于存储与逻辑磁盘有关的所有信息。 要访问其他*表中的数据*,请使用“`Query Result`对话框中列出的名称,如上所示。 这也使我们可以过滤结果。 例如,`Select * from Win32_LogicalDisk where size > 150000000000`将仅返回大小超过150G(大约)的那些逻辑设备 如果成功,则`ExecQuery`语句将返回`variant`类型的对象。 缺点是,如果我们尝试`var_dump`该对象,PHP将只打印类似`object (variant) #3...`。 当我们尝试`var_dump``$d`变量时,`var_dump`发生同样的事情。 实际上,对于输出中的进一步编程没有任何用处。 实际上,我们只需要知道对象是可迭代的即可。 在这种情况下,当我们使用`foreach`循环时,每个`$d`实例将保存一个对逻辑磁盘的对象引用。 然后,我们可以使用熟悉的`->`符号访问该逻辑磁盘实例中的属性。 可以在该特定类的“`Object editor`对话框中找到属性列表,如上所示。 确保正确拼写类名(`Win32_LogicalDisk`)和属性名(如`Size`,`Name`)。 Windows不区分大小写,但是如果我们提供了错误的名称,则会引发错误并返回错误。 正如我们前面提到的,WMI编程也可以使用其他语言(例如C#,VB Script等)来完成。但是,WMI COM接口是一种动态接口,我们不能依靠任何这些语言来提供代码完成提示可轻松访问所有属性。 我们必须依靠上面显示的对话。 帮助程序员的一种解决方案是使用必要的方法将每个WMI类进一步封装到PHP类中。 这应该是一个非常简单的任务,我将把它留给有兴趣的人一起玩。 [PHP and WMI - Dig deep into Windows with PHP - SitePoint](https://www.sitepoint.com/php-wmi-dig-deep-windows-php/) ``` $obj = new COM ( 'winmgmts://localhost/root/CIMV2' ); $wmi_computersystem = $obj->ExecQuery("Select * from Win32_ComputerSystem"); $wmi_bios = $obj->ExecQuery("Select * from Win32_BIOS"); foreach ( $wmi_computersystem as $wmi_call ) { $model = $wmi_call->Model; } foreach ( $wmi_bios as $wmi_call ) { $serial = $wmi_call->SerialNumber; $bios_version = $wmi_call->SMBIOSBIOSVersion; } echo "Bios version : $bios_version\n". "Serial number : $serial\n". "Hardware Model : $model\n"; ``` * WbemScripting.SWbemLocator通过ConnectServer方法获取[SWbemServices](https://docs.microsoft.com/zh-cn/windows/win32/wmisdk/swbemservices)对象的引用 * SWbemServices 可以返回三个不同的 WMI 脚本库对象之一 (SWbemObjectSet、SWbemObject或 SWbemEventSource) ,具体取决于调用下面的方法 * 例如,如果返回 SWbemObjectSet,则必须枚举集合以访问集合中的每个 SWbemObject。 如果返回 SWbemObject,可以立即访问对象方法和属性,而无需先枚举集合 * SWbemServices 对象具有这些方法。 方法 说明 AssociatorsOf 通过一个或多个关联类检索与指定资源关联的托管资源的实例。 为原始终结点提供对象路径, 而 AssociatorsOf 返回位于相反终结点的托管资源。 AssociatorsOf 方法执行与"ASSOCIATORS OF"WQL 查询执行的相同函数。如果调用成功,则返回 SWbemObjectSet 对象。 AssociatorsOfAsync 异步返回与指定对象 (类或) 对象的集合。 delete 从 CIM 存储库中删除托管资源 (或类定义) 。 DeleteAsync 异步删除对象路径中指定的类或实例。 ExecMethod 提供一种替代方法,用于执行由托管资源类定义定义的方法。 主要用于脚本语言不支持 out 参数的情况。 例如,JScript不支持 out 参数。 ExecMethodAsync 异步执行方法提供程序导出的方法。 ExecNotificationQuery 执行事件订阅查询以接收事件。 事件订阅查询是定义要监视的托管环境更改的查询。 发生更改时,WMI 基础结构会向调用脚本传递描述更改的事件。 ExecNotificationQueryAsync 异步执行查询以接收事件。 ExecQuery 执行查询以检索 WMI 托管资源的实例集合, (或类定义) 。 ExecQuery 可用于检索与传递给 ExecQuery 的查询中定义的条件匹配的实例的筛选集合。 ExecQueryAsync 异步执行查询以检索对象。 get 根据对象路径检索托管资源 (或类) 实例。 GetAsync 基于对象路径异步检索作为类定义或实例的对象。 InstancesOf 根据类名检索托管资源的所有实例。 默认情况下 ,InstancesOf 执行深层检索。 也就是说 ,InstancesOf 检索由传递给方法的类名标识的资源的实例,并检索所有资源的所有实例,这些子类 (在目标类的) 下定义。 InstancesOfAsync 根据用户指定的选择条件异步返回指定类的实例。 ReferencesTo 返回引用指定资源的所有关联。 了解 ReferencesTo 的最佳方法是 将其与 AssociatorsOf 方法进行比较。 AssociationorsOf 返回位于关联相反端的动态资源。 ReferencesTo 返回关联本身。 ReferencesTo 方法执行与"REFERENCES OF"WQL 查询执行的相同函数。 ReferencesToAsync 异步返回引用特定类或实例的所有关联类或实例的集合。 SubclassesOf 从 CIM 存储库中检索指定类的所有子类。 SubclassesOfAsync 异步返回指定类的子类的集合。 * SWbemServices 支持三种操作模式:同步、异步和半同步,除了 Delete、 ExecMethod、 Get和9个异步方法,半同步是默认的和建议的操作模式 [Win32\_Processor class - Win32 apps | Microsoft Docs](https://docs.microsoft.com/zh-cn/windows/win32/cimwin32prov/win32-processor) ``` function GetWMI($wmi,$strClass, $strValue = array()) { $arrData = array(); $objWEBM = $wmi->Get($strClass); //$arrProp = $objWEBM->Properties_; //$arrWEBMCol = $objWEBM->Instances_(); if( PHP_VERSION < 5 ) { $objProp = $objWEBM->Properties_; $arrProp = $objProp->Next($objProp->Count); $objWEBMCol = $objWEBM->Instances_(); $arrWEBMCol = $objWEBMCol->Next($objWEBMCol->Count); } else { $arrProp = $objWEBM->Properties_; $arrWEBMCol = $objWEBM->Instances_(); } foreach($arrWEBMCol as $objItem) { //reset($arrProp); $arrInstance = array(); foreach($arrProp as $propItem) { eval("\$value = \$objItem->" . $propItem->Name . ";"); echo "<br>"; var_dump($propItem->Name.'<=>'.$value); echo "<br>"; if (empty($strValue)) { $arrInstance[$propItem->Name] = trim($value); } else { if (in_array($propItem->Name, $strValue)) { $arrInstance[$propItem->Name] = trim($value); } } } $arrData[] = $arrInstance; } return $arrData; } if('/'==DIRECTORY_SEPARATOR){ $ip=$_SERVER['SERVER_ADDR']; }else{ $ip= @gethostbyname($_SERVER['SERVER_NAME']); } if ($ip=="127.0.0.1"||$ip=="::1") { $pc = "127.0.0.1"; //IP of the PC to manage $WbemLocator = new \COM ("WbemScripting.SWbemLocator"); $WbemServices = $WbemLocator->ConnectServer($pc, 'root\\cimv2', '', '');//object(variant)#13 (0) { } $WbemServices->Security_->ImpersonationLevel = 3; }else{ $objLocator = new COM("WbemScripting.SWbemLocator"); $WbemServices = $objLocator->ConnectServer(); $WbemServices->Security_->ImpersonationLevel = 3; //$prop = $wmi->get("Win32_PnPEntity"); } $cpuinfo =GetWMI($WbemServices,"Win32_Processor"); //$cpuinfo =GetWMI($WbemServices,"Win32_Processor", array("Name","L2CacheSize","NumberOfCores")); ``` 打印结果 ``` AddressWidth<=>64 Architecture<=>9 AssetTag<=>To Be Filled By O.E.M. Availability<=>3 Caption<=>Intel64 Family 6 Model 94 Stepping 3 Characteristics<=>236 ConfigManagerErrorCode<=> ConfigManagerUserConfig<=> CpuStatus<=>1 CreationClassName<=>Win32_Processor CurrentClockSpeed<=>3201 CurrentVoltage<=>11 DataWidth<=>64 Description<=>Intel64 Family 6 Model 94 Stepping 3 DeviceID<=>CPU0 ErrorCleared<=> ErrorDescription<=> ExtClock<=>100 Family<=>205 InstallDate<=> L2CacheSize<=>1024 L2CacheSpeed<=> L3CacheSize<=>6144 L3CacheSpeed<=>0 LastErrorCode<=> Level<=>6 LoadPercentage<=>41 Manufacturer<=>GenuineIntel MaxClockSpeed<=>3201 Name<=>Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz NumberOfCores<=>4 NumberOfEnabledCore<=>4 NumberOfLogicalProcessors<=>4 OtherFamilyDescription<=> PartNumber<=>To Be Filled By O.E.M. PNPDeviceID<=> PowerManagementCapabilities<=> PowerManagementSupported<=> ProcessorId<=>BFEBFBFF000506E3 ProcessorType<=>3 Revision<=>24067 Role<=>CPU SecondLevelAddressTranslationExtensions<=>1 SerialNumber<=>To Be Filled By O.E.M. SocketDesignation<=>LGA1151 Status<=>OK StatusInfo<=>3 Stepping<=> SystemCreationClassName<=>Win32_ComputerSystem SystemName<=>DESKTOP-MTE1PF3 ThreadCount<=>4 UniqueId<=> UpgradeMethod<=>1 Version<=> VirtualizationFirmwareEnabled<=>1 VMMonitorModeExtensions<=>1 VoltageCaps<=> AddressWidth<=>64 Architecture<=>9 AssetTag<=>To Be Filled By O.E.M. Availability<=>3 Caption<=>Intel64 Family 6 Model 94 Stepping 3 Characteristics<=>236 ConfigManagerErrorCode<=> ConfigManagerUserConfig<=> CpuStatus<=>1 CreationClassName<=>Win32_Processor CurrentClockSpeed<=>3201 CurrentVoltage<=>11 DataWidth<=>64 Description<=>Intel64 Family 6 Model 94 Stepping 3 DeviceID<=>CPU0 ErrorCleared<=> ErrorDescription<=> ExtClock<=>100 Family<=>205 InstallDate<=> L2CacheSize<=>1024 L2CacheSpeed<=> L3CacheSize<=>6144 L3CacheSpeed<=>0 LastErrorCode<=> Level<=>6 LoadPercentage<=>23 Manufacturer<=>GenuineIntel MaxClockSpeed<=>3201 Name<=>Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz NumberOfCores<=>4 NumberOfEnabledCore<=>4 NumberOfLogicalProcessors<=>4 OtherFamilyDescription<=> PartNumber<=>To Be Filled By O.E.M. PNPDeviceID<=> PowerManagementCapabilities<=> PowerManagementSupported<=> ProcessorId<=>BFEBFBFF000506E3 ProcessorType<=>3 Revision<=>24067 Role<=>CPU SecondLevelAddressTranslationExtensions<=>1 SerialNumber<=>To Be Filled By O.E.M. SocketDesignation<=>LGA1151 Status<=>OK StatusInfo<=>3 Stepping<=> SystemCreationClassName<=>Win32_ComputerSystem SystemName<=>DESKTOP-MTE1PF3 ThreadCount<=>4 UniqueId<=> UpgradeMethod<=>1 Version<=> VirtualizationFirmwareEnabled<=>1 VMMonitorModeExtensions<=>1 VoltageCaps<=> ``` >[info]AddressWidth --在32位操作系统,该值是32,在64位操作系统是64。 Architecture --所使用的平台的处理器架构。 AssetTag --代表该处理器的资产标签。 Availability --设备的状态。 Caption --设备的简短描述 Characteristics --处理器支持定义的功能 ConfigManagerErrorCode --Windows API的配置管理器错误代码 ConfigManagerUserConfig --如果为TRUE,该装置是使用用户定义的配置 CpuStatus --处理器的当前状态 CreationClassName --出现在用来创建一个实例继承链的第一个具体类的名称 CurrentClockSpeed --处理器的当前速度,以MHz为单位 CurrentVoltage --处理器的电压。如果第八位被设置,位0-6包含电压乘以10,如果第八位没有置位,则位在VoltageCaps设定表示的电压值。 CurrentVoltage时SMBIOS指定的电压值只设置 DataWidth --在32位处理器,该值是32,在64位处理器是64 Description --描述 DeviceID --在系统上的处理器的唯一标识符 ErrorCleared --如果为真,报上一个错误代码的被清除 ErrorDescription --错误的代码描述 ExtClock --外部时钟频率,以MHz为单位 Family --处理器系列类型 InstallDate --安装日期 L2CacheSize --二级缓存大小 L2CacheSpeed --二级缓存处理器的时钟速度 L3CacheSize --三级缓存的大小 L3CacheSpeed --三级缓存处理器的时钟速度 LastErrorCode --报告的逻辑设备上一个错误代码 Level --处理器类型的定义。该值取决于处理器的体系结构 LoadPercentage --每个处理器的负载能力,平均到最后一秒 Manufacturer --处理器的制造商 MaxClockSpeed --处理器的最大速度,以MHz为单位 Name --处理器的名称 NumberOfCores --芯为处理器的当前实例的数目。核心是在集成电路上的物理处理器 NumberOfEnabledCore --每个处理器插槽启用的内核数 NumberOfLogicalProcessors --用于处理器的当前实例逻辑处理器的数量 OtherFamilyDescription --处理器系列类型 PartNumber --这款处理器的产品编号制造商所设置 PNPDeviceID --即插即用逻辑设备的播放设备标识符 PowerManagementCapabilities --逻辑设备的特定功率相关的能力阵列 PowerManagementSupported --如果为TRUE,该装置的功率可以被管理,这意味着它可以被放入挂起模式 ProcessorId --描述处理器功能的处理器的信息 ProcessorType --处理器的主要功能 Revision --系统修订级别取决于体系结构 Role --所述处理器的作用 SecondLevelAddressTranslationExtensions --如果为True,该处理器支持用于虚拟地址转换扩展 SerialNumber --处理器的序列号 SocketDesignation --芯片插座的线路上使用的类型 Status --对象的当前状态 StatusInfo --对象的当前状态信息 Stepping --在处理器家族处理器的版本 SystemCreationClassName --创建类名属性的作用域计算机的价值 SystemName --系统的名称 ThreadCount --每个处理器插槽的线程数 UniqueId --全局唯一标识符的处理器 UpgradeMethod --CPU插槽的信息 Version --依赖于架构处理器的版本号 VirtualizationFirmwareEnabled --如果真,固件可以虚拟化扩展 VMMonitorModeExtensions --如果为True,该处理器支持Intel或AMD虚拟机监控器扩展。 VoltageCaps --该处理器的电压的能力 ***** * [预定义常量](https://www.php.net/manual/en/com.constants.php) * [错误和错误处理](https://www.php.net/manual/en/com.error-handling.php) * [例子](https://www.php.net/manual/en/com.examples.php) * [对于每个](https://www.php.net/manual/en/com.examples.foreach.php) * [数组和数组样式的COM属性](https://www.php.net/manual/en/com.examples.arrays.php) * [com](https://www.php.net/manual/en/class.com.php)— com类 * [com :: \_\_ construct](https://www.php.net/manual/en/com.construct.php)— com类的构造函数 * [dotnet](https://www.php.net/manual/en/class.dotnet.php)— dotnet类 * [dotnet :: \_\_ construct](https://www.php.net/manual/en/dotnet.construct.php)— dotnet类的构造函数 * [变体](https://www.php.net/manual/en/class.variant.php)—变体类 * [variant :: \_\_construct](https://www.php.net/manual/en/variant.construct.php)—变体类构造函数 * [COMPersistHelper](https://www.php.net/manual/en/class.compersisthelper.php)— COMPersistHelper类 * [COMPersistHelper :: \_\_ construct](https://www.php.net/manual/en/compersisthelper.construct.php)—构造一个COMPersistHelper对象 * [COMPersistHelper :: GetCurFileName](https://www.php.net/manual/en/compersisthelper.getcurfilename.php)—获取当前文件名 * [COMPersistHelper :: GetMaxStreamSize](https://www.php.net/manual/en/compersisthelper.getmaxstreamsize.php)—获取最大流大小 * [COMPersistHelper :: InitNew](https://www.php.net/manual/en/compersisthelper.initnew.php)—将对象初始化为默认状态 * [COMPersistHelper :: LoadFromFile](https://www.php.net/manual/en/compersisthelper.loadfromfile.php)—从文件加载对象 * [COMPersistHelper :: LoadFromStream](https://www.php.net/manual/en/compersisthelper.loadfromstream.php)—从流中加载对象 * [COMPersistHelper :: SaveToFile](https://www.php.net/manual/en/compersisthelper.savetofile.php)—将对象保存到文件 * [COMPersistHelper :: SaveToStream](https://www.php.net/manual/en/compersisthelper.savetostream.php)—将对象保存到流 * [com\_exception](https://www.php.net/manual/en/class.com-exception.php)— com\_exception类 * [COM功能](https://www.php.net/manual/en/ref.com.php) * [com\_create\_guid](https://www.php.net/manual/en/function.com-create-guid.php)—生成全局唯一标识符(GUID) * [com\_event\_sink](https://www.php.net/manual/en/function.com-event-sink.php)—将事件从COM对象连接到PHP对象 * [com\_get\_active\_object](https://www.php.net/manual/en/function.com-get-active-object.php)—返回对已运行的COM对象实例的句柄 * [com\_load\_typelib](https://www.php.net/manual/en/function.com-load-typelib.php)—加载[Typelib](https://www.php.net/manual/en/function.com-load-typelib.php) * [com\_message\_pump](https://www.php.net/manual/en/function.com-message-pump.php)—处理COM消息,休眠时间长达ms * [com\_print\_typeinfo](https://www.php.net/manual/en/function.com-print-typeinfo.php)—打印出可调度接口的PHP类定义 * [variant\_abs](https://www.php.net/manual/en/function.variant-abs.php)—返回变量的绝对值 * [variant\_add](https://www.php.net/manual/en/function.variant-add.php)—将两个变量值“相加”并返回结果 * [variant\_and](https://www.php.net/manual/en/function.variant-and.php)—在两个变量之间执行按位与运算 * [variant\_cast](https://www.php.net/manual/en/function.variant-cast.php)—将变量转换为另一种类型的新变量对象 * [variant\_cat](https://www.php.net/manual/en/function.variant-cat.php)—将两个变量值连接在一起并返回结果 * [variant\_cmp](https://www.php.net/manual/en/function.variant-cmp.php)—比较两个变体 * [variant\_date\_from\_timestamp](https://www.php.net/manual/en/function.variant-date-from-timestamp.php)—返回Unix时间戳的变体日期表示形式 * [variant\_date\_to\_timestamp](https://www.php.net/manual/en/function.variant-date-to-timestamp.php)—将变体日期/时间值转换为Unix时间戳 * [variant\_div](https://www.php.net/manual/en/function.variant-div.php)—返回将两个变量相除的结果 * [variant\_eqv](https://www.php.net/manual/en/function.variant-eqv.php)—对两个变量执行按位等效 * [variant\_fix](https://www.php.net/manual/en/function.variant-fix.php)—返回变量的整数部分 * [variant\_get\_type](https://www.php.net/manual/en/function.variant-get-type.php)—返回变量对象的类型 * [variant\_idiv](https://www.php.net/manual/en/function.variant-idiv.php)—将变体转换为整数,然后返回除以它们的结果 * [variant\_imp](https://www.php.net/manual/en/function.variant-imp.php)—对两个变量执行按位含义 * [variant\_int](https://www.php.net/manual/en/function.variant-int.php)—返回变量的整数部分 * [variant\_mod](https://www.php.net/manual/en/function.variant-mod.php)—划分两个变量,仅返回其余变量 * [variant\_mul](https://www.php.net/manual/en/function.variant-mul.php)—将两个变量的值相乘 * [variant\_neg](https://www.php.net/manual/en/function.variant-neg.php)—对一个变体执行逻辑取反 * [variant\_not](https://www.php.net/manual/en/function.variant-not.php)—对一个变体执行按位非[求](https://www.php.net/manual/en/function.variant-not.php)反 * [variant\_or](https://www.php.net/manual/en/function.variant-or.php)—对两个变体执行逻辑分离 * [variant\_pow](https://www.php.net/manual/en/function.variant-pow.php)—返回执行具有两个变体的幂函数的结果 * [variant\_round](https://www.php.net/manual/en/function.variant-round.php)—将变体四舍五入到指定的小数位数 * [variant\_set\_type](https://www.php.net/manual/en/function.variant-set-type.php)—将变量转换为“就地”另一种类型 * [variant\_set](https://www.php.net/manual/en/function.variant-set.php)—为变量对象分配新值 * [variant\_sub-](https://www.php.net/manual/en/function.variant-sub.php)从左侧变量值中减去右侧变量的值 * [variant\_xor](https://www.php.net/manual/en/function.variant-xor.php)—对两个变体执行逻辑排除