Durchsuchen Sie Active Directory nach angemeldeten Computern in den letzten 30 Tagen

7

Ich versuche, eine PowerShell-Suche in AD durchzuführen, um nur Computer (keine Server oder andere) zu finden, die in den letzten 30 Tagen angemeldet wurden. Ich habe den größten Teil des Skripts geschrieben, mit Ausnahme der Beschränkung auf 30 Tage. Jede Hilfe wäre sehr dankbar.

Get-ADComputer -Filter * -Properties * | FT Name, Betriebssystem, LastLogonDate -Autosize | Out-File C: \ Temp \ ComputerLastLogonDate.csv

Norrec
quelle
Bitte klären Sie die Frage oder was Sie erreichen möchten. Versuchen Sie, die letzte Anmeldezeit des AD-Computerkontos zu ermitteln? Oder das letzte Mal, als sich ein Benutzer am Computer angemeldet hat? Ihr PowerShell-Befehl schlägt das erstere vor, Ihre Anweisung jedoch das letztere. Die Lösung wäre für jedes Szenario völlig anders.
Twconnell

Antworten:

15

Get-ADComputer -Filter * -Properties *

Holen Sie sich nur die Eigenschaften, die Sie verwenden möchten ... es ist effizienter. Das Abrufen aller Eigenschaften aller Computer in der Domäne, wenn Sie nicht wirklich alle Eigenschaften benötigen, stellt unnötig hohe Anforderungen an Ihren Domänencontroller. Es ist verschwenderisch.

Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDateist besser, da Sie nicht alle Eigenschaften benötigen . (Die Eigenschaft 'Name' ist immer enthalten.)

| FT Name, Betriebssystem, LastLogonDate -Autosize

Formatieren Sie die Ausgabe nicht bis zum Ende. Mit anderen Worten, Format-Table und Format-List sollten die letzten Cmdlets in der gesamten Cmdlet-Kette sein, an die Daten weitergeleitet werden.

Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate | Where { $_.LastLogonDate -GT (Get-Date).AddDays(-30) }

Dies ist etwas besser, aber es gibt immer noch einige Ineffizienzen, da Sie immer noch einen Datensatz aller Computer abrufen. Sie können den Domänencontroller die Filterung für Sie durchführen lassen.

$LastMonth = $(((Get-Date).AddDays(-30)).ToFileTime())

Get-ADComputer -LDAPFilter "(lastLogonTimeStamp>=$LastMonth)" -Properties OperatingSystem,LastLogonDate

Der Grund, warum ich dort den lastLogonTimeStamp verwendet habe (dies ist eine "Dateizeit", keine .NET DateTime), ist, dass "LastLogonDate" kein echtes LDAP-Attribut ist. LastLogonDate ist einfach die hilfreiche Methode von PowerShell, das lastLogonTimestamp-Attribut automatisch für Sie zu konvertieren. lastLogonTimestamp ist das "echte" LDAP-Attribut.

Wenn der Domänencontroller anstelle des vollständigen Satzes ALLER Computer einen gefilterten Satz an Sie zurückgeben kann, werden weniger Daten über das Kabel übertragen und weniger Daten von PowerShell verarbeitet.

Beachten Sie auch, dass Sie sich mit Computern befassen müssen, die:

  • Haben Sie ein (null) LastLogonDate
  • Haben Sie ein LastLogonDate vom 1.1.1601 oder den Beginn der Epoche.
Ryan Ries
quelle
Also würde ich etwas in der Art von tun. Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate | Where { $_.LastLogonDate -GT (Get-Date).AddDays(-30) } | FT Name, OperatingSystem, LastLogonDate Wie würde ich es dann auf nur Computer und nicht auch auf Server beschränken?
Norrec
Wenn Sie nach OperatingSystem filtern müssen, fügen Sie dies in die Klammern der Where-Klausel ein ... "-AND $ _. OperatingSystem -Wie ' Server '" usw. usw.
Ryan Ries
Wäre das der richtige Weg? Das einzige Problem, das ich zu bekommen scheine, ist, dass ich nicht herausfinden kann, wie ich es dazu bringen kann, die DCs zu betrachten und die Zeit der neuesten für jede Maschine abzurufen. ' floobits.com/PoshCode/PowerShell.Slack.com/file/… '
Norrec
2

Ihr Befehl filtert überhaupt nicht nur nach Arbeitsstationen.

