【问题标题】:Query WMI remotely with PHP使用 PHP 远程查询 WMI
【发布时间】:2010-10-03 05:28:18
【问题描述】:

我当前的代码如下所示:

define ( 'CPU_NAME', 'remote_server' );
$obj = new COM ( 'winmgmts:{impersonationLevel=impersonate}//' . CPU_NAME . '/root/cimv2' );
if ( is_object ( $obj ) ){ 
     $process = $obj->execquery ( "SELECT * FROM Win32_Process" );
}

我应该将远程服务器的登录凭据放在哪里? 我看到它需要一个用户名和密码,但我不确定如何实现。

任何帮助将不胜感激。

参考:http://us3.php.net/manual/en/class.com.php

【问题讨论】:

  • 你说的是什么意思?“我知道它需要用户名和密码,但我不知道如何实现。”?如果你能看到密码的去向——你怎么会不知道把它放在哪里?
  • 我看到它接受一个,但不接受它。任何帮助将不胜感激。
  • 你确实在 php.ini 中启用了 DCOM,对吧?

标签: php windows wmi wmi-query


【解决方案1】:
<?php
    $obj = new COM ( 'winmgmts://localhost/root/CIMV2' );
    $fso = new COM ( "Scripting.FileSystemObject" );    
    $wmi_computersystem    =    $obj->ExecQuery("Select * from Win32_ComputerSystem");
    $wmi_bios              =    $obj->ExecQuery("Select * from Win32_BIOS");
    $processor             =    $obj->ExecQuery("Select * from Win32_Processor");
    $PhysicalMemory        =    $obj->ExecQuery("Select * from Win32_PhysicalMemory");
    $BaseBoard             =    $obj->ExecQuery("Select * from Win32_BaseBoard"); 
    $LogicalDisk           =    $obj->ExecQuery("Select * from Win32_LogicalDisk");


    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;
    }

    foreach ( $processor as $wmi_processor )
    {
        $idprocessor = $wmi_processor->ProcessorId;
        $Architecture = $wmi_processor->Architecture;
        $Name = $wmi_processor->Name;
        $Version = $wmi_processor->Version;
    }
    foreach ( $PhysicalMemory as $wmi_PhysicalMemory )
    {
        $Capacity = $wmi_PhysicalMemory->Capacity;
        $PartNumber = $wmi_PhysicalMemory->PartNumber;
        $Name = $wmi_PhysicalMemory->Name;
    }

    foreach ( $BaseBoard as $wmi_BaseBoard )
    {
        $SerialNumber = $wmi_BaseBoard->SerialNumber;

    }
    foreach ( $LogicalDisk as $wmi_LogicalDisk )
    {
        $SerialNumberDisk = $wmi_LogicalDisk->VolumeSerialNumber;
        $FileSystem = $wmi_LogicalDisk->FileSystem;

    }

    echo "Bios version   : ".$bios_version."<br/>
          Serial number of bios  : ".$serial."<br/>
          Hardware Model : ".$model."<br/>
          ID-Processor : ".$idprocessor."<br/>
          Architecture-Processor : ".$Architecture."<br/>
          Name-Processor : ".$Name."<br/>
          Version-Processor : ".$Version."<br/>
          <hr>
          <hr>
          PhysicalMemory
          <hr>
          <hr>
          Capacity : ".$Capacity."<br/>
          Name : ".$Name."<br/>
          <hr>
          <hr>
          carte mere
          <hr>
          <hr>
          SerialNumber : ".$SerialNumber."<br/>
           <hr>
          <hr>
          disk
          <hr>
          <hr>
          SerialNumber : ".$SerialNumberDisk."<br/>
          FileSystem : ".$FileSystem."<br>
          ";

?>

