none
Auflistung aller Computer im Netzwerk RRS feed

  • Frage

  • Hallo zusammen!

    Ich möchte mir mit Powershell alle Computer ausgeben, die zurzeit im Netzwerk online sind. Verschiedene Versuche führen allerdings zu unterschiedlichen Ergebnissen...

    In einer Domäne kann ich das mithilfe des Active-Directory-Moduls von Microsoft oder Quest erledigen, allerdings möchte ich auf der einen Seite nur ungern extra ein Modul laden müssen und auf der anderen Seite suche ich nach einer allgemeinen Lösung für Netzwerke, also unabhängig von AD/Domain.

    Probiert habe ich bereits net view, wobei mich die zusätzlichen Beschreibungen und Backslashs stören. Um diese zu entfernen nutze ich folgenden Befehl:

    FOR /F "skip=3 delims=\	 " %%A IN ('NET VIEW') DO @ECHO %%A >> U:\computers.txt

    Den Code speichere ich in einer .bat, die ich per PS aufrufe, da PS nachdem "FOR" eine Klammer erwartet. Wenn ich im Anschluss die Anzahl mit (Get-Content computers.txt | measure).Count auslese, komme ich auf eine andere Anzahl als wenn ich mir per Windows-Explorer --> Netzwerk alle Computer anzeigen lasse. Dort sind es immer mehr. Auch wenn ich net view ohne Kürzungen ausführe, erreiche ich nicht die Anzal des Explorers. Eine andere Lösung, die ich gefunden habe basiert auf System.DirectoryServices.DirectoryEntry bzw. System.DirectoryServices.DirectorySearcher, wobei die Anzahl dort immer 1000 ist. Scheint auch nicht zu passen. Code dazu:

    $strCategory = "computer"
    
    $objDomain = New-Object System.DirectoryServices.DirectoryEntry
    
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.Filter = ("(objectCategory=$strCategory)")
    
    $colProplist = "name"
    foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}
    
    $colResults = $objSearcher.FindAll()
    
    foreach ($objResult in $colResults)
        {$objComputer = $objResult.Properties; $objComputer.name}

    Ich habe gelesen, dass net view nicht alle Computer findet, weil diese dafür konfiguriert sein müssen und das bei manchen nicht der Fall ist. Warum zeigen außerdem alle drei Methoden unterschiedliche Anzahlen an?

    Mich würde daher interessieren, wo mein Fehler liegt bzw. wie ich eine verlässliche, mit dem Explorer übereinstimmende Liste aus aktiven PCs des Netzwerks generieren kann.

    Vielen Dank und Gruß

    Scriptex


    • Bearbeitet Scriptex Montag, 2. Dezember 2013 12:37
    Montag, 2. Dezember 2013 12:34

