Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Registry remote auslesen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Registry remote auslesen

    Hallo,

    ich bin in Sachen PHP relativer Anfänger. Mein Problem ist aber glaube ich doch relativ knifflig...

    Ich bin bei uns im Büro Nebenbei-Hobby-Admin und möchte eine EDV-Inventarliste basteln.

    Dafür frage ich mit WMI einige PC-Daten ab.

    PHP-Code:
    <?PHP
    $VERBINDUNG
    =$_GET['PC'];
    $cmd=shell_exec("ping -n 1 $VERBINDUNG");
    if (!
    strpos($cmd"Zielhost nicht erreichbar"))
    {
    $loc=new COM("WbemScripting.SWbemLocator");
    $wmi=$loc->ConnectServer($VERBINDUNG,"root/cimv2",$DomAdmin,$DomAdminPW)
    ?>
    <H1>Konfiguration</H1><br />
    <b>System:</b><br />
    <?PHP
    $SYSs 
    $wmi->ExecQuery("Select * from Win32_ComputerSystem");
    foreach (
    $SYSs as $SYS)
    {
    echo 
    "Name: ".$SYS->Name."<br />";
    echo 
    "Dom&auml;ne: ".$SYS->Domain."<br />";
    }
    }
    ?>
    usw.

    Auch die installierten Programme kann man so ja abfragen
    PHP-Code:
    <br /><b>Installierte Programme:</b><br />
    <?PHP
    set_time_limit
    (120);
    $PROs $wmi->ExecQuery("Select * from Win32_Product");
    foreach (
    $PROs as $PRO)
    {
    echo 
    $PRO->Name." - ".$PRO->Version." - ".substr($PRO->InstallDate2,6,2).".".substr($PRO->InstallDate2,4,2).".".substr($PRO->InstallDate2,0,4)."<br />";
    }
    Allerdings sind hier nur die Programme aufgelistet, die mit dem Windows Installer installiert wurden...
    Da wir einige "exotische" Programme nutzen, und ich hier wissen will, ob und in welcher Version sie installiert sind, reicht mir das so nicht.

    Also wollte ich an die Registry ran...

    PHP-Code:
    <?php
        set_time_limit
    (600);
        
    define('HKLM'0x80000002);
        
    $server_name = array(Username=>$DomAdminPassword=>$DomAdminPW);
        
    $reg = new COM("winmgmts:{impersonationLevel=impersonate}!\\\\".$VERBINDUNG."\\root\\default:StdRegProv"$server_name);
        
    $key_path 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall';
        
    $sub_paths = new VARIANT();
        
    $Names = new VARIANT();
        
    $Types = new VARIANT();
        
    $DName = new VARIANT();
        
    $DVersion = new VARIANT();

        
    $reg->EnumKey(HKLM$key_path$sub_paths);
        print 
    $server_name['Username']." - ".$server_name['Password'];
        foreach(
    $sub_paths as $sub_path){
            
    $key_path2=$key_path.'\\'.$sub_path;
            
            
    $ergebnis=$reg->EnumValues(HKLM$key_path2$Names$Types);
            if(
    $ergebnis==&& count($Names)>1){
                for(
    $i 0$i count($Names); $i++){
                    if(
    $Names[$i]=="DisplayName" && $Types[$i]==1){
                        
    $reg->GetStringValue(HKLM$key_path2"DisplayName"$DName);
                    }
                    if(
    $Names[$i]=="DisplayVersion" && $Types[$i]==1){
                        
    $reg->GetStringValue(HKLM$key_path2"DisplayVersion"$DVersion);
                    }
                }
                if(
    $DName){
                    print 
    $DName;
                }
                if(
    $DVersion){
                    print 
    " -- ".$DVersion."<br />";
                }
                else{
                    print 
    "<br />";
                }
            }
        } 
        print 
    "Ende Test";
    ?>
    funktioniert lokal (auf dem Webserver) wunderbar und liefert mir alles, was ich brauche.
    Auf anderen PCs klappt das aber nicht.
    Das Problem ist, so wie ich das sehe, dass PHP unter dem Benutzer "SYSTEM" läuft und dieser bei Remote-PCs natürlich keine Rechte hat.

    Obwohl ich die Zugangsdaten des Domänen-Admins beim Aufruf der COM-Klasse in der Variable $server_name mitgebe, läuft der CMD-Prozess unter SYSTEM (im Taskmanager überprüft).

    Wie kann man sowas unter einem anderen Benutzerkonto (Admin) ausführen?

    PHP-Code:
    <?php
    $PSOFT 
    shell_exec("cmd.exe /c reg query \\\\".$VERBINDUNG."\\HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall /s /v DisplayName 2>&1");  
    ?>
    wäre ein anderer Weg, den ich versucht habe, hänge hier aber ebenso am Benutzerkonto.

    Kennt jemand einen Weg, die Registry anderer PCs auszulesen?

    Gruß und Danke,
    Stefan

  • #2
    WQL nutzen und direkt auf die entfernten Maschinen verbinden.

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Mit entsprechenden Benutzerkonten die nur für die Remote-Administration gedacht sind und entsprechenden Sicherheits-Regeln kannst du durchaus auch Anwendungen deinstallieren / installieren.

    Du brauchst nur COM dafür und solltest mit Variant-Instanzen umgehen können.
    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

    Kommentar


    • #3
      Ich habs gelöst

      Allerdings bietet die Klasse keine Eigenschaften, die man mit WQL auslesen könnte...

      Die Lösung war, wie ich auf die Klasse zugreife.

      Statt
      PHP-Code:
      $server_name = array(Username=>"$DomAdmin"Password=>"$DomAdminPW");
      $reg = new COM("winmgmts:{impersonationLevel=impersonate}!\\\\".$VERBINDUNG."\\root\\default:StdRegProv"$server_name); 
      nutze ich
      PHP-Code:
      $loc=new COM("WbemScripting.SWbemLocator");
      $wmi=$loc->ConnectServer($VERBINDUNG,"root/default","$DomAdmin","$DomAdminPW");
      $reg=$wmi->Get("StdRegProv"); 
      und schon klappts mit allen Domänen-PCs

      Trotzdem Danke,
      Stefan

      Kommentar

      Lädt...
      X