【讨论】:

    【解决方案2】:
    <?php
        $strComputer = "YOURREMOTEHOST";
        $objSWbemLocator = new COM ("WbemScripting.SWbemLocator");
        $objSWbemServices = $objSWbemLocator->ConnectServer($strComputer, "root\cimv2", "DOMAIN\USER", "Password");
        $objSWbemServices->Security_->ImpersonationLevel = 3;
        $obj = $objSWbemServices;
        $fso = new COM ( "Scripting.FileSystemObject" );
    
        //... insert your code here
    
        //... insert your code here
    ?>
    

    【讨论】:

      【解决方案3】:

      正在连接

      对于全球管理员

      define("NAMECOMP", 'COMP1'); // COMP1 - name or ip of local or remote computer 
      $WMI= new COM ( 'winmgmts:{impersonationLevel=impersonate}//'. NAMECOMP.'/root/cimv2' ); 
      

      使用登录名和密码

      $objLocator = new COM("WbemScripting.SWbemLocator");
      $objService = $objLocator->ConnectServer(
                      'ComputerName', //name/ip remote/local comp
                      "root\cimv2",
                      'login', //login remote/local comp
                      'password', //password remote/local comp
                      "MS_409",
                      "ntlmdomain: YourDomain" //domain remote/local comp
                  );
      

      获取信息

      $CountCore=0;
      foreach ($WMI->instancesof ( 'Win32_Processor' ) as $proc ) {
        ++$CountCore;
      }
      echo 'Count Core = ' . $CountCore; 
      

      添加速度和套接字处理器信息

      $CountCore=0;
      foreach ($WMI->instancesof ( 'Win32_Processor' ) as $Processor) {
        ++$CountCore;
        $Speed=$Processor->CurrentClockSpeed;
        $Socket=$Processor->SocketDesignation;
      }
      echo 'count core = '.$CountCore;
      echo 'speed = ' . $Speed. 'Mhz';
      echo 'socket = '.$Socket; 
      

      简单地获取其他信息 - 只需替换 instanceof ('Win32_Processor') 的类

      Information of classes WMI

      发送命令

      if ((($_GET['Reboot']==1) OR ($_GET['Shutdown']==1))) { 
       
        define("NAMECOMP", 'COMP1');
                
        $WMI= new COM('winmgmts:{impersonationLevel=impersonate,(Shutdown)}//'. NAMECOMP.'/root/cimv2'); 
        
        foreach($WMI->instancesof('Win32_OperatingSystem') as $mp)  {
            if ($_GET['Reboot']==1) {
                $mp->Reboot; 
            }
            if ($_GET['Shutdown']==1) {
                $mp->Shutdown; 
            }
      }
      

      链接:

      WMI Isn't Working!

      Component_Object_Model

      Win32 Classes

      For Yii Framework

      【讨论】:

        【解决方案4】:

        我知道这个帖子不是最新的,但可能这个信息对某人有帮助。 如果您尝试在远程计算机上读取或写入 Registy 密钥或安装的软件类,则需要通过查询应该运行的体系结构。你可以使用这样的东西。

        function Connect($server = "RemotePC",$namespace = "root/CIMV2",$impersonate = 3,$Architecture = 64,$userid = null,$password = null){
                try {
                    $wbemnvs = new COM("WbemScripting.SWbemNamedValueSet");
                    $wbemnvs->add("__ProviderArchitecture", $Architecture);
                    $wbemnvs->add("__RequiredArchitecture", true);
                    $wmiLocator = new COM("WbemScripting.SWbemLocator");
                    $this->wmiNameSpace = $wmiLocator->ConnectServer($server, $namespace, $userid, $password,null,null,128,$wbemnvs);
                    if($this->wmiNameSpace){
                        $this->ConnectedServer = $server;
                    }else{ return false; }
                    if($impersonate){
                        // mehr infos: http://msdn.microsoft.com/en-us/library/aa393618%28v=vs.85%29.aspx
                        $this->wmiNameSpace->Security_->ImpersonationLevel = $impersonate;
                    }
                    return true;
                }
                catch(Exception $e){
                    $this->wmiNameSpace = NULL;
                    return false;
                }
            }
        

        查看我的 wmi.class.php:http://scbbb.blogspot.de/2014/02/wmi-via-php.html

        【讨论】:

          猜你喜欢
          • 2014-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-07
          相关资源
          最近更新 更多