kgfmb
Goto Top

Aktuell angemeldete User und Rechnernamen im Netzwerk ermitteln

Hallo zusammen,

sicher ist diese Frage schon x-mal gestellt worden, aber bisher habe ich noch nicht das gefunden, was ich mir vorstelle.
Ich suche ein Tool (wie immer Freeware) welches mir zum aktuellen Zeitpunkt ermittelt,
welcher User an welchen PC in einem Netzwerk angemeldet ist.

Gerne kann das Tool auch weitere Informationen zum Client (so zum Inventarisiern) aubrufen.

Ich stelle mir es so vor, das ich einen IP-Bereich vorgebe, hier mir die Rechner ermittelt die es gibt und
wo ich zu einem Punkt X die Abfrage starten kann.
Nach einem Lauf kann ich ersehen, welcher User aktuell an der Maschine angemeldet ist.

Danke schonmal im voraus.

Content-ID: 279869

Url: https://administrator.de/contentid/279869

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

michi1983
michi1983 11.08.2015 um 14:10:47 Uhr
Goto Top
Hallo,

innerhalb einer Domäne?

Gruß
KgFmB
KgFmB 11.08.2015 um 14:57:10 Uhr
Goto Top
Ja, innerhalb einer Domäne.
Daher auch die Angabe des IP Bereichs.
Username u PW ist vorhanden.
psannz
psannz 11.08.2015 aktualisiert um 15:00:13 Uhr
Goto Top
Sers,

 WMIC /NODE: xxx.xxx.xxx.xxx COMPUTERSYSTEM GET USERNAME 

Alternativ: Sysinternals: PsLoggedOn

Das ganze lässt sich über eine CSV Datei mit den Computernamen und einer ForEach Schleife auch auf komplette Bereiche anwenden.

Grüße,
Philip
122990
122990 11.08.2015 aktualisiert um 15:25:40 Uhr
Goto Top
Moin,
mit Powershell lässt sich das etwa so machen:
cls
function Send-Ping([string]$device,[int]$delay){
    $ping = New-Object System.Net.NetworkInformation.Ping
    try{
        if($ping.Send($device,$delay).Status -ne "Success"){  
            return $false
        }else{
            return $true
        }
    }catch{return $false}
}

$rngStart = Read-Host "Geben sie die Start-IP ein (bsp. 192.168.1.10)"  
$rngEnd = Read-Host "Geben sie die End-IP ein (bsp. 192.168.1.50)"  
$mS = [regex]::Match($rngStart,'^(\d+\.\d+\.\d+\.)(\d+)')  
$mE = [regex]::Match($rngEnd,'^(\d+\.\d+\.\d+\.)(\d+)')  
$subnet = $mS.Groups[1]
$start = [int]$mS.Groups[2].Value
$end = [int]$mE.Groups[2].Value

write-host 'Ermittle den Online-Status der Rechner ...' -ForegroundColor Green  
$computer_status = @()
$computers = $start..$end | %{
    $computer = "$subnet$_"  
    Write-Progress -Activity "Status der Rechner ermitteln" -Status "Aktuelle IP: $computer" -PercentComplete ((($_ - $start)/($end - $start))*100)  
    
    if (Send-ping $computer 200){
        $user = ""  
        try{
            $user = gwmi Win32_ComputerSystem -ComputerName $computer -EA Stop | select -Expand Username
            if (!$user){
                $user= '(Fehler bei der Abfrage)'  
            }
        }catch{
            $user = '(Fehler bei der Abfrage)'  
        }
        $computer_status += New-Object PSObject -Property @{Computer=$computer;Status='Online';Angemeldet=$user}  
    }else{
        $computer_status += New-Object PSObject -Property @{Computer=$computer;Status='Offline'}  
    }
    
}
write-host "`n$('='*30)`nStatusübersicht:`n$('='*30)" -ForegroundColor Green  
$computer_status | select Computer,Status,Angemeldet | ogv
Gruß grexit
KgFmB
KgFmB 11.08.2015 um 15:51:36 Uhr
Goto Top
Hi,

hatte ich auch schon in Betracht genommen.
Gibt es noch eine alternative... Ohne großen Aufwand und Programmierung zu betreiben?
Daher war ja meine Frage, ob es ein fertiges Tool bereits gibt.

