Aus gegebenem Anlass, hatte ich mal wieder so eine Extrawurst, bei der ich die Ausgabe in einem Skript anpassen musste.
Im kurzen geht es darum, dass von Befehlen aus einer foreach-Schleife diverse Eigenschaften existieren, oder eben auch nicht um diese dann miteinander zu kombinieren.
Probieren wir es mal visuell darzustellen. Konkret geht es um Informationen aus der Office365 Cloud. Wir möchten uns die Mitglieder eines Postfachs ausgeben. Allerdings ist das kompliziert, da wir hier speziell nach Attributen filtern und zwar nach Benutzern und nach Benutzern die ein Postfach haben.
Beispiel Freigegebenes Postfach:
Administrator (Benutzer): Hat Vollzugriff
Max Mustermann (Benutzer mit Postfach): Hat Vollzugriff
Über get-user können wir im RecipientType sehen, dass wir einmal "User" und einmal "UserMailbox" haben. Die Funktion in dem Teil, war es einen Benutzer von diesem Postfach über den Alias zu entfernen, den es bei einem User nicht gibt.
Also haben wir einmal get-user und einmal get-mailbox was am Ende dann im Prinzip so aussieht:
DisplayName Alias Identity
Administrator administrator
Max Mustermann mmustermann
Wir wollen jetzt aber unser Alias und Identity in eine Zeile bringen und um das zu schaffen packen wir das ganze sowieso in eine Variable also:
$user | sort DisplayName | FT @{Expression={$_.DisplayName};Label="Name"},@{Expression={"$($_.Alias)$($_.Identity)"};Label="Alias"} -AutoSize
und sieht dann am Ende so aus:
DisplayName Alias
Administrator administrator
Max Mustermann mmustermann
Der komplette Code selber für diejenigen, denen es langweilig ist sieht folgendermaßen aus:
do{
$mailbox = Read-Host 'Geben Sie den Alias der Mailbox ein'
$identity = get-mailbox -identity $mailbox | select -ExpandProperty UserPrincipalName
}
until ($?)
$Userlist2 = @(Get-MailboxPermission -identity $mailbox | where {$_.AccessRights -eq "FullAccess" -and $_.User -notlike "EURPR*" -and $_.User -notlike "NT*"})
$user1 = Foreach($Mailbox2 in $Userlist2)
{
$Objectid = get-msoluser -UserPrincipalName $Mailbox2.User
$Guid = $Objectid.ObjectID | select -expandproperty GUID
$type = get-user -identity $Guid
if ($type.RecipientType -eq "User")
{
get-user -identity $Guid | select DisplayName, Identity
}
elseif ($type.RecipientType -eq "UserMailbox")
{
get-mailbox -identity $Mailbox2.User | select DisplayName, Alias
}
}
write-host -foregroundcolor Green "`nFolgende Benutzer sind im Postfach ""$mailbox"" als Mitglied hinterlegt:"
$user1 | sort DisplayName | FT @{Expression={$_.DisplayName};Label="Name"},@{Expression={"$($_.Alias)$($_.Identity)"};Label="Alias"} -AutoSize
Wie gesagt, das Skript geht an dieser Stelle noch weiter, hier haben wir nur eine Prüfung quasi, damit wir niemand unberechtigten aus dem Postfach entfernen.
Das wars. Wir setzen in die Format-Table Expression die Variablen quasi nebeneinander und simulieren damit ein Join oder Merge oder wie auch immer. Probiert es aus, das komplette Skript findet ihr im Artikel Office365: Freigegebene Postfächer mit der Powershell verwalten
Eine kleine Quellenangabe zum Lösungsansatz:
Concatenation of Table Output