authentifizierte Computerkonten auslesen

estre

Commander
Registriert
Dez. 2005
Beiträge
3.006
Hallo zusammen,

ich benötige eine Auswertung darüber welche Computer (PCs + Notebooks) sich in den letzten x Monaten an der Domäne authentifiziert haben.
Kennt ihr eine Möglichkeit an diese Informationen ran zu kommen? Im DNS habe ich bereits nachgeschaut, hier finde ich keine brauchbaren Informationen, weil aufgrund der Fülle an Geräten die alten Einträge bereits überschrieben wurden.
Es handelt sich um eine „normale“ Windows Domäne mit 3 Domänencontrollern.

Mein nächster Ansatz wäre es ein Powershell-Skript zu schreiben, das die Computerkonten aus dem AD ausliest, diese dann über einen Zeitraum von mehreren Tagen pingt und anschließend in einer Logdatei trackt.

Danke für Eure Hilfe!

Grüße
 
Lies den Wert 'LastLogon' auf allen DCs aus und nimm den aktuellsten Wert. Der ausgelesene Wert muß allerdings in ein Datum umgerechnet werden.
 
Welches Domänen Level?

Ab 2003 gibt es das Attribut lastLogonTimestamp:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms676824(v=vs.85).aspx

http://blogs.technet.com/b/heyscrip...e-are-a-few-of-our-least-favorite-things.aspx


http://blogs.technet.com/b/askds/ar...hat-it-was-designed-for-and-how-it-works.aspx

Auslesen, alles was 2 Monate älter ist raus filtern und schon hast du alle User und Computer die sich seit 2 Monaten nicht mehr eingelogt haben. Da kannst du dann natürlich auch nach Computerobjekten filtern.

http://www.visualbasicscript.com/Last-domain-logon-for-specific-user-m93636.aspx
 
LastLogonTimestamp ist zu ungenau. Für genaue Werte muß man LastLogon nehmen, aber alle DCs abfragen, da dieses Attribut im Gegensatz zu LastLogonTimestamp nicht repliziert wird.
 
Du kannst das Computerkonten-Passwortalter auslesen. Jedes Computerkonto das in einem Active Directory eingebunden ist bekommt ein automatisch generiertes Passwort. Per Default muss das alle x Tage (ich glaub es waren 90 Tage) geändert werden. Dies passiert alles automatisch im Hintergrund.

Wenn ein PC sich länger nicht im AD meldet, ist das Passwort veraltet. Gibt da auch diverse PS Script zum auslesen. Einfach mal bei Google suchen.
 
Zuletzt bearbeitet:
@braumeister
Das ist ja noch ungenauer ;)

Wie gesagt, es gibt genau das Attribut, das er braucht.
 
er kann natürlich aber auch das Attribut der Domäne msds-logontimesyncinterval auf 1 ändern um so schneller (bei 1 jeden Tag) zu syncen.
Dann kannst du doch mit LastLogonTimestamp arbeiten.

Bei den Netzwerkbandbreiten von heute und gerade im LAN macht das überhaupt nichts. Das fällt erst bei ein paar Tausend Usern und Computer ins Gewicht^^

Aber wie gesagt LastLogon ist auf jeden Fall das genaueste, was du bekommen kannst, nur musst du das von jeden DC einzeln abfragen und zusammenfügen, was bei 3 DCs jetzt aber auch nicht so der Akt ist.
 
Zuletzt bearbeitet:
Genau. Mit den entsprechenden Informationen und Änderungemöglichkeiten kann man einen der beiden Werte nehmen.
 
Hallo zusammen,

danke für die vielen Beiträge, ich habe es nun über die Eigenschaft "LastLogon" erfolgreich auslesen können.
Anbei die Befehle:

Code:
$logonDate = New-Object System.DateTime(2013, 1, 4)
Get-ADComputer -filter { (LastLogon  -ge $logonDate) }  | format-table -Property Name | Out-File "D:\auswertung_ADComputers_neu.csv"

Grüße
 
Oder so:

function Get-ADUserLastLogon {
<#
.Synopsis
Diese Funktion öffnet ein Eingabefenster mit einer Listbox,
zur Auswahl der zu löschenden Ordner.
.Example
<"SamAccountName"> | Get-ADUserLastLogon [-adddays <[int32]>] [-mb <[Boolen]>]
.Example
Get-ADUserLastLogon [-user] <"SamAccountName"> [-adddays <[int32]>] [-mb <[Boolen]>]
.Notes
NAME: Get-ADUserLastLogon
#>
[CmdletBinding()]
param(
[Parameter(
Position = 0,
Mandatory = $true,
ValueFromPipeline = $true,
ValueFromPipelineByPropertyName = $true)
]
[Alias('user')]
[string[]]$SAccountName,
[Alias('adddays')]
[int32]$chkAddDays = 0,
[Alias('mb')]
[boolean[]]$messageBox = $False
)

begin
{
Import-Module ActiveDirectory
}

process
{
$dcs = Get-ADDomainController -Filter { name -Like "*" }
$time = 0
foreach ($dc in $dcs)
{
$hostname = $dc.HostName
$user = Get-ADComputer -identity "$SAccountName" | Get-ADObject -Properties lastLogon
if ($user.LastLogon -gt $time)
{
$time = $user.LastLogon
}
}


if ($time -gt 0)
{
$chkDate = (Get-Date).adddays($chkAddDays)
#write-host ("chkDate: " + $chkDate)
$lldate = [datetime]::FromFileTime($time)
#write-host ("lldate: " + $lldate)
$message = [datetime]::FromFileTime($time).ToString('dd.MM.yyyy HH:mm:ss zzz')
if ($lldate -gt $chkDate)
{
$infoStr = "Achtung! Der AD-Account von " + $user.name + " wurde inerhalb der letzten " + (Ups "$chkAddDays") + "Tagen noch verwendet. `nLetzte Anmeldung war am " + $message
Write-Host ($infoStr)
if ($messageBox)
{
[System.Windows.Forms.MessageBox]::Show($infoStr,"",0,[System.Windows.Forms.MessageBoxIcon]::Error)
}
}
}
else
{
Write-Host ("Der AD-Account von " + $user.name + " war noch nie angemeldet.")
$message = "User war noch nie angemeldet!"
}
#$lastlogon = get-aduserlastlogon $user

}

end
{
Write-Host ("Letzte Anmeldung von " + $SAccountName + ": " + $message)
return $message
}
}

function Ups {
<#
.Synopsis
Negative Zahlen in Positive wandeln.
.Example
<[int]> | Ups [-i>]
.Example
Ups [-i] <[int]>
.Notes
NAME: Ups
#>
[CmdletBinding()]
param(
[Parameter(
Position = 0,
Mandatory = $true,
ValueFromPipeline = $true,
ValueFromPipelineByPropertyName = $true)
]
[Alias('i')]
[int]$theValue

)

begin
{

}

process
{
#i *= i < 0 ? -1 : 1;
[int]$i = $theValue
if ($i -lt 0)
{
$i = $i * (-1)
}
}

end
{
return $i
}
}
 
Zurück
Oben