Gruß
KgFmB
KgFmB 11.08.2015 aktualisiert um 16:10:02 Uhr
Goto Top
Hi grexit,

Finde solche Quellcodes immer wieder extrem ausgefuchst...
Nur verstehen tue ich kaum was er wo macht.
Vor allem wie ich so etwas zum Laufen bringe.


gruß

Zusatz: versuche ich es in der Powershell zu starten, kommt
"Es wurde versucht, durch 0 <null> zu teilen.
Bei Zeile:3 Zeichen:127 ...."

Er verlangt aber auch keine Eingabe (was ich vermute aus dem Quelltext zu lesen) von mir.

gruß 2
122990
122990 11.08.2015 aktualisiert um 16:21:52 Uhr
Goto Top
Zitat von @KgFmB:
Zusatz: versuche ich es in der Powershell zu starten, kommt
"Es wurde versucht, durch 0 <null> zu teilen.
Bei Zeile:3 Zeichen:127 ...."
Der dümmste fehler den die Leute hier machen, sie kopieren die Zahlen der Zeilen mit ;-P
Bitte über "Quelltext" oben rechts über dem Code kopieren!!!
KgFmB
KgFmB 11.08.2015 um 16:27:05 Uhr
Goto Top
Sorry muss dich enttäuschen... face-smile
Natürlich habe ich den Quelltext ohne Zeilenangabe gemacht.


Aber, hab es mehr oder weniger nun zum Laufen gebracht....
a) ... den Funktionsnamen "Send-Ping" durch "SendPing" ersetzt... -> irgendwie mag er den Bindestrich nicht...
b) ... Da wo die Eingabe (vermute ich) der Start und Ende IP eingeben werden soll, durch die IPs ersetzt

dadurch habe ich eine Ausgabe bekommen.
122990
122990 11.08.2015 aktualisiert um 16:35:51 Uhr
Goto Top
Zitat von @KgFmB:
Aber, hab es mehr oder weniger nun zum Laufen gebracht....
a) ... den Funktionsnamen "Send-Ping" durch "SendPing" ersetzt... -> irgendwie mag er den Bindestrich
nicht...
Quatsch mit Soße !!
b) ... Da wo die Eingabe (vermute ich) der Start und Ende IP eingeben werden soll, durch die IPs ersetzt
Ebenfalls vollkommener Quatsch, das ganze kommt in eine PS1-Datei.
Der Range wird dann abgefragt !

Du solltest dir erst mal die Grundlagen der Powershell reinpfeifen bevor du hier sowas vom Acker lässt. Ich mache Powershell nicht erst gestern...

Das Skript arbeitet einwandfrei , wenn man es richtig macht.
KgFmB
KgFmB 11.08.2015 um 16:42:10 Uhr
Goto Top
Hey hey hey... Beleidigend wollte ich nicht werden...
Hatte ja gesagt, das ich da kaum Kenntnisse habe und vor denjenigen Respect habe, die dies können...
Aber wie gesagt... nach meinen Anpassungen hat es funktioniert und ich bekam eine Ausgabe.

Also nix für Ungut wenn du dich auf den Schlips getreten fühlst.

Danke trotzdem für deine Mühe.
122990
122990 11.08.2015 aktualisiert um 16:51:08 Uhr
Goto Top
Das Skript muss nur in eine PS1-Datei kopiert werden, dann starten, und dann kommen zwei Benutzerabfragen für den IP-Range, dann erfolgt automatisch die Auswertung der Rechner. Ganz einfach, es muss nichts angepasst werden.
Die Powershell sollte natürlich auf 3.0 upgedated werden, da diese viele Fehler der Version 2.0 bereinigt.
122990
122990 07.10.2015 um 18:25:50 Uhr
Goto Top
Bitte gelöst nicht vergessen. Danke.
10base-will
10base-will 19.02.2019 um 18:50:43 Uhr
Goto Top
Grüße!
Ich muss das Tehma mal wider hoch holen .
Dein Skript Funktioniert super !
Für ein aktuelles Projekt benötigt ich die Aufgabe in ein Txt Datei .
Mit Set-Content &Add-Content hab ich soweit eine Ausgabe hinbekommen aber nur in einer Zeile und nicht alle Rechner/User .