Antworten

  • Also Net View ist der falsche Weg!

    Ich sitze hier in einem Active Directory mit ca 100000 Rechnern.

    Wenn ich "Net View" mache bekomme ich 263 Rechner zurück, die in meinem Subnetz sind.

    Ich vermute mal das "Net View" nur im Subnetz (des Routers) arbeitet!

    eine Suche im Internet bestätigt das!

    siehe: http://lmgtfy.com/?q=Net+View+only+subnet

    Mit "Net View" bekommt man also auch nicht alle Rechner!

    Auch der Windows Explorer (Netzwerk) Zeigt nicht alle 100000 Rechner an und braucht auch sehr lange ;-)hier werden mir nur 244 Rechner angezeigt.

    Das heißt, auch dies ist auf das Subnetzt beschränkt!

    Es gibt kein Programm das diese Aufgabe ordentlich in einer angemessenen Zeit bewältigen kann

    Die einzige Möglichkeit die ich kenne, ist es das Active Directory nach allen Rechner zu fragen und diese dann anzupingen ob sie "Eingeschaltet" sind.

    Wenn du keine Active Directory PowerShell Modul laden willst bleibt dir nur der  System.DirectoryServices.DirectorySearcher  und mein superschnelles Ping:

    siehe: http://www.powershellmagazine.com/2012/10/19/pstip-how-to-speed-up-the-test-connection-command/

    # Pfad hier anpassen
    $SearchRoot = 'LDAP://DC=contoso,DC=local'
    
    Function Test-ConnectionQuietFast {
     
        [CmdletBinding()]
        param(
        [String]$ComputerName,
        [int]$Count = 1,
        [int]$Delay = 500
        )
     
        for($I = 1; $I -lt $Count + 1 ; $i++)
        {
            Write-Verbose "Ping Computer: $ComputerName, $I try with delay $Delay milliseconds"
     
            # Test the connection quiet to the computer with one ping
            If (Test-Connection -ComputerName $ComputerName -Quiet -Count 1)
            {
                # Computer can be contacted, return $True
                Write-Verbose "Computer: $ComputerName is alive! With $I ping tries and a delay of $Delay milliseconds"
                return $True
            }
     
            # delay between each pings
            Start-Sleep -Milliseconds $Delay
        }
     
        # Computer cannot be contacted, return $False
        Write-Verbose "Computer: $ComputerName cannot be contacted! With $Count ping tries and a delay of $Delay milliseconds"
        $False
    }
    
    
    # AdsiSearcher erstellen und ALLE Computer suchen
    
    $ADSearcher = [adsisearcher]'(ObjectCategory=Computer)' 
    $ADSearcher.searchroot = $SearchRoot
    $ADSearcher.pagesize = 1000 # findet mehr als 1000 ergebnisse auch wenn da 1000 steht! 
    $Computers = $ADSearcher.findall() 
    
    
    ForEach($Computer in $Computers){
        
        # testen ob der Computer Online ist
        If(Test-ConnectionQuietFast -ComputerName $Computer.properties.item("name") -Count 2 -Delay 300) {
            $Computer.properties.item("name")
        }
    }
     


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Bearbeitet Peter Kriegel Dienstag, 3. Dezember 2013 09:49
    • Als Antwort markiert Scriptex Mittwoch, 4. Dezember 2013 06:29
    Dienstag, 3. Dezember 2013 09:16
  • Hallo,

    das kannst Du auf viele verschiedene Arten machen, suche einfach mal nach net view und powershell, da solltest du zahlreiche Versionen finden...

    Ansonsten gilt die Einschraenkung die Peter aufgefuehrt hat.

    Mit seiner Loesung bekommst Du alle aktiven Rechner der Domain, sollte es aber auch Rechner geben die keinen Computer Account in der Domain haben huschen diese auch durch und je nach Anzahl der Rechner in der Domain duerfte das Ergebnis auch schnon nicht mehr den Tatsachen entsprechen, also wenn er den letzten gepingt hat, koennen schon wieder welche dazu gekommen sein, oder weg sein, insbesondere bei Arbeitsbeginn oder -ende.

    Ich glaube es gibt keine saubere Art und Weise, alle im Moment aktiven Rechner zu finden, denn auch die Anzeige im Explorer ist nicht immer korrekt, dort fehlen teilweise auch Rechner obwohl sie aktiv sind und auch im gleichen Subnetz usw.

    Beste Gruesse
    brima

    • Als Antwort markiert Scriptex Mittwoch, 4. Dezember 2013 06:29
    Dienstag, 3. Dezember 2013 10:02

