Dieser Artikel wird Ihnen die Synchronisierung mit Azure AD Schritt für Schritt erläutern. Diese Konfiguration ist empfehlenswert, wenn kein lokales Active Directory vorhanden ist. Wenn Sie über lokale AD-Server verfügen, ist es empfehlenswert, die lokale AD-Integration zu verwenden.
Inhalt
Installation der Azure-Module in PowerShell
- Melden Sie sich bei einem Computer an, von dem aus Sie ein geplantes PowerShell-Script ausführen werden. Hierbei handelt es sich häufig um einen Domain-Controller oder Dateiserver.
- Öffnen Sie PowerShell ISE und führen Sie folgende Befehle aus
a. install-module msonline und wählen Sie nach Aufforderung „Ja zu allem” aus
b. Install-Module AzureAD und wählen Sie nach Aufforderung „Ja zu allem” aus
Erstellung einer sicheren Verbindung zur Azure-Anwendung
- Erstellen Sie in PowerShell ISE eine neue Datei
- Kopieren Sie das unten stehende Script in die Datei
- Speichern Sie die Datei als „Azure-App-Setup.ps1”
- Führen Sie das Script aus und befolgen Sie die Anweisungen im Script. Sie werden aufgefordert, Ihre Azure-Instanz sowie einige Variablennamen zu authentifizieren.
Sie werden um folgende Angaben gebeten:- Wählen Sie ein Passwort für die sichere Azure-Anwendung
- Ihre sicheren AzureAD-Anmeldedaten
- Einen PFX-Ordnerpfad und einen Dateinamen
- Einen Namen, den Sie verwenden möchten, oder Ihre Dashlane-Verbindung in Azure
-
Führen Sie folgendes Script aus:
#Connect to AzureAD using the GUI prompt Write-Host "Connecting to AzureAD..." -foregroundcolor yellow Connect-AzureAD Write-Host "Connected to AzureAD" -foregroundcolor green #Enter your environment specific details. Write-Host "Requesting a secure password..." -foregroundcolor yellow $pwd_secure_string = Read-host "Choose a secure password for the Azure App" -AsSecureString # This is the password used to secure your Azure App Connection $ThisServerDNSName = $env:computername+"."+$env:userdnsdomain # The server this sync script will be scheduled to run on. $FilePathPFX = Read-Host "Enter a filename and path for saving the .pfx file EG C:\filepath\cert.pfx" # Enter in a filepath & name where the generated cert will be saved. $DashlaneAppName = Read-host "Enter a name for the Dashlane Azure App, it can be anything" $DashlaneURI = "https://$DashlaneAppName" #Display the variables Write-Host "." Write-Host "." Write-Host "." Write-Host "A self-signed certificate will be created for a secure connection to this server" -foregroundcolor Yellow Write-Host "$ThisServerDNSName" -foregroundcolor green Write-Host "" Write-host "PFX save location & name" -foregroundcolor yellow Write-Host "$FilepathPFX" -foregroundcolor green Write-Host "" Write-Host "Azure App Name" -foregroundColor Yellow Write-Host "$DashlaneAppName" -foregroundcolor green Write-Host "" Write-Host "Azure APP URI Display Name" -ForegroundColor yellow Write-Host "$DashlaneURI" -foregroundcolor green Write-Host "" Write-Host "By Continuing the Azure Application will be created with the above variables" -foregroundcolor yellow Pause Write-Host "Working..." -foregroundcolor green # Create the self signed cert $currentDate = Get-Date $endDate = $currentDate.AddYears(1) $notAfter = $endDate.AddYears(50) $pwd = $pwd $thumb = (New-SelfSignedCertificate -CertStoreLocation cert:\localmachine\my -DnsName win2016-ad.passwordlabs.com -KeyExportPolicy Exportable -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" -NotAfter $notAfter).Thumbprint $pwd = ConvertTo-SecureString -String $pwd -Force -AsPlainText start-sleep -s 5 #Give time to finish the self-signed cert creationg Export-PfxCertificate -cert "cert:\localmachine\my\$thumb" -FilePath $FilePathPFX -Password $pwd_secure_string # Load the certificate $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate("$FilePathPFX", $pwd_secure_string) $keyValue = [System.Convert]::ToBase64String($cert.GetRawCertData()) # Create the Azure Active Directory Application $application = New-AzureADApplication -DisplayName "$DashlaneAppName" -IdentifierUris "$DashlaneURI" New-AzureADApplicationKeyCredential -ObjectId $application.ObjectId -CustomKeyIdentifier "$DashlaneAppName" -StartDate $currentDate -EndDate $endDate -Type AsymmetricX509Cert -Usage Verify -Value $keyValue # Create the Service Principal and connect it to the Application $sp = New-AzureADServicePrincipal -AppId $application.AppId # Give the Service Principal Reader access to the current tenant (Get-AzureADDirectoryRole) $ADDirectoryRoleObjectID = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq 'Company Administrator'} $ADDirectoryRoleObjectID = $ADDirectoryRoleObjectID.ObjectID Add-AzureADDirectoryRoleMember -ObjectId "$ADDirectoryRoleObjectID" -RefObjectId $sp.ObjectId Write-Host "Creating Azure App, this can take up to 60 seconds" -foregroundcolor green start-sleep -s 20 #Give the app a moment to be created # Get Tenant Detail $tenant = Get-AzureADTenantDetail # Now you can login to Azure PowerShell with your Service Principal and Certificate Connect-AzureAD -TenantId $tenant.ObjectId -ApplicationId $sp.AppId -CertificateThumbprint $thumb #Display the Results write-host "" Write-host "" Write-Host "TenantID" -foregroundcolor Yellow Get-AzureADTenantDetail | Ft DisplayName, ObjectID Write-Host "AppID " -ForegroundColor Yellow get-AzureADApplication | Ft DisplayName,AppID Write-Host "Thumbprint for $DashlaneAppName : $Thumb" -ForegroundColor Yellow
- Sobald Sie Ihre Informationen eingegeben haben, werden Sie aufgefordert, diese zu überprüfen und die Eingabetaste zu drücken, um fortzufahren.
- Das Script wird beendet und es werden einige Ausgaben erstellt, die Sie im AD-Synchronisierungs-Script verwenden werden.
- Lassen Sie das Ausgabefenster geöffnet und erstellen Sie in PowerShell ISE eine neue Datei.
Festlegung der Umgebungsvariablen
- Kopieren Sie das folgende Script in die neue Datei in PowerShell ISE und speichern Sie es als „Azure-AD-Sync-Script.ps1”
# Dashlane Azure AD Sync Script # This script is to be used after you have registered a secure Azure Application to securely connect. #Define your variables $INSTALL_TOKEN = "TextString" #Line 42 from the AD sync script from the Admin Console $TEAM_ID = "NumberString" #Line 43 from your AD sync script from the Admin Console $TenantID = "NumberString" #Your tenantID from the Azure App connection script $AppID = "NumberString" #Your AppID from the Azure app connection script $Thumb = "NumberString" #your Thumbprint ID from the previous script Connect-AzureAD -TenantId $TenantID -ApplicationId $AppID -CertificateThumbprint $thumb #Give a moment for the connection to be established before continuing Start-sleep 10 # Enter each Groups ObjectID that you would like to sync with Dashlane. # caution: filter using the ObjectId values, NOT the friendly DisplayName values # caution: each ObjectId value must be enclosed by double quotation marks # #Groups key. DashlaneUsers = ObjectID # $Groups = @( "GroupObjectID1", "GroupObjectID2" ) $DASHLANE_LOGIN_ATTR = "UserPrincipalName" Import-Module AzureAD Write-Host "Running Dashlane Azure AD synchronization" $GroupMembers = @() $GroupInfos = @() $CSV_TEMP_PATH = $env:TEMP + "dashlane_export.csv" foreach ($Group in $Groups) { Try { $GroupInfo = Get-AzureADGroup -ObjectId $Group | Select DisplayName, ObjectId $GroupInfo | Add-Member Members @() $Members = Get-AzureADGroupMember -Top 1000 -ObjectId $Group | Get-AzureADUser | select UserPrincipalName # Roughly filtering out users with invalid emails. # A user with an invalid email is filtered out by Dashlane servers: it will therefore not # be included in the verified data, which will lead to an invalid signature check if it is # included in the signed data. $ValidMembers = $Members | Where-Object {($_ | Select -ExpandProperty $DASHLANE_LOGIN_ATTR) -like '*@*.*' } $measure = $ValidMembers | measure $count = $measure.count Write-Host "Exporting $count valid members from $Group" -ForegroundColor Green if ($count -gt 0) { foreach ($Member in $ValidMembers) { # Dashlane servers are also downcasing emails, see comment about invalid emails above. $Member = $Member | Select @{ name=$DASHLANE_LOGIN_ATTR; expression={($_ | Select -ExpandProperty $DASHLANE_LOGIN_ATTR).ToLower()} } $Member | Add-Member GroupName $GroupInfo.DisplayName $Member | Add-Member GroupGUID $GroupInfo.ObjectId $DashlaneLogin = $Member | Select -ExpandProperty $DASHLANE_LOGIN_ATTR $GroupMembers += $Member $GroupInfo.Members += $Member } $GroupInfos += $GroupInfo } } Catch { $ErrorMessage = $_.Exception.Message $FailedItem = $_.Exception.GetType().FullName Write-Host "Error: $FailedItem - $ErrorMessage" -ForegroundColor Red Write-Host "Message: It seems there is no account on this Group: $Group." -ForegroundColor Red } } ## writing temp CSV Write-Host "" Write-Host "Writing debug information to $CSV_TEMP_PATH" $GroupMembers | Export-Csv -Path $CSV_TEMP_PATH -NoTypeInformation -Encoding UTF8 # Generate signature Try { $CspParameters = New-Object -TypeName System.Security.Cryptography.CspParameters $CspParameters.KeyContainerName = "DashlaneDirectorySyncKey53" $RSA = New-Object -TypeName System.Security.Cryptography.RSACryptoServiceProvider -ArgumentList $CspParameters $PublicKey = $RSA.ToXmlString($false) $PublicKeyHash = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($PublicKey)) Write-Host "" Write-Host "---------- Provide your Dashlane admin with this key on setup: -----------" Write-Host "" Write-Host $PublicKeyHash -ForegroundColor Green Write-Host "" Write-Host "--------------------------------------------------------------------------" Write-Host "" $RSAFormatter = New-Object -TypeName System.Security.Cryptography.RSAPKCS1SignatureFormatter -ArgumentList $RSA $RSAFormatter.SetHashAlgorithm("SHA256") $DataStr = $TEAM_ID foreach ($GroupInfo in $GroupInfos | Sort-Object -Property ObjectId) { $DataStr += $GroupInfo.ObjectId $DataStr += $GroupInfo.DisplayName foreach ($Member in $GroupInfo.Members | Sort-Object -Property $DASHLANE_LOGIN_ATTR) { $DashlaneLogin = $Member | Select -ExpandProperty $DASHLANE_LOGIN_ATTR $DataStr += $DashlaneLogin } } $DataBytes = [System.Text.Encoding]::UTF8.GetBytes($DataStr) $SHA256 = New-Object -TypeName System.Security.Cryptography.SHA256CryptoServiceProvider $DataHash = $SHA256.ComputeHash($DataBytes) $SignatureBytes = $RSAFormatter.CreateSignature($DataHash) $SignatureHash = [System.Convert]::ToBase64String($SignatureBytes) } Catch { $ErrorMessage = $_.Exception.Message $FailedItem = $_.Exception.GetType().FullName Write-Host "Failed: $FailedItem - $ErrorMessage" -ForegroundColor Red } # Send data to Dashlane $FileContent = Get-Content $CSV_TEMP_PATH | Out-String $FileContentBytes = [System.Text.Encoding]::UTF8.GetBytes($FileContent) $FileContentEncoded = [System.Convert]::ToBase64String($FileContentBytes) [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; $URL = "https://ws1.dashlane.com/1/teamPlans/syncFromDirectory" $Method = "POST" $ContentType = "application/x-www-form-urlencoded" $Payload = @{adLogins=$FileContentEncoded;adToken=$INSTALL_TOKEN;teamId=$TEAM_ID;signature=$SignatureHash;publicKey=$PublicKeyHash} Try { $Response = Invoke-WebRequest -Uri $URL -Method $Method -Body $Payload -ContentType $ContentType Write-Host "Dashlane sync responded with: $Response" -ForegroundColor Green } Catch { $ErrorMessage = $_.Exception.Message $FailedItem = $_.Exception.GetType().FullName Write-Host "" Write-Host "Dashlane sync error: $FailedItem - $ErrorMessage" -ForegroundColor Red } # Cleaning up temp CSV Remove-Item $CSV_TEMP_PATH }
- Melden Sie sich bei Console.Dashlane.com > Einstellungen > Active Directory an
- Aktivieren Sie die Funktion Automatisches Benutzer-Provisioning und Gruppensynchronisierung
- Klicken Sie neben dem AD-Script auf die Schaltfläche Kopieren und fügen Sie es in eine neue Registerkarte in PowerShell ISE ein
- Speichern Sie die Datei unter dem Namen „Default-AD-Script.ps1”
- Sie sollten nun 3 Scripts in PowerShell ISE sowie das Ausgabefenster geöffnet haben
- Bearbeiten Sie mit den unten stehenden Umgebungsvariablen die Zeilen 5–9 im AzureAD-Synchronisierungs-Script. Nachdem Sie Ihre Variablen eingegeben haben, sollte es ungefähr wie in der oberen Abbildung aussehen.
$INSTALL_TOKEN = "BIvG4Jd6Y8PWX7Gli0nQAkHYoozzzzzz0CxMncY6dDvm6z5cbWZYVD-"
From line 42 of the Default-AD-Script$TEAM_ID = "123456"
Von Zeile 43 des Default-AD-Scripts$TenantID = "60f8366e-282f-460f-91ef-4zzzbbe6445"
Von der TenantID aus dem Azure-App-Setup-Script$AppID = "c0023c85-9358-46e7-8a71-aezzzz4c9606"
Von der Ausgabe der AppID aus dem Azure-App-Setup-Script$Thumb = "6BA63A586294299Fzzzzz15939445A115A4C"
Von der Ausgabe der Thumbprint-ID aus dem Azure-App-Setup-Script - Geben Sie mithilfe der ObjectID der jeweiligen Gruppe in Zeile 22 die Azure-Gruppen ein, die Sie synchronisieren möchten
- Führen Sie das Script aus und vergewissern Sie sich, dass die Synchronisierung erfolgreich war
- Vergewissern Sie sich, dass das Script folgende Meldung wiedergibt: "code":200,"message":"OK"
- Kopieren Sie den Text zwischen den Strichen, um ihn in der Zwischenablage zu speichern
- Gehen Sie zurück zu http://console.dashlane.com und aktualisieren Sie die Seite
- Klicken Sie im Pop-up-Fenster „Sicherheitskey verifizieren …” auf Fortfahren
- Fügen Sie den Text, den Sie in Schritt 10 in Ihre Zwischenablage kopiert haben, in das Textfeld ein und klicken Sie auf Jetzt verifizieren
- Erfolgreich abgeschlossen! Diese Nachricht erhalten Sie, sobald der Key verifiziert wurde
Ausführung des Azure AD-Synchronisierungs-Scripts
- Öffnen Sie in der Administrator-Konsole den Tab „Benutzer” und vergewissern Sie sich, dass der Status aller neuen Benutzer auf Einladung steht aus gestellt ist.
- Öffnen Sie den Tab „Gruppen“, um zu sehen, welche Gruppen synchronisiert wurden
- Sie können Ihren AD-Synchronisierungsstatus in der Administrator-Konsole unter Einstellungen > Active Directory einsehen.
- Sobald Sie sich sicher sind, dass alle synchronisierten Benutzer in den Active Directory-Synchronisierungsgruppen enthalten sind, empfehlen wir Ihnen, das automatische Deprovisioning zu aktivieren
Regelmäßige Synchronisierung mit dem Task Scheduler planen
Wenn das Script in Ihrer Domain gespeichert wurde, können Sie es so einstellen, dass es in von Ihnen definierten Zeitintervallen automatisch ausgeführt wird.
Bitte beachten Sie, dass das Benutzerkonto, das zur Ausführung dieses Tasks genutzt wird, in der Lage sein muss, Organisationseinheiten (OUs) und Benutzerkonten in Ihrer Active Directory-Umgebung zu lesen
- Öffnen Sie den Task Scheduler auf einem Windows Server, der das Script ausführen wird
- Wählen Sie Task Scheduler-Bibliothek aus
- Klicken Sie auf die Registerkarte Aktion oben links im Menü
- Klicken Sie dann auf Task erstellen
- Klicken Sie als Nächstes auf die Registerkarte Allgemein
- Tippen Sie Dashlane-AD-Synchronisierung in das Textfeld „Name:“ ein
- Wählen Sie als Nächstes die Sicherheitseinstellungen aus
- In den Sicherheitseinstellungen: Markieren Sie die Kästchen für „Ausführen, egal ob Benutzer eingeloggt ist oder nicht“ und „Mit den höchsten Rechten ausführen“
- Stellen Sie bitte einen Zeitplan für die Ausführung des Scripts ein, indem Sie einen neuen Trigger erstellen. Im unten angezeigten Beispiel wird es täglich um 01:00 Uhr ausgeführt.
-
Klicken Sie anschließend auf die Registerkarte Aktionen.
a. Klicken Sie auf Neue Aktion
b. Geben Sie unter „Programm/Script“ Folgendes ein: powershellc. Fügen Sie unter „Argumente hinzufügen (optional)“ Folgendes ein: -file C:\FilePathtoPowershellScirpt\dashlane-ad-sync.ps1
Zusätzliche Anmerkungen
- Haben Sie die Synchronisierung einmal konfiguriert, empfehlen wir Ihnen, Ihre Dashlane-Gruppen und -Benutzer ausschließlich über Ihr Active Directory zu verwalten.
- Alle Benutzer, die von dem Script betroffen sind, müssen eine spezifische E-Mail-Adresse im Active Directory haben.
- Administratoren können kein Deprovisioning für alle Admin-Benutzer ausführen, da es mindestens einen aktiven Administrator für jeden Business-Tarif geben muss.
- Administratoren können kein Deprovisioning für Abrechnungs-Administratoren vornehmen, da es mindestens einen aktiven Abrechnungs-Administrator für jeden Business-Tarif geben muss.
- Die Benutzeranzahl in den synchronisierten Gruppen darf nicht höher als die Anzahl der verfügbaren Lizenzen Ihres Business-Kontos sein.