{"id":8407,"date":"2024-11-12T20:57:37","date_gmt":"2024-11-12T20:57:37","guid":{"rendered":"https:\/\/pariswells.com\/blog\/?p=8407"},"modified":"2024-12-16T04:36:56","modified_gmt":"2024-12-16T04:36:56","slug":"how-to-export-groups-and-membership-from-azure-ad-and-import-sync-membership-to-onprem-ad","status":"publish","type":"post","link":"https:\/\/pariswells.com\/blog\/research\/how-to-export-groups-and-membership-from-azure-ad-and-import-sync-membership-to-onprem-ad","title":{"rendered":"How to export Groups and Membership from Azure AD and Import \\ Sync Membership to OnPrem AD"},"content":{"rendered":"\n<p>Export the Groups from Exchange 365 UI into CSV<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">#Create Security Group from CSV\nimport-csv C:\\TEMP\\Export\\Group.csv -Encoding UTF8 | foreach-object {New-ADGroup -Name $_.Name -Description $_.Description -DisplayName $_.Name -SamAccountName $_.Alias -GroupScope Universal -GroupCategory Security -Path \"OU=Security Groups,OU=XXXXXXXX,DC=Domain,DC=local\"}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">#Create Distribution Lists from CSV\nimport-csv C:\\TEMP\\Export\\Group.csv -Encoding UTF8 | foreach-object {New-ADGroup -Name $_.Name -Description $_.Description -DisplayName $_.Name -SamAccountName $_.Alias -GroupScope Universal -GroupCategory Distribution -Path \"OU=Groups,OU=XXXXX,DC=domain,DC=local\" -OtherAttributes @{mail = $_.Email}}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">#Add Distribution Lists Membership\n# Import modules\nImport-Module AzureAD\nImport-Module ActiveDirectory\n\n\n# Authenticate with Azure AD\nConnect-AzureAD\n\n$csv = Import-csv C:\\TEMP\\Export\\Group.csv -Encoding UTF8\n\nforeach ($item in $csv) \n{\n\n$AzureADGroupId = $item.GroupID  # Azure AD Group ID\n$OnPremADGroup = $item.Alias  # On-prem AD group name\n\n# Retrieve members of the Azure AD Group\n$azureADMembers = Get-AzureADGroupMember -ObjectId $AzureADGroupId -All $true | Where-Object { $_.UserType -eq \"Member\" }\n\n# Convert Azure AD members to a list of UPNs\n$azureADUserPrincipalNames = $azureADMembers | Select-Object -ExpandProperty UserPrincipalName\n\n# Get members of the on-prem AD Group\n$onPremADMembers = Get-ADGroupMember -Identity $OnPremADGroup -Recursive | Where-Object { $_.objectClass -eq 'user' } | Select-Object -ExpandProperty SamAccountName\n\n# Compare and Add missing members to on-prem AD group\nforeach ($userPrincipalName in $azureADUserPrincipalNames) {\n    $samAccountName = $userPrincipalName.Split('@')[0]\n    if ($onPremADMembers -notcontains $samAccountName) {\n        # Check if user exists in on-prem AD before adding\n        $onPremUser = Get-ADUser -Filter { UserPrincipalName -eq $userPrincipalName }\n        if ($onPremUser) {\n            Add-ADGroupMember -Identity $OnPremADGroup -Members $onPremUser.SamAccountName\n            Write-Output \"Added $samAccountName to $OnPremADGroup\"\n        } else {\n            Write-Output \"User $samAccountName not found in on-prem AD\"\n        }\n    }\n}\n\n}\n\nWrite-Output \"Azure AD to On-Prem AD group sync complete.\"<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"># Copy Users in Security Group Membership\n# Import modules\nImport-Module AzureAD\nImport-Module ActiveDirectory\n\n# Authenticate with Azure AD\nConnect-AzureAD\n\n$csv = Import-csv C:\\TEMP\\Export\\Group.csv -Encoding UTF8\n\nforeach ($item in $csv) \n{\n\n$AzureADGroupId = $item.GroupID  # Azure AD Group ID\n$OnPremADGroup = $item.Alias  # On-prem AD group name\n\n# Retrieve members of the Azure AD Group\n$azureADMembers = Get-AzureADGroupMember -ObjectId $AzureADGroupId -All $true | Where-Object { $_.UserType -eq \"Member\" }\n\n# Convert Azure AD members to a list of UPNs\n$azureADUserPrincipalNames = $azureADMembers | Select-Object -ExpandProperty UserPrincipalName\n\n# Get members of the on-prem AD Group\n$onPremADMembers = Get-ADGroupMember -Identity $OnPremADGroup -Recursive | Where-Object { $_.objectClass -eq 'user' } | Select-Object -ExpandProperty SamAccountName\n\n# Compare and Add missing members to on-prem AD group\nforeach ($userPrincipalName in $azureADUserPrincipalNames) {\n    $samAccountName = $userPrincipalName.Split('@')[0]\n    if ($onPremADMembers -notcontains $samAccountName) {\n        # Check if user exists in on-prem AD before adding\n        $onPremUser = Get-ADUser -Filter { UserPrincipalName -eq $userPrincipalName }\n        if ($onPremUser) {\n            Add-ADGroupMember -Identity $OnPremADGroup -Members $onPremUser.SamAccountName\n            Write-Output \"Added $samAccountName to $OnPremADGroup\"\n        } else {\n            Write-Output \"User $samAccountName not found in on-prem AD\"\n        }\n    }\n}\n\n}\n\nWrite-Output \"Azure AD to On-Prem AD group sync complete.\"<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"># Copy Groups in Security Group Membership\n# Load required modules\nImport-Module AzureAD\nImport-Module ActiveDirectory\n\n$csv = Import-csv C:\\TEMP\\Export\\SGGroup.csv -Encoding UTF8\n\nConnect-AzureAD # Replace with your Tenant ID if required\n\nforeach ($item in $csv) \n{\n\n\n# Get all nested groups in Azure AD\n$azureADNestedGroups = Get-AzureADGroupMember -ObjectId $item.id | Where-Object { $_.ObjectType -eq \"Group\" }\n\n\nforeach ($group in $azureADNestedGroups) {\n\nAdd-ADGroupMember -Identity $item.displayName -Members $group.Displayname\n\n}\n\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Export the Groups from Exchange 365 UI into CSV<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-8407","post","type-post","status-publish","format-standard","hentry","category-research"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts\/8407","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/comments?post=8407"}],"version-history":[{"count":2,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts\/8407\/revisions"}],"predecessor-version":[{"id":8470,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/posts\/8407\/revisions\/8470"}],"wp:attachment":[{"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/media?parent=8407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/categories?post=8407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pariswells.com\/blog\/wp-json\/wp\/v2\/tags?post=8407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}