Alle Antworten

  • Hallo,

    so kannst Du z.B.: auch in der Powershell die stoerenden Ausgabezeilen und \ von net view entfernen:

    ((net view) | select-string '\\\\') -replace '^\\\\','' -replace '\s*\W.*',''

    Dein zweites Codebeispiel liefert nicht die aktiven Computer im Netz sondern alle Computeraccounts aus dem AD.

    Und dort gibt es ein Limit, dass auf 1000 gesetzt ist, nennt sich glaube ich DirectorySearcher.SizeLimit.

    hier noch einen Link dazu:
    http://marco-difeo.de/2011/10/10/active-directory-supersoni-and-the-directory-searcher/


    Beste Gruesse
    brima



    • Bearbeitet brima Montag, 2. Dezember 2013 13:11
    Montag, 2. Dezember 2013 13:03
  • Hallo brima,

    besten Dank für den Hinweis, das macht mir das Entfernen auf jeden Fall einfacher. Wäre es nicht auch irgendwie mit Substring(3) und Trim() möglich zu realisieren?

    Zum Thema, da der DirectorySearcher dann also nach Accounts schaut, bleibt mir nur net view oder andere Methoden. Kann ich nicht dieselbe Methode nutzen, die im Hintergrund im Windows-Explorer genutzt wird?

    Gruß Scriptex

    Dienstag, 3. Dezember 2013 08:07
  • Also Net View ist der falsche Weg!

    Ich sitze hier in einem Active Directory mit ca 100000 Rechnern.

    Wenn ich "Net View" mache bekomme ich 263 Rechner zurück, die in meinem Subnetz sind.

    Ich vermute mal das "Net View" nur im Subnetz (des Routers) arbeitet!

    eine Suche im Internet bestätigt das!

    siehe: http://lmgtfy.com/?q=Net+View+only+subnet

    Mit "Net View" bekommt man also auch nicht alle Rechner!

    Auch der Windows Explorer (Netzwerk) Zeigt nicht alle 100000 Rechner an und braucht auch sehr lange ;-)hier werden mir nur 244 Rechner angezeigt.

    Das heißt, auch dies ist auf das Subnetzt beschränkt!

    Es gibt kein Programm das diese Aufgabe ordentlich in einer angemessenen Zeit bewältigen kann

    Die einzige Möglichkeit die ich kenne, ist es das Active Directory nach allen Rechner zu fragen und diese dann anzupingen ob sie "Eingeschaltet" sind.

    Wenn du keine Active Directory PowerShell Modul laden willst bleibt dir nur der  System.DirectoryServices.DirectorySearcher  und mein superschnelles Ping:

    siehe: http://www.powershellmagazine.com/2012/10/19/pstip-how-to-speed-up-the-test-connection-command/

    # Pfad hier anpassen
    $SearchRoot = 'LDAP://DC=contoso,DC=local'
    
    Function Test-ConnectionQuietFast {
     
        [CmdletBinding()]
        param(
        [String]$ComputerName,
        [int]$Count = 1,
        [int]$Delay = 500
        )
     
        for($I = 1; $I -lt $Count + 1 ; $i++)
        {
            Write-Verbose "Ping Computer: $ComputerName, $I try with delay $Delay milliseconds"
     
            # Test the connection quiet to the computer with one ping
            If (Test-Connection -ComputerName $ComputerName -Quiet -Count 1)
            {
                # Computer can be contacted, return $True
                Write-Verbose "Computer: $ComputerName is alive! With $I ping tries and a delay of $Delay milliseconds"
                return $True
            }
     
            # delay between each pings
            Start-Sleep -Milliseconds $Delay
        }
     
        # Computer cannot be contacted, return $False
        Write-Verbose "Computer: $ComputerName cannot be contacted! With $Count ping tries and a delay of $Delay milliseconds"
        $False
    }
    
    
    # AdsiSearcher erstellen und ALLE Computer suchen
    
    $ADSearcher = [adsisearcher]'(ObjectCategory=Computer)' 
    $ADSearcher.searchroot = $SearchRoot
    $ADSearcher.pagesize = 1000 # findet mehr als 1000 ergebnisse auch wenn da 1000 steht! 
    $Computers = $ADSearcher.findall() 
    
    
    ForEach($Computer in $Computers){
        
        # testen ob der Computer Online ist
        If(Test-ConnectionQuietFast -ComputerName $Computer.properties.item("name") -Count 2 -Delay 300) {
            $Computer.properties.item("name")
        }
    }
     


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Bearbeitet Peter Kriegel Dienstag, 3. Dezember 2013 09:49
    • Als Antwort markiert Scriptex Mittwoch, 4. Dezember 2013 06:29
    Dienstag, 3. Dezember 2013 09:16
  • Hallo,

    das kannst Du auf viele verschiedene Arten machen, suche einfach mal nach net view und powershell, da solltest du zahlreiche Versionen finden...

    Ansonsten gilt die Einschraenkung die Peter aufgefuehrt hat.

    Mit seiner Loesung bekommst Du alle aktiven Rechner der Domain, sollte es aber auch Rechner geben die keinen Computer Account in der Domain haben huschen diese auch durch und je nach Anzahl der Rechner in der Domain duerfte das Ergebnis auch schnon nicht mehr den Tatsachen entsprechen, also wenn er den letzten gepingt hat, koennen schon wieder welche dazu gekommen sein, oder weg sein, insbesondere bei Arbeitsbeginn oder -ende.

    Ich glaube es gibt keine saubere Art und Weise, alle im Moment aktiven Rechner zu finden, denn auch die Anzeige im Explorer ist nicht immer korrekt, dort fehlen teilweise auch Rechner obwohl sie aktiv sind und auch im gleichen Subnetz usw.

    Beste Gruesse
    brima

    • Als Antwort markiert Scriptex Mittwoch, 4. Dezember 2013 06:29
    Dienstag, 3. Dezember 2013 10:02

  • Ich glaube es gibt keine saubere Art und Weise, alle im Moment aktiven Rechner zu finden, denn auch die Anzeige im Explorer ist nicht immer korrekt, dort fehlen teilweise auch Rechner obwohl sie aktiv sind und auch im gleichen Subnetz usw.

    So ist es!

    Einige Administratoren benutzen ein Script das bei jedem Rechner Start einen Eintrag auf einem Share macht. Wenn der Rechner sauber runter gefahren wird, macht ein Abmeldescript den entsprechenden LogOff Eintrag.

    Dies hat den Vorteil das man an nur einem Punkt im Unternehmen rasend schnell sehen kann wer ON und wer OFF ist. Aber auch dies ist nicht sauber und benötigt die Scripte auf jedem Rechner.

    Wenn das Share mal nicht erreichbar ist, dann guckt man in die röhre....

    Auch hier kann man das AD  dazu missbrauchen. Einige Administratoren erlauben es den Rechner Attribute im AD zu setzen. 

    P.S. Wenn man eine Domäne hat, sollten alle Rechner auch drin sein. Auch Unix/Linux bekommt man in die Domäne oder in einen Alternativen Verzeichnis Dienst. Nur so kann man vernünftig verwalten!


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 3. Dezember 2013 11:01
  • Vielen Dank, an euch beide! Wieder etwas gelernt...

    Analog zum Pingen der AD-Accounts in einer Domäne sollte eine mögliche Lösung in einem einfachen Netzwerk durch das Pingen der genutzten IP-Range realisierbar sein. Sind mir alle Subnets bekannt, kann ich (vielleicht auch pro Subnet) ein Script schreiben, das jede darin befindliche IP pingt und bei Erfolg den PC-Namen ausgibt.

    Dass solche Methoden, wie von euch schon angemerkt, mit steigender Geräteanzahl immer ungenauer werden, erklärt sich dann auch von selbst. Dies nur als Idee für Netzwerke ohne AD / andere zentrale Verzeichnisse.

    Gruß Scriptex

    Mittwoch, 4. Dezember 2013 06:37
  • Hallo!

    Ich benutze nach wie vor net view (ist einfach am schnellsten).

    Einfach in jedem subnet 1 Rechner  Server finden der immer eingeschaltet ist und dann mit psexec net view dort ausführen.

    net view > pcscan.lst
    psexec srv-subnet1 net view >> pcscan.lst
    psexec srv-subnet2 net view >> pcscan.lst

    (Bitte vor srv \\ setzen) der nimmt hier keine links :-(
    Grüße

    Donnerstag, 20. März 2014 10:01