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-Key: 279869

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

Printed on: April 19, 2024 at 19:04 o'clock

Member: michi1983
michi1983 Aug 11, 2015 at 12:10:47 (UTC)
Goto Top
Hallo,

innerhalb einer Domäne?

Gruß
Member: KgFmB
KgFmB Aug 11, 2015 at 12:57:10 (UTC)
Goto Top
Ja, innerhalb einer Domäne.
Daher auch die Angabe des IP Bereichs.
Username u PW ist vorhanden.
Member: psannz
psannz Aug 11, 2015 updated at 13:00:13 (UTC)
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
Mitglied: 122990
122990 Aug 11, 2015 updated at 13:25:40 (UTC)
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
Member: KgFmB
KgFmB Aug 11, 2015 at 13:51:36 (UTC)
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ß
Member: KgFmB
KgFmB Aug 11, 2015 updated at 14:10:02 (UTC)
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
Mitglied: 122990
122990 Aug 11, 2015 updated at 14:21:52 (UTC)
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!!!
Member: KgFmB
KgFmB Aug 11, 2015 at 14:27:05 (UTC)
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.
Mitglied: 122990
122990 Aug 11, 2015 updated at 14:35:51 (UTC)
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.
Member: KgFmB
KgFmB Aug 11, 2015 at 14:42:10 (UTC)
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.
Mitglied: 122990
122990 Aug 11, 2015 updated at 14:51:08 (UTC)
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.
Mitglied: 122990
122990 Oct 07, 2015 at 16:25:50 (UTC)
Goto Top
Bitte gelöst nicht vergessen. Danke.
Member: 10base-will
10base-will Feb 19, 2019 at 17:50:43 (UTC)
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
Member: ElektroMYK
ElektroMYK Apr 18, 2023 at 06:48:18 (UTC)
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!
Mitglied: 3063370895
3063370895 Apr 18, 2023 at 07:07:03 (UTC)
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
Member: ElektroMYK
ElektroMYK Apr 18, 2023 at 07:12:27 (UTC)
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
Mitglied: 3063370895
3063370895 Apr 18, 2023 updated at 07:46:09 (UTC)
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"]}