Sie müssen das Feld LastLogonTimeStamp verwenden, damit Sie es leicht filtern und dann für den Export in eine DateTime konvertieren können.

Diese Informationen sind auch online verfügbar. Wie in diesem Beispiel hier, das ich leicht modifiziert habe, um nur Workstations zurückzugeben. Beachten Sie, dass sie nur die benötigten Eigenschaften abfragen. Es ist effizienter. Ich habe auch keine Ahnung, warum sie in diesem Skript eine $ domain-Variable haben. Es scheint völlig nutzlos.

# Gets time stamps for all computers in the domain that have NOT logged in since after specified date 
# Mod by Tilo 2013-08-27 
import-module activedirectory  
$domain = "domain.mydom.com"  
$DaysInactive = 90  
$time = (Get-Date).Adddays(-($DaysInactive)) 

# Get all AD computers with lastLogonTimestamp less than our time 
Get-ADComputer -Filter {LastLogonTimeStamp -lt $time -and OperatingSystem -notlike "*server*"} -Properties LastLogonTimeStamp,OperatingSystem | 

# Output hostname and lastLogonTimestamp into CSV 
select-object Name,@{Name="Stamp"; Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp)}} | export-csv OLD_Computer.csv -notypeinformation

Von hier aus referenziert: https://gallery.technet.microsoft.com/scriptcenter/Get-Inactive-Computer-in-54feafde

Siehe hierzu auch die folgenden Hinweise:

Das LastLogonTimeStamp-Attribut / wofür es entwickelt wurde

Konvertieren von TimeStamp in DateTime

Appleoddity
quelle
0

Dies sollte Ihnen den Einstieg in die Richtung erleichtern, in die Sie gehen möchten.

Get-ADComputer -Properties * -Filter {
     Enabled -eq $True -and
     OperatingSystem -like 'Windows*' -and
     OperatingSystem -notlike "Windows Server*" -and
     OperatingSystem -notlike "Windows 7*"
} -SearchBase "DC=hhmtx,DC=org" | FT Name, OperatingSystem, LastLogonDate -Autosize | Out-File C:\Temp\ComputerLastLogonDate.csv
Konfusien
quelle
0

Beachten Sie, dass LastLogonDate eine konvertierte Version von LastLogonTimeStamp ist. LastLogonTimeStamp ist nicht die genaueste Darstellung der letzten Anmeldezeit des Computers. Standardmäßig kann es um 14 Tage ausgeschaltet sein. Weitere Informationen - https://social.technet.microsoft.com/wiki/contents/articles/22461.understanding-the-ad-account-attributes-lastlogon-lastlogontimestamp-and-lastlogondate.aspx

Wenn Sie eine genauere Anmeldezeit erhalten möchten, müssen Sie das Attribut lastLogon verwenden, das jedoch nicht auf alle Domänencontroller repliziert wird. Daher müssen Sie alle Domänencontroller iterieren, um den neuesten Wert zu erhalten. Sie müssen die letzte Anmeldezeit berechnen und können sie erst dann auf "letzte 30/60/90 Tage" beschränken.

Hier finden Sie ein Beispiel, wie dieser Algorithmus zum Abrufen der letzten Anmeldezeit des Benutzers realisiert wird:

Import-Module ActiveDirectory

function Get-ADUserLastLogon([string]$userName)
{
$dcs = Get-ADDomainController -Filter {Name -like "*"}
$time = 0
foreach($dc in $dcs)
{
$hostname = $dc.HostName
$user = Get-ADUser $userName | Get-ADObject -Properties lastLogon
if($user.LastLogon -gt $time)
{
$time = $user.LastLogon
}
}
$dt = [DateTime]::FromFileTime($time)
Write-Host $username "last logged on at:" $dt }
Get-ADUserLastLogon -UserName username

Es gibt alternative Möglichkeiten, um das gleiche Ergebnis einfacher und schneller zu erzielen. Sie können das Active Directory-Berichterstellungstool AD FastReporter Free ausprobieren . Es wird die genaue Berechnung der letzten Anmeldung für Sie durchführen. Installieren Sie es einfach, gehen Sie zur Registerkarte Computer und wählen Sie "Computer, die sich in den letzten 30 Tagen angemeldet haben". Klicken Sie auf "Generieren". Das Ergebnis enthält auch DC-Server, die Sie jedoch nach dem Export in CSV- und XLSX-Dateien problemlos entfernen können. PS Ich bin der Besitzer und Entwickler dieses Tools.

Klavs
quelle