Hast du ein Tipp für ein Powershell Neuling ? face-smile
ElektroMYK
ElektroMYK 18.04.2023 um 08:48:18 Uhr
Goto Top
Ich nehm das nochmal hoch, da ich genau solch ein Script sucher, was innerhalb der Domain die aktuellen angemeldeten User & PC Namen auslist.

Habs als .ps1 gespeichert und wenn ich das per PowerShell ausführe popt kurz ein Shell Fenster auf und schließt dann wieder....da passiert nichts.
Kann mir hier jemand einen Rat geben?

Vielen Dank!
3063370895
3063370895 18.04.2023 um 09:07:03 Uhr
Goto Top
Hi,

ich hatte da mal was gebastelt, ist schon was her und habe es lange nicht benutzt:

$hosts = Get-ADComputer -Filter {enabled -eq "true"}  | Sort-Object -Property Name  | Select-Object -ExpandProperty Name  
foreach ($h in $hosts) { $tasks[$h] = [System.Net.NetworkInformation.Ping]::new().SendPingAsync($h) }

[Threading.Tasks.Task]::WaitAll()

$pingresult = foreach ($h in $hosts) {
    $res = $tasks[$h].Result
    [PSCustomObject]@{
        Online  = $res.Status -eq "Success"  
        Address = $h
    }
}

$result = @()
$totalCount = ($pingresult | Measure-Object).Count
$onlineCount = ($pingresult | Where-Object online -eq $true | Measure-Object).Count
$processedCount = 0
$pingresult | ForEach-Object {
    if ($_.Online) {
        $script:sName = $_.address
        $completed = [math]::Round($processedCount / $onlineCount * 100)

        Write-Progress -Activity "Suche eingeloggte Benutzer" -Status "$onlineCount von $totalCount Computer online. Prüfe $script:sName ($processedCount/$onlineCount)" -PercentComplete $completed  

        try {
            $quserresult = quser "/server:$($_.address)"2>&1  

            $quserresult | Select-Object -Skip 1 | ForEach-Object {
     
                $a = $_.trim() -replace '\s+', ' ' -replace '>', '' -split '\s'  
                If ($a[2] -like '*Getr*') {  
         
                    $array = ([ordered]@{
                            'User'     = $a[0]  
                            'Computer' = $script:sName  
                            'Date'     = $a[4]  
                            'Time'     = $a[5..6] -join ' '  
                        })
         
                    $result += New-Object -TypeName PSCustomObject -Property $array
                }
         
                else {
         
                    $array = ([ordered]@{
                            'User'     = $a[0]  
                            'Computer' = $script:sName  
                            'Date'     = $a[5]  
                            'Time'     = $a[6..7] -join ' '  
                        })
         
                    $result += New-Object -TypeName PSCustomObject -Property $array
                }

            }

        }
        catch {
            write-host $Error[0]
        }
        $processedCount++
       

    }
    
}
Write-Progress -Activity "Suche eingeloggte Benutzer" -Status "Fertig" -Completed  

Write-Output $result
Am besten in die ISE einfügen und dann ausführen
ElektroMYK
ElektroMYK 18.04.2023 um 09:12:27 Uhr
Goto Top
Hallo und vielen Dank!

Habe das mal ausgeführt. Darauf schreibt er:

Get-ADComputer : Die Benennung "Get-ADComputer" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt.   
Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:10
+ $hosts = Get-ADComputer -Filter {enabled -eq "true"}  | Sort-Object - ...  
+          ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Get-ADComputer:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
3063370895
3063370895 18.04.2023 aktualisiert um 09:46:09 Uhr
Goto Top
Zitat von @ElektroMYK:

Hallo und vielen Dank!

Habe das mal ausgeführt. Darauf schreibt er:

Get-ADComputer : Die Benennung "Get-ADComputer" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt.   
Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:10
+ $hosts = Get-ADComputer -Filter {enabled -eq "true"}  | Sort-Object - ...  
+          ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Get-ADComputer:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Dann fehlt dir auf dem Computer das RSAT AD Paket

https://www.tech-faq.net/rsat-in-windows-10-installieren/

Alternativ ersetze Zeile 1 durch
$hosts =  ([adsisearcher]"(&(objectClass=computer)(objectCategory=computer)(!userAccountControl:1.2.840.113556.1.4.803:=2))").FindAll() | ForEach-Object {$_.Properties["DNSHostName"]}