Användarsynkronisering med Azure AD/Active Directory
Den här artikeln finns i videoformat samt en skriftlig artikel som innehåller mer information.
Observera: På grund av ändringar i PowerShell-modulen är delar av videon föråldrade. Videon kan fortfarande användas som referens. Koden i den här artikeln är uppdaterad.
Azure AD / Active Directory-synkroniseringen kan automatiskt skapa, uppdatera och inaktivera användare från Azure AD eller Active Directory.
Vi har skapat PowerShell-modulen "BrightBookingUserAdminTools" som hanterar denna logik. Genom att skapa en (planerad) uppgift med rätt PowerShell-kommandon kan du regelbundet skicka denna information till GoBright från din server.
Obs: GoBright tar endast emot data via detta BrightBookingUserAdminTools. GoBright har inte behörighet att skicka data tillbaka till din Azure AD / Active Directory.
GoBright som en företagsapplikation i Azure AD
Innan vi fortsätter med avsnittet nedan vill vi påpeka att du kan konfigurera GoBright en företagsapplikation inom Azure AD. Detta gör att du kan skapa/uppdatera användare på plattformen automatiskt och enkelt aktivera SSO. Vi rekommenderar starkt att du följer stegen i artikeln nedan innan du fortsätter: GoBright företagsapplikation (Azure AD)
Inledning
Integrationslogiken finns tillgänglig som en PowerShell-modul, via PowerShellGallery, som "BrightBookingUserAdminTools".
PowerShell-modulen "BrightBookingUserAdminTools" ska installeras på en maskin (server) i din domän.
När den är konfigurerad följer den följande steg varje gång den körs:
- Hämta användarna från Azure AD eller Active Directory, filtrerade efter dina önskemål, t.ex. filtrerade efter gruppmedlemskap
- Dessa användare skickas till GoBright och skapas eller uppdateras omedelbart
- Om användaren avaktiveras i Azure AD eller Active Directory kommer den också att avaktiveras i GoBright
- Användare som inte läses från Azure AD eller Active Directory uppdateras inte heller i GoBright
Följ stegen nedan för att installera och konfigurera synkroniseringen Schemalagd i Schemaläggaren på en lokal server!
PowerShell-skriptet kan också schemaläggas för att köras på Azure Automation Runbook. Dokumentationen för Azure Runbook finns här.
Steg 1
Installera förkunskapskrav
Modulen BrightBookingUserAdminTools har följande beroenden:
- PowerShell version 5 eller högre
- Följande PowerShell-moduler:
- PowerShellGalleri
- ActiveDirectory
- Azure AD
- Maskinen (servern) ska vara kopplad till din Windows-domän
Följ de följande stegen för att installera beroendena:
- Logga in på den maskin (server) där du vill installera uppgiften. (den här maskinen bör vara länkad i Windows-domänen).
- Starta PowerShell på den maskinen, som "administratör":
- Kontrollera om PowerShell 5 är installerat:
-
Utför följande kommando:
$PSVersionTable.PSVersion - I det resultat du får bör "Major" vara "5" eller högre.
- Om 'Major' är lägre än '5', följ dessa steg:
- Installera Windows Management Framework 5 (detta inkluderar PowerShell 5):
Hämta Windows Management Framework 5 - Obs 1: Om du får felmeddelandet "Uppdateringen är inte tillämplig på din dator" har du förmodligen valt fel nedladdning, se den här artikeln.
- Anm. 2: Windows Management Framework 5 är beroende av .NET Framework 4.5.
- Obs 3: Omstart är förmodligen nödvändig.
-
Efter installationen, kontrollera att "Major"är "5"eller högre:
$PSVersionTable.PSVersion
- Installera Windows Management Framework 5 (detta inkluderar PowerShell 5):
-
- PowerShell ExecutionPolicy(valfritt)
- Ställ in PowerShell ExecutionPolicy till obegränsad
-
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
-
- Ställ in PowerShell ExecutionPolicy till obegränsad
- Tvinga fram TLS 1.2-anslutning:
-
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $ErrorActionPreference = "Stop"
-
- Installera PowerShellGallery PowerShell-modulen:
- Utför följande kommandon i PowerShell (körs som administratör)
-
Installera NuGet PackageProvider:
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -
Konfigurera PowerShellGallery som en betrodd källa:
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted -
Installera modulen PowerShellGet:
Import-Module -Name PowerShellGet
- Om du vill synkronisera med Active Directory: Installera ActiveDirectory PowerShell-modulen:
- ActiveDirectory PowerShell-modulen är en del av RSAT (Remote Server Administration Tools).
- ActiveDirectory PowerShell-modulen är en del av RSAT (Remote Server Administration Tools).
- Om du vill synkronisera med Azure AD: Installera PowerShell-modulen för Microsoft.Graph:
- Utför följande kommandon i PowerShell (körs som administratör)
- Obs: .Net Framework 4.7.2 eller högre krävs, för mer dokumentation se: https://learn.microsoft.com/en-us/powershell/microsoftgraph/installation?view=graph-powershell-1.0
-
Installera de tillämpliga Microsoft.Graph-modulerna:
Install-Module Microsoft.Graph.Applications -Force Install-Module Microsoft.Graph.Users -Force Install-Module Microsoft.Graph.Groups -Force Install-Module Microsoft.Graph.Identity.DirectoryManagement -Force
Steg 2
Installation/Uppdatering av synkroniseringsmodulen
Installera eller uppdatera PowerShell-modulen BrightBookingUserAdminTools:
Install-Module -Name BrightBookingUserAdminTools -Force
Kommandot "-Force" ser till att den senaste versionen av modulen installeras även om det finns en tidigare installation. Om modulen redan var installerad måste PowerShell-sessionen startas om.
Steg 3
Konfiguration: hämta API-URL och API-nyckel
För att kunna synkronisera användarna måste du få följande information i GoBright Portal:
- API-URL och API-nyckel
- Namnet på den integration som ska kopplas till användarna
Följ dessa steg för att hitta API-URL och API-nyckel:
- Logga in med ett chefskonto i GoBright
- Gå till Admin center > Integrationer > API-åtkomst
- Generera en API-nyckel genom att klicka på knappen "Lägg till". Välj som typ 'manager' och ange en beskrivning för senare referens
- Obs: se till att du sparar API-nyckeln, eftersom det inte finns något sätt att återställa den
- API-URL:en är din GoBright som finns i URL-fältet i din webbläsare och under Admin center > Integrationer > API-åtkomst: API-URL https://[tenant-id].gobright.cloud/
Följ dessa steg för att hitta namnet på integrationen:
- Logga in med ett chefskonto i GoBright
- Gå till Admin center > Integrationer
- Kopiera namnet på den integration (Exchange/Office 365) som ska användas för att koppla användarna till
Namnet på integrationen, API-URL:en och API-nyckeln behövs i nästa steg.
Steg 4
Konfigurera PowerShell-skriptet för synkronisering
I det sista steget kommer du att bygga det faktiska skriptet för att berätta för GoBright PowerShell-modulen vilka användare du vill hämta och skicka till din GoBright . Detta kan göras med Azure AD eller Active Directory.
GoBright kräver kommunikation med TLS 1.2. Beroende på vilket system du använder kanske detta inte sker automatiskt. Se koden nedan och implementera detta i varje PowerShell-skript som kommunicerar med GoBright.
Lägg också till $ErrorActionPreference för att se till att det stoppar skriptet när ett fel inträffar. Glöm inte att lägga till raderna nedan i vart och ett av dina skript.
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$ErrorActionPreference = "Stop"
Välj en av förklaringarna till skriften som passar in på din situation nedan.
Skript för Azure AD-synkronisering med hjälp av modulen Microsoft.Graph
Steg 4.1: Connect din Azure AD
Starta PowerShell och anslut till din Azure AD via kommandot:
Connect-MgGraph -Scopes 'User.Read.All','Group.Read.All','GroupMember.Read.All'
Steg 4.2: Testa urvalet av användare
Nedan hittar du några exempel på kommandon, du kan anpassa dem efter din situation.
Dessa kommandon kommer ännu inte att uppdatera användare i GoBright, eftersom de innehåller parametern "-WhatIf".
Exempel på synkroniseringskommandon:
Behandla användare och lägg till användarrollerna i GoBright baserat på deras gruppmedlemskap i Azure AD:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $ErrorActionPreference = "Stop" Connect-MgGraph -Scopes 'User.Read.All','Group.Read.All','GroupMember.Read.All' $includedGroups = @()
$includedGroups += '[your AzureAD groupname_1 here]' $includedGroups += '[your AzureAD groupname_2 here]'
# get the list of userid's in the group $groups = Get-MgGroup -All | Where-Object { $includedGroups -contains $_.DisplayName } $users_in_groups_userids = @(); Foreach ($group in $groups) { $groupMembers = Get-MgGroupMember -All -GroupID $group.id Foreach ($groupMember in $groupMembers) { $users_in_groups_userids += $groupMember.Id } } # get the required details of those users $users_full_list = Get-MgUser -All -Select Id,DisplayName,Mail,UserPrincipalName,AccountEnabled,MobilePhone,AssignedLicenses $users = $users_full_list | Where-Object { $users_in_groups_userids -contains $_.Id } Write-Output "Loaded from AzureAD: $(($users | Measure-Object).Count) users" # define the mapping of groups to roles $groupToRoleMapping = @()
$groupToRoleMapping += @ # match specific users that belong to a group for Meet-Work-Visit
$groupToRoleMapping += @ # match specific users that belong to a group for Meet-Work-Visit
$groupToRoleMapping += @ # match specific users that belong to a group for Meet-Work-Visit
$groupToRoleMapping += @ # match specific users that belong to a group for View
$groupToRoleMapping += @ # **special case** this line matches for every user, because of the 'MatchType', and is needed when you want to have a generic role for every user
$roleNameDefaultIfNoGroupMatched = "Regular user"
$users | Push-AzureADUsersToBB -DeactivateExistingUsersInSameIntegrationThatAreNotLoaded -UserDefaultRoleName $roleNameDefaultIfNoGroupMatched -GroupUserRoleMapping $groupToRoleMapping -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Tillgängliga parametrar för Push-AzureADUsersToBB
Du kan använda följande parametrar i kommandot "Push-AzureADUsersToBB":
|
-ADUserSpecificUsername Användarnamn |
Som standard kommer användaren att autentisera sig med användarens primära e-postadress till Microsoft Exchange Server eller Office365. Ange detta värde för att använda ett annat sätt att autentisera användaren till Microsoft Exchange Server eller Office365: |
| -ADUserPincodePropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda som "pincode" (måste vara numeriskt, minst 4 siffror och måste vara unikt). |
| -ADUserMobilePropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda för att få fram användarnas mobilnummer (t.ex. för avisering om digital mottagning) |
| -ADUserNFCIdPropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda för att få NFC-identifieraren för den användaren. |
| -ADUserDefaultCostCenterId OrNamePropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda för att ange standardkostnadsställe för den användaren. Du kan ange namnet eller id:t ("guid") för kostnadsstället, där namnet är vanligast. |
| -GroupUserRoleMapping |
Denna parameter ger dig möjlighet att tilldela en roll till en användare i plattformen, baserat på ett gruppmedlemskap i Azure AD. Se exemplet nedan. |
| -UserRoleNameForNewUsers (valfritt) |
Valfritt namn på en befintlig roll i portalen som ska användas när nya användare skapas genom denna synkronisering. |
| -DeactivateExistingUsersIn SameIntegrationThatAreNotLoaded (valfritt) |
Valfri switch för att automatiskt inaktivera användare som inte längre finns i de valda användarna från ActiveDirectory, men som fortfarande finns i portalen. |
| -IncludeUsersWithoutAzureAD Tilldelade licenser eller tilldelade planer |
Inkludera användare som inte har Azure AD-licenser tilldelade (skulle annars inkluderas som inaktiva) eller Azure AD-planer tilldelade (skulle annars uteslutas helt). Observera att om du inkluderar dessa användare kan det leda till att du får oavsiktliga "användare" som serviceacounts, användare av rumsbrevlådor osv. Detta kan minskas genom att filtrera användarna innan de matas in i det här kommandot. |
| -BrightBookingApiUrl (krävs) |
API-webbadressen, som du hittade i steg 3 |
| -BrightBookingApiKey (krävs) |
API-webbadressen, som du hittade i steg 3 |
| -BrightBookingIntegrationName (krävs) |
API-webbadressen, som du hittade i steg 3 |
| -WhatIf (valfritt) |
Använd parametern "-WhatIf" för att bara testa och se, men inte för att faktiskt skicka data till din GoBright |
Steg 4.2: Kör den faktiska synkroniseringen
När listan med användare har filtrerats korrekt kan du utföra den verkliga synkroniseringen genom att ta bort parametern "-WhatIf".
Så kör nu samma kommando, men utan "-WhatIf" och det kommer att bearbeta användarna till din GoBright .
Steg 4.3: Schemalägg integrationen så att den körs med jämna mellanrum via Windows aktivitetsschemaläggare
För att kunna köra skriptet obevakat bör du på något sätt logga in automatiskt.
Det rekommenderade sättet att använda obevakad inloggning, detta kan göras via certifikat, via appregistrering i Azure AD:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $ErrorActionPreference = "Stop"
#This script will create een enterprise app with a local certificate for unattended authorisation.
#Set the enterprise app name $AppName = "GoBright_UserSync_UnattendedLogin" $ErrorActionPreference = "Stop" #Connect with the graph to be able to create or update the application Connect-MgGraph -Scopes "Application.Read.All","Application.ReadWrite.All" #Get the tenantid $organization = Get-MgOrganization $APPTenantID = $organization.Id #Create or update the enterprise app $foundApps = Get-MgApplication | Where-Object {$_.DisplayName -eq $AppName} $foundAppsCount = $foundApps | Measure-Object if ($foundAppsCount.Count -eq 0) { # create the app $App = New-MgApplication -DisplayName $AppName $APPObjectID = $App.Id $APPClientID = $App.AppId } Else { $APPObjectID = $foundApps.Id $APPClientID = $foundApps.AppId } #Create a local self-signed certificate to use it as credential for the enterprise app $foundCerts = Get-ChildItem -Path cert:CurrentUsermy | Where-Object { $_.Subject -eq "CN=$($AppName)" } $foundCertsCount = $foundCerts | Measure-Object If ($foundCertsCount.Count -eq 0) { # create self-signed cert $thumb = (New-SelfSignedCertificate -CertStoreLocation Cert:CurrentUserMy -subject $AppName -KeyExportPolicy Exportable -NotAfter (Get-Date).AddYears(20) -Type CodeSigningCert -KeySpec Signature).Thumbprint $foundCerts = Get-ChildItem -Path cert:CurrentUsermy$thumb $cert = $foundCerts[0] } Else { $cert = $foundCerts[0] } #Create a keyCredential from the certificate for the enterprise app $keyCreds = @{ Type = "AsymmetricX509Cert"; Usage = "Verify"; key = $cert.RawData } try { #Set credentials Update-MgApplication -ApplicationId $APPObjectID -KeyCredentials $keyCreds #Set permission scopes, needs to go via id, see: https://learn.microsoft.com/en-us/graph/permissions-reference #'User.Read.All' = df021288-bdef-4463-88db-98f22de89214 #'Group.Read.All' = 5b567255-7703-4780-807c-7be8301ae99b #'GroupMember.Read.All' = 98830695-27a2-44f7-8c18-0c3ebc9698f6 $params = @{ RequiredResourceAccess = @( @{ ResourceAppId = "00000003-0000-0000-c000-000000000000" ResourceAccess = @( @{ Id = "df021288-bdef-4463-88db-98f22de89214" Type = "Role" }, @{ Id = "5b567255-7703-4780-807c-7be8301ae99b" Type = "Role" }, @{ Id = "98830695-27a2-44f7-8c18-0c3ebc9698f6" Type = "Role" } ) } )} Update-MgApplication -ApplicationId $APPObjectID -BodyParameter $params } catch { Write-Error $Error[0] } #Output details and request the admin to check the consent
Write-Output "App registration '$($AppName)' is now available, please use following details in the user sync script:"
Write-Output " - ClientId: $($APPClientID)"
Write-Output " - TenantId: $($APPTenantID)"
Write-Output " - CertificateThumbprint: $($cert.Thumbprint)"
Write-Output "NOTE: Please give admin consent in the AzureAD portal to this app!"
Administratörens samtycke i AzureAD
Gå till Azure-portalen och öppna den skapade företagsapplikationen för obevakad inloggning och välj API-behörighet > Ge administratörsgodkännande för "Din domän"
Nu kan du använda följande sätt för att automatiskt logga in på ditt Azure AD med den obevakade inloggningsmetoden och testa ditt skript via "-WhatIf" innan du kör det faktiska användarsynkroniseringsskriptet:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$ErrorActionPreference = "Stop"
$clientid = "[fill in your client from the output of the first script]" $tenantid = "[fill in your tenant id from the output of the first script]" $thumb = "[fill in your thumb id from the output of the first script]" Connect-MgGraph -ClientId $clientid -TenantId $tenantid -CertificateThumbprint $thumb
$includedGroups = @()
$includedGroups += '[your AzureAD groupname_1 here]' $includedGroups += '[your AzureAD groupname_2 here]'
# get the list of userid's in the group $groups = Get-MgGroup -All | Where-Object { $includedGroups -contains $_.DisplayName } $users_in_groups_userids = @(); Foreach ($group in $groups) { $groupMembers = Get-MgGroupMember -All -GroupID $group.id Foreach ($groupMember in $groupMembers) { $users_in_groups_userids += $groupMember.Id } } # get the required details of those users $users_full_list = Get-MgUser -All -Select Id,DisplayName,Mail,UserPrincipalName,AccountEnabled,MobilePhone,AssignedLicenses $users = $users_full_list | Where-Object { $users_in_groups_userids -contains $_.Id } Write-Output "Loaded from AzureAD: $(($users | Measure-Object).Count) users" # define the mapping of groups to roles $groupToRoleMapping = @()
$groupToRoleMapping += @ # match specific users that belong to a group for Meet-Work-Visit
$groupToRoleMapping += @ # match specific users that belong to a group for Meet-Work-Visit
$groupToRoleMapping += @ # match specific users that belong to a group for Meet-Work-Visit
$groupToRoleMapping += @ # match specific users that belong to a group for View
$groupToRoleMapping += @ # **special case** this line matches for every user, because of the 'MatchType', and is needed when you want to have a generic role for every user
$roleNameDefaultIfNoGroupMatched = "Regular user"
$users | Push-AzureADUsersToBB -DeactivateExistingUsersInSameIntegrationThatAreNotLoaded -UserDefaultRoleName $roleNameDefaultIfNoGroupMatched -GroupUserRoleMapping $groupToRoleMapping -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Följ sedan dessa steg för att synkronisera användarna från Active Directory enligt ett schema:
- Ta kommandot som du har komponerat (se föregående steg) och spara det i en .ps1-fil:
- Skapa en .ps1-fil (t.ex. UsersToBrightBooking.ps1) i en mapp som du föredrar
- Öppna filen med en editor, t.ex. "notepad
- Klistra in inloggningsskriptet för att automatiskt logga in på din Azure AD
- Klistra in hela kommandot i filen
- Spara filen
- Exekvera filen för att se om den är framgångsrik
- Skapa en uppgift i Windows aktivitetsschemaläggare:
- Öppna Windows aktivitetsschemaläggare
- Skapa en uppgift
- Ställ in ett schema, t.ex. en gång om dagen eller var 4:e timme
- Lägg till en åtgärd "Starta ett program":
- Program/skript:
Powershell.exe - Parametrar:
-windowstyle minimized -c "powershell -c .[Namnet på den skapade .ps1-filen] -verbose >> ExportToGoBright_Output.txt 2>&1″ - Start in:
Fyll i "start in" med platsen där skriptet finns, t.ex: C:skript
- Program/skript:
"Skript
Steg 4.1: Connect din Azure AD
Starta PowerShell och anslut till din Azure AD via standardkommandot "Connect".
AzureAD powershell-modul är föråldrad
Observera att AzureAD powershell-modulen är föråldrad, vänligen migrera till Microsoft.Graph powershell-modulen (se ovan i den här artikeln)
Steg 4.2: Testa urvalet av användare
Kommandot för att hämta informationen från Active Directory och bearbeta den i BrightBooking är:
Get-AzureADUser -All $true [optional: filter] | Push-AzureADUsersToBB [optional: specific username/pincode field] -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]'
Du kan använda följande parametrar i kommandot "Push-AzureADUsersToBB":
|
-ADUserSpecificUsername Användarnamn |
Som standard kommer användaren att autentisera sig med användarens primära e-postadress till Microsoft Exchange Server eller Office365. Ange detta värde för att använda ett annat sätt att autentisera användaren till Microsoft Exchange Server eller Office365: |
| -ADUserPincodePropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda som "pincode" (måste vara numeriskt, minst 4 siffror och måste vara unikt). |
| -ADUserMobilePropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda för att få fram användarnas mobilnummer (t.ex. för avisering om digital mottagning) |
| -ADUserNFCIdPropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda för att få NFC-identifieraren för den användaren. |
| -ADUserDefaultCostCenterId OrNamePropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda för att ange standardkostnadsställe för den användaren. Du kan ange namnet eller id:t ("guid") för kostnadsstället, där namnet är vanligast. |
| -GroupUserRoleMapping |
Denna parameter ger dig möjlighet att tilldela en roll till en användare i plattformen, baserat på ett gruppmedlemskap i Azure AD. Se exemplet nedan. |
| -UserRoleNameForNewUsers (valfritt) |
Valfritt namn på en befintlig roll i portalen som ska användas när nya användare skapas genom denna synkronisering. |
| -DeactivateExistingUsersIn SameIntegrationThatAreNotLoaded (valfritt) |
Valfri switch för att automatiskt inaktivera användare som inte längre finns i de valda användarna från ActiveDirectory, men som fortfarande finns i portalen. |
| -IncludeUsersWithoutAzureAD Tilldelade licenser eller tilldelade planer |
Inkludera användare som inte har Azure AD-licenser tilldelade (skulle annars inkluderas som inaktiva) eller Azure AD-planer tilldelade (skulle annars uteslutas helt). Observera att om du inkluderar dessa användare kan det leda till att du får oavsiktliga "användare" som serviceacounts, användare av rumsbrevlådor osv. Detta kan minskas genom att filtrera användarna innan de matas in i det här kommandot. |
| -BrightBookingApiUrl (krävs) |
API-webbadressen, som du hittade i steg 3 |
| -BrightBookingApiKey (krävs) |
API-webbadressen, som du hittade i steg 3 |
| -BrightBookingIntegrationName (krävs) |
API-webbadressen, som du hittade i steg 3 |
| -WhatIf (valfritt) |
Använd parametern "-WhatIf" för att bara testa och se, men inte för att faktiskt skicka data till din GoBright |
Nedan hittar du några exempel på kommandon, du kan anpassa dem så som du behöver för att passa din situation.
Dessa kommandon kommer ännu inte att uppdatera användare i systemet, så det är testkommandon eftersom de innehåller parametern "-WhatIf".
Exempel på testkommandon:
Processa alla användare i Azure AD till GoBright:
Get-AzureADUser -All $true | Push-AzureADUsersToBB -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Bearbeta användare med UPN som slutar med "yourdomain.com" till GoBright:
Get-AzureADUser -All $true | where {$_.userprincipalname -like "*yourdomain.com"} | Push-AzureADUsersToBB -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Behandla användare med ett NFC-ID och en PIN-kod i ett anpassat attribut, observera att namnet på tilläggsattributet måste vara identiskt med det i Azure AD:
$users_all_import = Get-AzureADUser -All $true [optional: filter]
$users_all = @()
$pincodeField = '[Extension attribute here]'
$NFCField = '[Extension attribute here]'
Foreach ($user in $users_all_import) {
$getExtensionProperty = $user | Select-Object -ExpandProperty ExtensionProperty
If ($getExtensionProperty.$pincodeField) {
$pin = (Get-AzureADUserExtension -ObjectId $user.ObjectId).get_item($pincodeField)
} Else {
$pin = ''
}
If ($getExtensionProperty.$NFCField) {
$nfc = (Get-AzureADUserExtension -ObjectId $user.ObjectId).get_item($NFCField)
} Else {
$nfc = ''
}
$user | Add-Member UserPincode $pin -Force
$user | Add-Member UserNFC $nfc -Force
$users_all += $user
}
$users_all | Push-AzureADUsersToBB -ADUserPincodePropertyName UserPincode -ADUserNFCIdPropertyName UserNFC -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Behandla användare och lägg till användarrollerna i GoBright baserat på deras gruppmedlemskap i Azure AD:
$groupToRoleMapping = @()
$groupToRoleMapping += @ # match specific users that belong to a group for Meet-Work-Visit
$groupToRoleMapping += @ # match specific users that belong to a group for Meet-Work-Visit
$groupToRoleMapping += @ # match specific users that belong to a group for Meet-Work-Visit
$groupToRoleMapping += @ # match specific users that belong to a group for View
$groupToRoleMapping += @ # **special case** this line matches for every user, because of the 'MatchType', and is needed when you want to have a generic role for every user
$roleNameDefaultIfNoGroupMatched = "Regular user"
$users_all = Get-AzureADUser -All $true
$users_all | Push-AzureADUsersToBB -UserDefaultRoleName $roleNameDefaultIfNoGroupMatched -GroupUserRoleMapping $groupToRoleMapping -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Behandla alla användare utom de som är medlemmar i en viss grupp i Azure AD:
$excludedGroups = @()
$excludedGroups += '[GroupName1]'
$excludedGroups += '[GroupName2]'
$excludedGroups += '[GroupName3]'
$ADGroups = Get-AzureADGroup -All $true | Where-Object { $excludedGroups -notcontains $_.DisplayName }
$users_all = $ADGroups | Get-AzureADGroupMember -All $true
$users_all | Push-AzureADUsersToBB -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Steg 4.2: Kör den faktiska synkroniseringen
När listan med användare har filtrerats korrekt kan du utföra den verkliga synkroniseringen genom att ta bort parametern "-WhatIf".
Så kör nu samma kommando, men utan "-WhatIf" och det kommer att bearbeta användarna till din GoBright .
Steg 4.3: Schemalägg integrationen så att den körs med jämna mellanrum via Windows aktivitetsschemaläggare
För att kunna köra skriptet obevakat bör du på något sätt logga in automatiskt.
Rekommenderad metod för obevakad inloggning:
Det rekommenderade sättet att göra obevakad inloggning är att skapa en registrerad app i Azure AD och ansluta till den appen:
#script for creating user, cert, and get tenantid #getting data for daily script
Connect-AzureAD $pwd = "Password to encrypt the cert" $subject = "GoBright_unattendedlogin" # may not be longer than 15 characters = the name certificate and app $tmppath = "C:tmp" $certname= "unattendedlogin_azuread.pfx" $fullcertpath = "C:tmpunattendedlogin.pfx" $IdentifierUris = "https://www.fillInYourOwnDomain.com" # Here you need to fill in your own domain name
$thumb = (New-SelfSignedCertificate -CertStoreLocation Cert:CurrentUserMy -subject $subject -KeyExportPolicy Exportable -NotAfter (Get-Date).AddYears(10) -Type CodeSigningCert -KeySpec Signature).Thumbprint $pwd = ConvertTo-SecureString -String $pwd -Force -AsPlainText if ($tmppath -eq $false) Export-PfxCertificate -cert "cert:CurrentUsermy$thumb" -FilePath $fullcertpath -Password $pwd
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate($fullcertpath, $pwd) $keyValue = [System.Convert]::ToBase64String($cert.GetRawCertData())
$application = New-AzureADApplication -DisplayName $subject -IdentifierUris $IdentifierUris New-AzureADApplicationKeyCredential -ObjectId $application.ObjectId -CustomKeyIdentifier $subject -Type AsymmetricX509Cert -Usage Verify -Value $keyValue $sp=New-AzureADServicePrincipal -AppId $application.AppId Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Directory Readers"}).Objectid -RefObjectId $sp.ObjectId
$tenantid = Get-AzureADTenantDetail | Select ObjectId -ExpandProperty ObjectId $appid = $application.AppId $thumb $tenantid $appid
#copy data from thumb, tenantid, appid to daily user sync script
För mer information, vänligen klicka på denna länk.
För teständamål kan du använda följande sätt för att automatiskt logga in på ditt Azure AD med den obevakade inloggningsmetoden och testa ditt skript innan du kör det faktiska användarsynkroniseringsskriptet:
$tenantid = "[fill in your tenant id from the output of the first script]" $thumb = "[fill in your thumb id from the output of the first script]" $appid = "[fill in your appid from the output of the first script]"
Connect-AzureAD -TenantId $tenantid -ApplicationId $appid -CertificateThumbprint $thumb
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $ErrorActionPreference = "Stop"
$users_all = Get-AzureADUser -All $true | Where-Object {$_.userprincipalname -like "*someDomainname.com"} $users_all | Push-AzureADUsersToBB -UserDefaultRoleName $roleNameDefaultIfNoGroupMatched -GroupUserRoleMapping $groupToRoleMapping -DeactivateExistingUsersInSameIntegrationThatAreNotLoaded -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Obs: om du får ett felmeddelande i PowerShell om att det inte finns tillräckliga rättigheter för att köra skriptet måste du kontrollera vilka rättigheter som ska läggas till i appen. För mer information, läs följande Microsoft-artikel "Steg 5: Tilldela Azure AD-roller till applikationen ": https://docs.microsoft.com/en-us/powershell/exchange/app-only-auth-powershell-v2?view=exchange-ps
Följ sedan dessa steg för att synkronisera användarna från Active Directory enligt ett schema:
- Ta kommandot som du har komponerat (se föregående steg) och spara det i en .ps1-fil:
- Skapa en .ps1-fil (t.ex. UsersToBrightBooking.ps1) i en mapp som du föredrar
- Öppna filen med en editor, t.ex. "notepad
- Klistra in inloggningsskriptet för att automatiskt logga in på din Azure AD
- Klistra in hela kommandot i filen
- Spara filen
- Exekvera filen för att se om den är framgångsrik
- Skapa en uppgift i Windows aktivitetsschemaläggare:
- Öppna Windows aktivitetsschemaläggare
- Skapa en uppgift
- Ställ in ett schema, t.ex. en gång om dagen eller var 4:e timme
- Lägg till en åtgärd "Starta ett program":
- Program/skript:
Powershell.exe - Parametrar:
-windowstyle minimized -c "powershell -c .[Namnet på den skapade .ps1-filen] -verbose >> ExportToGoBright_Output.txt 2>&1″ - Start in:
Fyll i "start in" med platsen där skriptet finns, t.ex: C:skript
- Program/skript:
Skript för synkronisering av Active Directory
Steg 4.1: Testa urvalet av användare
Kommandot för att hämta informationen från Active Directory och bearbeta den i GoBright är:
Push-ADUsersToBB [filter] [optional: specific username/pincode field] -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]'
Du kan använda följande parametrar i kommandot "Push-ADUsersToBB":
| -Filter (krävs) |
Filtervillkoret för att filtrera de användare som du vill synkronisera(mer dokumentation finns tillgänglig) |
| -SearchBase (valfritt) |
Anger Active Directory-sökvägen som sökningen ska göras under(mer dokumentation finns tillgänglig) |
|
-ADSpecificUsername |
Som standard kommer användaren att autentisera sig med användarens primära e-postadress till Microsoft Exchange Server eller Office365. Ange dessa värden för att använda ett annat sätt att autentisera användaren till Microsoft Exchange Server eller Office365: |
| -ADUserPincodePropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda som "pincode" (måste vara numeriskt, minst 4 siffror och måste vara unikt) |
| -ADUserMobilePropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda för att få användarnas mobiltelefonnummer (t.ex. för avisering om digital mottagning) |
| -ADUserNFCIdPropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda för att hämta NFC-identifieraren för den användaren. Observera att det ska vara i HEX-format, t.ex: XX:XX:XX:XX:XX:XX:XX. |
| -ADUserDefaultCostCenterId OrNamePropertyName (valfritt) |
Ange ett fältnamn för ett fält i Active Directory som du vill använda för att ange standardkostnadsställe för den användaren. Du kan ange namnet eller id:t ("guid") för kostnadsstället, där namnet är vanligast. |
| -UserRoleNameForNewUsers (valfritt) |
Valfritt namn på en befintlig roll i plattformen som ska användas när nya användare skapas genom denna synkronisering. |
| -UserDefaultRoleName (valfritt) |
Ange standardrollnamnet för alla användare som inte har någon matchning i "GroupUserRoleMapping" (se nedan) |
| -GroupUserRoleMapping (valfritt) |
Denna parameter ger dig möjlighet att tilldela en roll till en användare i plattformen, baserat på ett gruppmedlemskap i ActiveDirectory. Se exemplet nedan. |
| -DeactivateExistingUsersIn SameIntegrationThatAreNotLoaded (valfritt) |
Valfri switch för att automatiskt inaktivera användare som inte längre finns i de valda användarna från ActiveDirectory, men som fortfarande finns i portalen. |
| -BrightBookingApiUrl (krävs) |
API-webbadressen, som du hittade i steg 3 |
| -BrightBookingApiKey (krävs) |
API-webbadressen, som du hittade i steg 3 |
| -BrightBookingIntegrationName (krävs) |
API-webbadressen, som du hittade i steg 3 |
| -WhatIf (valfritt) |
Använd parametern "-WhatIf" för att bara testa och se, men inte för att faktiskt skicka data till din GoBright |
Nedan hittar du några exempel på kommandon, du kan anpassa dem så som du behöver för att passa din situation.
Dessa kommandon kommer ännu inte att uppdatera användare i systemet, så det är testkommandon eftersom de innehåller parametern "-WhatIf".
Exempel på testkommandon:
Behandla användare med UPN som slutar med 'yourdomain.com':
Push-ADUsersToBB -Filter 'UserPrincipalName -like "*yourdomain.com"' -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Behandla användare med UPN:er som slutar med "yourdomain.com" och använd fältet "PersonnelNumber" i ActiveDirectory som pinkod för användarna:
Push-ADUsersToBB -Filter 'UserPrincipalName -like "*yourdomain.com"' -ADUserPincodePropertyName PersonnelNumber -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Behandla användare som är medlemmar i en specifik grupp i en OU (Organizational Unit):
Push-ADUsersToBB -Filter { memberOf -RecursiveMatch "CN=Administrators,DC=Company,DC=com" } -SearchBase "OU=Office,DC=Company,DC=com" -ADUserPincodePropertyName PersonnelNumber -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Behandla användare som är medlemmar i en specifik grupp i en OU (Organizational Unit) och ange en specifik roll baserat på deras gruppmedlemskap:
$groupToRoleMapping = @()
$groupToRoleMapping += @ # match specific users that belong to a group
$groupToRoleMapping += @ # match specific users that belong to a group
$groupToRoleMapping += @ # match specific users that belong to a group to a role of View
$groupToRoleMapping += @ # **special case** this line matches for every user, because of the 'MatchType', and is needed when you want to have a generic role for every user
$roleNameDefaultIfNoGroupMatched = "Regular user"
Push-ADUsersToBB -Filter { memberOf -RecursiveMatch "CN=OfficeUsers,DC=Company,DC=com" } -SearchBase "OU=Office,DC=Company,DC=com" -ADUserPincodePropertyName PersonnelNumber -UserDefaultRoleName $roleNameDefaultIfNoGroupMatched -GroupUserRoleMapping $groupToRoleMapping -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Behandla användare som är medlemmar i en viss grupp i en OU (Organizational Unit), med [domän][användarnamn] som autentiseringsanvändarnamn:
Push-ADUsersToBB -Filter { memberOf -RecursiveMatch "CN=Administrators,DC=Company,DC=com" } -SearchBase "OU=Office,DC=Company,DC=com" -ADSpecificUsername DomainPlusUsername -BrightBookingApiUrl '[API url]' -BrightBookingApiKey '[API key]' -BrightBookingIntegrationName '[name of integration as created in Admin center > Integrations]' -WhatIf
Steg 4.2: Kör den faktiska synkroniseringen
När listan med användare har filtrerats korrekt kan du utföra den verkliga synkroniseringen genom att ta bort parametern "-WhatIf".
Så kör nu samma kommando, men utan "-WhatIf" och det kommer att bearbeta användarna till din GoBright .
Steg 4.3: Schemalägg integrationen så att den körs med jämna mellanrum via Windows aktivitetsschemaläggare
Följ dessa steg för att synkronisera användarna från Active Directory enligt ett schema:
- Ta kommandot som du har komponerat (se föregående steg) och spara det i en .ps1-fil:
- Skapa en .ps1-fil (t.ex. UsersToBrightBooking.ps1) i en mapp som du föredrar
- Öppna filen med en editor, t.ex. "notepad
- Klistra in hela kommandot i filen
- Spara filen
- Exekvera filen för att se om den är framgångsrik
- Skapa en uppgift i Windows aktivitetsschemaläggare:
- Öppna Windows aktivitetsschemaläggare
- Skapa en uppgift
- Ställ in ett schema, t.ex. en gång om dagen eller var 4:e timme
- Lägg till en åtgärd "Starta ett program":
- Program/skript:
Powershell.exe - Parametrar:
-windowstyle minimized -c "powershell -c .[Namnet på den skapade .ps1-filen] -verbose >> ExportToGoBright_Output.txt 2>&1″ - Start in:
Fyll i "start in" med platsen där skriptet finns, t.ex: C:skript
- Program/skript:
Synkroniseringsintervall för testning
Rådet för synkroniseringsintervallet är en omfattning av följande belopp nedan:
- 0 till 2000 användare: synkroniseringen kan köras 4 gånger per dag
- Över 2000 användare: synkroniseringen kan köras 2 gånger per dag
För testning cirka 3-4 gånger per timme rekommenderar vi starkt att du kör skriptet med små grupper om 10 användare per körning.