WMI mit PHP

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • WMI mit PHP

    Hallo,

    Frage:

    kann man mit PHP auf WMI zugreifen bzw. auslesen.

    Ich muss eine Inventarisierung der Hardware und Software vornehmen.
    Ich habe eine Datenbank die ich auch füllen kann:-) aber an jedem Arbeitsplatz die hinundhergelickerei. kann man nicht die Daten auslesen und direkt in die datenbank einspeichern? dann währe es in einem rutsch fertig!
    Auf eine Antwort würde ich mich freuen!

  • #2
    hi bottona,


    ist alles kein problem...

    $loc=new COM("WbemScripting.SWbemLocator");
    $wmi=$loc->ConnectServer("pc","root/cimv2","username","passwort");

    $OSs = $wmi->ExecQuery("Select Caption, SerialNumber, ServicePackMajorVersion from Win32_OperatingSystem");

    foreach ($OSs as $OS)
    {
    $OSDesc=trim($OS->Caption);
    $OSDesc=str_replace("(R)","",$OSDesc);
    $OSDesc=str_replace("Microsoft ","",$OSDesc);
    #echo $OSDesc;

    $OSCap=explode(" ",$OSDesc);
    $OSCap=$OSCap[0]." ".$OSCap[1]." ".$OSCap[2];
    #echo $OSCap;
    $lic=trim($OS->SerialNumber);
    #echo $lic."<br>";

    $OSSP=trim($OS->ServicePackMajorVersion);


    und so weiter...

    Win XP
    Apache 2.0.48
    PHP 5.0.2

    läuft leider nur unter Windows, da Linux (meines Wissens nach) kein WMI kann...

    hatte nur ein kleines Prob, daß mein Apache keine Rechte hatte.
    Änder den Dienst ab, damit er als Admin gestartet wird, und es läuft.


    PS: Wenn du ne Lösung findest, wie du Registry-Einträge auslesen kannst (über StdRegProv), gib mir Bescheid...


    Gruß

    Kommentar


    • #3
      Hi, ich habe es so probiert:

      <?php
      $loc=new COM("WbemScripting.SWbemLocator");
      $wmi=$loc->ConnectServer("pc","root/cimv2","benutzer","passwort");

      $OSs = $wmi->ExecQuery("Select Caption, SerialNumber, ServicePackMajorVersion from Win32_OperatingSystem");

      foreach ($OSs as $OS)
      {
      $OSDesc=trim($OS->Caption);
      $OSDesc=str_replace("(R)","",$OSDesc);
      $OSDesc=str_replace("Microsoft ","",$OSDesc);
      #echo $OSDesc;

      $OSCap=explode(" ",$OSDesc);
      $OSCap=$OSCap[0]." ".$OSCap[1]." ".$OSCap[2];
      #echo $OSCap;
      $lic=trim($OS->SerialNumber);
      #echo $lic."<br>";

      $OSSP=trim($OS->ServicePackMajorVersion);

      ?>

      und er gibt mir folgende Fehlermeldung:

      Parse error: syntax error, unexpected $end in D:\apachefriends\xampp\htdocs\jugaintra\lesetest3.php on line 32

      ich bin nicht der crack im programmieren,

      was mache ich falsch?

      Kommentar


      • #4
        da fehlt die } für das foreach

        Gruß,
        Thomas

        Kommentar


        • #5
          Ja Danke,
          ich bin ein depp, wer lesen kann ist klar im vorteil. sorry.
          aber trotzdem, gibt er mir diese Meldung.

          Fatal error: Uncaught exception 'com_exception' with message 'Source: SWbemLocator
          Description: Der RPC-Server ist nicht verfügbar. ' in D:\apachefriends\xampp\htdocs\jugaintra\lesetest3.php:10 Stack trace: #0 {main} thrown in D:\apachefriends\xampp\htdocs\jugaintra\lesetest3.php on line 10

          WinXP
          Xampp
          PHP5

          Gruss
          Bottona

          Kommentar


          • #6
            Habt ihr ne Domäne bei euch im Haus?
            Und sind die RPC-Dienste aktiv?

            Probiers ma testweiße von der Console, ob du ne WMI-Verbindung hinbekommst
            (z.B. mit "WMIC /node:rechner1 [/user:administrator] os get Caption" - sollte den Namen des Betriebsystems ausspucken)
            wenn des funkt, muß ich nochma tiefer gehen...


            Gruß
            Robert

            Kommentar


            • #7
              Ich hab mal was zusammengeschrieben. Damit klappt´s bei mir. Mit dem Skript von bottona gings bei mir auch nicht.

              Hier haste eine kleine Funktion, die dir ALLES von einer Klasse liefert. Im Beispiel sind drei Klassen aufgeführt. Für dich ist wohl die Win32_Product interessant. Wenn Du den eigenen Rechner abfragen willst, darfst du keinen Hostname angeben: $arrSoftware = getWMI('Win32_Product');

              PHP-Code:
              <?

              function getWMI($strClass,$strHostname ='', $strUser ='', $strPassword = '') {

                  $objLocator = new COM("WbemScripting.SWbemLocator");
                  if($strHostname == "") {
                      $objService = $objLocator->ConnectServer();
                  } else{
                      $objService = $objLocator->ConnectServer($strHostname, "root\cimv2", "$strHostname\\$strUser", $strPassword);
                  }
                  
                  $objWEBM = $objService->Get($strClass);
                  $objProp = $objWEBM->Properties_;
                  
                  $arrProp = $objProp->Next($objProp->Count);

                  $objWEBMCol = $objWEBM->Instances_();
                  $arrWEBMCol = $objWEBMCol->Next($objWEBMCol->Count);
                  foreach($arrWEBMCol as $objItem)
                  {
                      reset($arrProp);
                      $arrInstance = array();
                      foreach($arrProp as $propItem)
                      {
                          eval("\$value = \$objItem->" .$propItem->Name .";");
                          $arrInstance[$propItem->Name] = trim($value);
                      }
                      $arrData[] = $arrInstance;
                  }
                  return $arrData;
              }


              echo "<pre>";
              //print_r(getWMI("", "Win32_Processor"));
              print_r(getWMI("Win32_Product", "192.168.0.56", "administrator", "password"));
              //print_r(getWMI("", "Win32_Process"));
              echo "</pre>";

              ?>
              Aaarrggghhh!!!! Bitte korrigiere die eine Zeile. Es wird \\ und nicht \ benötigt, aber das Board verbuchselt das.

              $objService = $objLocator->ConnectServer($strHostname, "rootcimv2", "$strHostname\\$strUser", $strPassword);
              Zuletzt geändert von cst; 22.02.2005, 15:35.
              Ich denke, also bin ich.
              Manche sind trotzdem!

              Kommentar


              • #8
                so, obwohl das ganze schon etwas veraltet ist, bringe ich hier meine frage unter.

                ich habe das script von cst eingesetzt, es funktioniert auch, leider bekomme ich von dem wert, den ich am meisten haben will, keine daten.

                ich möchte per php über die wmi die aktuelle cpu last auslesen (ht prozessor).

                leider liefert loadpercentage keinen wert, hat jemand ahnung wie man das behebt ?

                system: 3,2 GhZ PIV 540J HT
                os: windows xp sp2
                httpd: apache 2.0.53
                php: php 4.3.11

                script:

                Code:
                 function getWMI($strClass,$strHostname ='NAME', $strUser ='USER', $strPassword = 'PW') {
                
                    $objLocator = new COM("WbemScripting.SWbemLocator");
                    if($strHostname == "") {
                        $objService = $objLocator->ConnectServer();
                    } else{
                        $objService = $objLocator->ConnectServer($strHostname, "rootcimv2", "$strHostname\\$strUser", $strPassword);
                    }
                
                    $objWEBM = $objService->Get($strClass);
                    $objProp = $objWEBM->Properties_;
                
                    $arrProp = $objProp->Next($objProp->Count);
                
                    $objWEBMCol = $objWEBM->Instances_();
                    $arrWEBMCol = $objWEBMCol->Next($objWEBMCol->Count);
                    foreach($arrWEBMCol as $objItem)
                    {
                        reset($arrProp);
                        $arrInstance = array();
                        foreach($arrProp as $propItem)
                        {
                            eval("\$value = \$objItem->" .$propItem->Name .";");
                            $arrInstance[$propItem->Name] = trim($value);
                        }
                        $arrData[] = $arrInstance;
                    }
                    return $arrData;
                }
                
                
                echo "<pre>";
                
                print_r(getWMI("Win32_Processor", "", "USER", "PW"));
                
                echo "</pre>";

                ausgabe:

                Code:
                Array
                (
                    [0] => Array
                        (
                            [AddressWidth] => 32
                            [Architecture] => 0
                            [Availability] => 3
                            [Caption] => x86 Family 15 Model 4 Stepping 1
                            [ConfigManagerErrorCode] => 
                            [ConfigManagerUserConfig] => 
                            [CpuStatus] => 1
                            [CreationClassName] => Win32_Processor
                            [CurrentClockSpeed] => 3215
                            [CurrentVoltage] => 14
                            [DataWidth] => 32
                            [Description] => x86 Family 15 Model 4 Stepping 1
                            [DeviceID] => CPU0
                            [ErrorCleared] => 
                            [ErrorDescription] => 
                            [ExtClock] => 200
                            [Family] => 2
                            [InstallDate] => 
                            [L2CacheSize] => 0
                            [L2CacheSpeed] => 
                            [LastErrorCode] => 
                            [Level] => 15
                            [LoadPercentage] => 
                            [Manufacturer] => GenuineIntel
                            [MaxClockSpeed] => 3215
                            [Name] => Intel(R) Pentium(R) 4 CPU 3.20GHz
                            [OtherFamilyDescription] => 
                            [PNPDeviceID] => 
                            [PowerManagementCapabilities] => 
                            [PowerManagementSupported] => 
                            [ProcessorId] => 
                            [ProcessorType] => 3
                            [Revision] => 1025
                            [Role] => CPU
                            [SocketDesignation] => Socket 775
                            [Status] => OK
                            [StatusInfo] => 3
                            [Stepping] => 1
                            [SystemCreationClassName] => Win32_ComputerSystem
                            [SystemName] => NAME
                            [UniqueId] => 
                            [UpgradeMethod] => 15
                            [Version] => Modell 4, Stepping 1
                            [VoltageCaps] => 
                        )
                
                    [1] => Array
                        (
                            [AddressWidth] => 32
                            [Architecture] => 0
                            [Availability] => 3
                            [Caption] => x86 Family 15 Model 4 Stepping 1
                            [ConfigManagerErrorCode] => 
                            [ConfigManagerUserConfig] => 
                            [CpuStatus] => 1
                            [CreationClassName] => Win32_Processor
                            [CurrentClockSpeed] => 3215
                            [CurrentVoltage] => 14
                            [DataWidth] => 32
                            [Description] => x86 Family 15 Model 4 Stepping 1
                            [DeviceID] => CPU1
                            [ErrorCleared] => 
                            [ErrorDescription] => 
                            [ExtClock] => 200
                            [Family] => 2
                            [InstallDate] => 
                            [L2CacheSize] => 0
                            [L2CacheSpeed] => 
                            [LastErrorCode] => 
                            [Level] => 15
                            [LoadPercentage] => 
                            [Manufacturer] => GenuineIntel
                            [MaxClockSpeed] => 3215
                            [Name] => Intel(R) Pentium(R) 4 CPU 3.20GHz
                            [OtherFamilyDescription] => 
                            [PNPDeviceID] => 
                            [PowerManagementCapabilities] => 
                            [PowerManagementSupported] => 
                            [ProcessorId] => 
                            [ProcessorType] => 3
                            [Revision] => 1025
                            [Role] => CPU
                            [SocketDesignation] => Socket 775
                            [Status] => OK
                            [StatusInfo] => 3
                            [Stepping] => 1
                            [SystemCreationClassName] => Win32_ComputerSystem
                            [SystemName] => NAME
                            [UniqueId] => 
                            [UpgradeMethod] => 15
                            [Version] => Modell 4, Stepping 1
                            [VoltageCaps] => 
                        )
                
                )

                Kommentar


                • #9
                  ich würd doch glatt mal behaupten, diese information wird nicht zur verfügung gestellt. zumindest auf diesem system nicht. teste es mal auf anderen rechnern.

                  Kommentar


                  • #10
                    ich kriege auch nicht über das leistungstool von windows einen wert da raus ? woran kann das liegen ? eigentlich doch nur am windows...

                    wo liest denn dann der taskmanager die werte aus ? weil da funktionierts...

                    falls es nicht geht, gibt es noch eine andere möglichkeit per php an die cpu last heranzukommen ?

                    z.b. hab ich für den arbeitsspeicher eine .exe datei, die per explode aufgerufen wird und mir die werte liefert...

                    Kommentar


                    • #11
                      per explode aufgerufen


                      es muss wohl eine externe anwendung her...
                      hab was von 'tasklist' für winxp/2003 gehört.

                      Kommentar

                      Lädt...
                      X