PowerShell – Attribute verschiedener Objekte vergleichen

Wenn Sie Attribute von Objekten verschiedener CmdLets miteinander vergleichen möchten, ist dies hier ein möglicher Lösungsansatz.
Es werden der SAMAccountName eines Users und das LastLoggedOnUserAccount einer Exchange Mailbox miteinander verglichen.

Um zu prüfen, wer an einer Mailbox zuletzt angemeldet war, dient das Attribut LastLoggedOnUserAccount. Dies kann über Get-MailboxStatistic ausgelesen werden, sofern die Mailbox bereits existiert.
Wenn eine Mailbox angelegt wird, ist das zunächst nur ein Link im AD Objekt des Users. Erst wenn der User sich das erste Mal an der Mailbox anmeldet oder wenn eine Mail
von der jeweiligen Adresse empfangen wird, wird die Mailbox physikalisch im Exchange Store angelegt.
Ist die Mailbox noch nicht angelegt, liefert Get-MailboxStatistics einen Fehler zurück. Wenn die Mailbox angelegt ist, weil schon eine Mail empfangen wurde,
aber noch kein User angemeldet war, liefert Get-MailboxStatistics zwar Informationen zurück. Allerdings ist das LastLoggedOnUserAccount dann leer und kann damit nicht weiterverarbeitet werden.

Zunächst lesen wir alle Mailboxen in eine Variable ein.

$MB_all = get-mailbox resultsize unlimited

Da Get-Mailbox nicht das LastLoggedOnUserAccount zurück liefert, wir das aber mit dem SAMAccountName vergleichen wollen, müssen wir das Attribut in einem Array speichern.
In dieses Array wird dann über Get-MailboxStatistics das LastLoggedOnUserAccount zusätzlich abgelegt.

Dazu wird ein leeres Array definiert.

$m=@()

Danach wird sowohl SAMAccountName als auch LastLoggedOnUserAccount darin abgelegt. Das erreichen wir mit einer ForEach Schleife.

$MB_all | % { $t=1| select mb,mbs; $t.mb = $_ ;$t.mbs = Get-MailboxStatistics $_; $m+=$t}

In der Schleife wird ein leeres Objekt mit den beiden Spalten mb (für das Mailbox Objekt) und mbs (für das MailboxStatistics Objekt) erstellt.
Darin wird das jeweilige Mailbox Objekt über $_ in $t.mb abgelegt und dann das MailboxStatistics Objekt abgefragt und in $t.mbs gespeichert.
Im letzten Schritt der Schleife werden dann beide Objekt in $m übertragen, bevor im nächsten Durchlauf $t wieder gelöscht wird.
Damit ist sichergestellt, dass ein Mailbox Objekt auch ein zugehöriges MailboxStatistics Objekt hat, selbst wenn dieses leer ist.

Nun kann die abgefragte Information weiterverarbeitet werden.

Wenn Sie beispielsweise wissen möchten, wie viele User selbst an ihrer Mailbox angemeldet waren, erreichen Sie das mit dieser Abfrage:

(0..($m.mb.count-1) | ? {$m.mb.samaccountname[$_] -match $m.mbs.lastloggedonuseraccount[$_].trimstart(“IhrDomainName\”)}).count

Hierbei läuft eine Schleife von 0 bis zur Anzahl aller Mailboxen, in der geprüft wird, ob der jeweilige SAMAccountName gleich dem LastLoggedOnUserAccount ist. Der Domänenname, der in LastLoggedOnUserAccount enthalten ist, muss dazu noch den “\” entfernt bekommen, da die Powershell diesen als Escape Zeichen interpretiert.
Das kann unter anderem mit TrimStart wie im Beispiel erreicht werden.

Wenn Sie umgekehrt wissen möchten, welche User in den letzten 10 Tagen nicht in ihrem LastLoggedOnUserAccount stehen, geht das mit einer kleinen Erweiterung:

0..($m.mb.count-1) | ? {$m.mb.samaccountname[$_] -notmatch $m.mbs.lastloggedonuseraccount[$_].trimstart(“Domain\”) -and $m.mbs.lastlogontime[$_] -gt(get-date).adddays(-10)} |% {$m[$_].mb.samaccountname}

Der Vergleich liefert den Index des Arrays. Dieser Index wird in eine weitere ForEach Schleife übergeben und so der jeweilige SAMAccountName ausgegeben.

Sie könnten genauso aus dem Array $m z.B. nur alle Mailboxen mit einer bestimmten SMTP Domain oder ähnliches heraus filtern und nur diese abfragen.

Mit dieser Vorgehensweise lassen sich auch beliebige andere Informationen, die von verschiedenen CmdLets zurück geliefert werden, vergleichen oder weiterverarbeiten.

Viel Spass damit!