Sandro Reiter

vCard und IT-Blog

Azure AD: UPN eines Hybrid-Users ändern

Als wir vor Kurzem einen neuen Kollegen eingestellt haben, wünschte dieser sich einen kürzeren Anmeldenamen (UPN) für Office 365 und Co.
Da ich natürlich vorbildlich bereits vor seinem Dienstantritt das Active Directory-Konto erstellt habe, änderte ich einfach den UPN am AD-Objekt und auch die neue Adresse im ProxyAdresses-Attribut wurde veröffentlicht und als primär festgelegt.

Als nach mehrfachen automatischen AAD Connect Synchronisationen der kosmetische Eingriff noch nicht geglückt war, habe ich eine manuelle Synchronisation angestoßen…

Start-ADSyncSyncCycle -PolicyType Delta

… allerdings ebenfalls ohne Erfolg.

 

Ich musste ein wenig in meinem Gedächtnis kramen – denn genau diese Änderung habe ich bereits an meinem eigenen Benutzerkonto durchgeführt – Déjà-vu! Mir fiel wieder ein, was ich schon mal vergessen habe.

Es ist natürlich richtig und wichtig den UPN und die neue Mail-Adresse im OnPremises AD zu ändern. Wenn das Konto aber bereits synchronisiert ist und in Azure AD angelegt, muss der UPN auch nochmal auf Azure AD-Seite geändert werden. Das gelingt ganz einfach wie folgt:

#connect to Azure AD tenant
Connect-AzureAD

#change UPN to default tenant-domain
Set-AzureADUser -ObjectId user@contoso.com -UserPrincipalName user@contoso.onmicrosoft.com

#set the UPN like the UPN in OnPrem AD
Set-AzureADUser -ObjectId user@contoso.onmicrosoft.com -UserPrincipalName mrright@contoso.com

 

Nachdem das nun erledigt ist, gilt der neue UPN in beiden IDPs – sowohl im Active Directory als auch Azure AD.

 

Famous last words: Wenn der UPN geändert wird, ändert sich auch die SIP-Adresse des jeweiligen Benutzers. Diese Adresse wird u.a. im Skype for Business-Verzeichnisdienst verwendet. Das wiederum hat die Folge, das bereits bestehende Kontakte den Benutzer mit neuem UPN erneut zur Kontaktliste hinzufügen müssen.

Azure Automation: Anfordern eines Ad-Hoc SAS Tokens

Wer mit Azure Storage arbeitet, kommt über kurz oder lang nicht daran vorbei die Verarbeitung von Dateien zu automatisieren. Was über die Web-UI so einfach geht, ist via PowerShell nicht ganz so trivial.

In einem Container mit dem AccessLevel „private“ wird ein SAS Token benötigt um auf die Dateien zuzugreifen und mit diesen zu arbeiten.

Wie genau dieser Token in einem Azure Automation PowerShell RunBook angefordert werden kann, zeigt das folgende Skript:

#define parameter
Param(
    [Parameter(Mandatory=$True)]
    [string]$AzureAutomationAccount,

    [Parameter(Mandatory=$True)]
    [string]$FileWebUrl,

    [Parameter(Mandatory=$True)]
    [string]$StorageAccountName,

    [Parameter(Mandatory=$True)]
    [string]$StorageResourceGroup,

    [Parameter(Mandatory=$True)]
    [string]$StorageContainerName,

    [Parameter(Mandatory=$True)]
    [string]$BlobName,

    [Parameter(Mandatory=$false)]
    [ValidateSet("r","rw","rcw","rwcd")] 
    [string]$AccessRights = "r",
    
    [Parameter(Mandatory=$false)]
    [int]$TokenLifeTime = 2
)

#get credentials from Azure Automation vault
$myCredential = Get-AutomationPSCredential -Name $AzureAutomationAccount

#sign in to AzureRM
Login-AzureRmAccount -Credential $myCredential

#get current utc time for sas token starttime and expiration
$TokenStartTime = Get-Date
$TokenStartTime = $TokenStartTime.ToUniversalTime()
$TokenEndTime = $TokenStartTime.AddHours($TokenLifeTime)

#get storageaccount key, set context to container and request adhoc SAS token
$StorageAccountKey = (Get-AzureRmStorageAccountKey -ResourceGroupName $StorageResourceGroup -AccountName $StorageAccountName).Value[0]
$StorageContext = New-AzureStorageContext $StorageAccountName -StorageAccountKey $StorageAccountKey
$SASKey = New-AzureStorageBlobSASToken -Protocol HttpsOnly -Container $StorageContainerName -Blob $BlobName -Context $StorageContext -Permission $AccessRights -StartTime $TokenStartTime -ExpiryTime $TokenEndTime

#join file-uri and SAS token to full download uri
$FullUri = "$FileWebUrl$SASKey"

 

Sobald das Skript in einem RunBook hinterlegt ist, können die Parameter übergeben und das Snippet im Azure Automation Kontext ausgeführt werden.

 

Das Skript verarbeitet die Datei nicht, sondern fordert nur den Token an. Die komplette URL (Blob+Token), welche am Ende als Variable ($FullUri) bereitsteht, kann für Dateioperationen, bspw. der Import des Dateiinhalts in eine Variable, verwendet werden solange der SAS-Token gültig ist.

#import csv content into variable
$content = ConvertFrom-Csv -Delimiter ";" (Invoke-WebRequest -Uri $FullUri).ToString()

Exchange Online: Auf welche Shared Mailboxes hat ein User Zugriff?

Erst kürzlich erhielt ich einen Anruf mit der Frage: „Sehe ich eigentlich irgendwo auf welche Shared Mailboxes ich Zugriff habe?“

Beunruhigende Stille machte sich auf meiner Seite der Leitung breit…

„Da muss ich nachsehen“, sagte ich und sicherte zu mich zeitnah zu melden.

Mir waren die Möglichkeiten bewusst die ein Nutzer hat um die Mitgliedschaft in O365 Gruppen und Verteilerlisten einzusehen, aber die geteilten Postfächer anzeigen auf die man selbst Zugriff hat, suchte ich vergeblich.

 

Lange Rede, kurzer Sinn: Der Kunde wartet – let’s script it!

Das nachfolgende Skript muss der Exchange-Admin ausführen, aber es geht allemal schneller als sich durch alle Shared Mailboxes zu klicken und nachzusehen wo der User berechtigt ist.

$usertosearch = "max@muster.de"
$sharedMailboxes = Get-Mailbox -RecipientTypeDetails SharedMailbox

foreach ($box in $sharedMailboxes) 
{ 
    $perms = Get-MailboxPermission -Identity $box.Alias

    foreach ($perm in $perms)
    { 
        if(
            $perm.User -like $usertosearch) 
            { 
                write-host $box.PrimarySmtpAddress 
            } 
    }
}