cls ############################################################################ # Synchronize Public Folders to Distribution Groups in Office 365 | PFtoDL.ps1 # Version 1.0 | January 16, 2014 # by Roman Zarka | Microsoft Services ################################################################################ $TargetOu = "OU=PFContacts,DC=contoso,DC=com" $SmtpDomain = "@contoso.com" $MailFolders = ".\MailFolders.csv" $MailFolderMembers = ".\MailFolderMembers.csv" "FolderName,FolderAlias,FolderEmail,GroupName,GroupAlias,GroupEmail" | Out-File $MailFolderMembers # --- Load PowerShell Module for Active Directory Import-Module ActiveDirectory If ((Get-Module -Name ActiveDirectory) -eq $null) { Break } # --- Export Mail-Enabled Public Folders Write-Host "Retrieving mail-enabled public folders..." -ForegroundColor Yellow Get-MailPublicFolder -ResultSize Unlimited | Select Alias, DisplayName, PrimarySmtpAddress | Export-Csv $MailFolders -NoTypeInformation # --- Export Public Folder Group Membership Write-Host "Retrieving distribution groups..." -ForegroundColor Yellow $DistributionGroups = Get-DistributionGroup -ResultSize Unlimited Write-Host "Searching groups for mail-enabled public folders..." -ForegroundColor Yellow ForEach ($Group in $DistributionGroups) { Write-Host $Group.Name $GroupName = $Group.Name $GroupAlias = $Group.Alias $GroupEmail = $Group.PrimarySmtpAddress Get-DistributionGroupMember $Group -ResultSize Unlimited | Where { $_.RecipientType -eq "PublicFolder" } | ForEach { $MemberName = $_.Name $MemberAlias = $_.Alias $MemberEmail = $_.PrimarySmtpAddress "$MemberName,$MemberAlias,$MemberEmail,$GroupName,$GroupAlias,$GroupEmail" | Out-File $MailFolderMembers -Append } } # --- Create Hidden Contacts Write-Host "Creating public folder contacts..." -ForegroundColor Yellow Import-Csv $MailFolders | ForEach { $ContactName = $_.Alias + "-PFContact" $ContactAlias = $_.Alias + "-PFContact" $ContactSmtp = $_.Alias + "-PFContact" + $SmtpDomain New-MailContact -Name $ContactName -Alias $ContactAlias -ExternalEmailAddress $ContactSmtp -PrimarySmtpAddress $ContactSmtp -OrganizationalUnit $TargetOu Set-MailContact $ContactAlias -HiddenFromAddressListsEnabled $true $Contact = Get-ADObject -Filter { MailNickname -eq $ContactAlias } Set-ADObject $Contact -Replace @{TargetAddress=$_.PrimarySmtpAddress} Set-ADObject $Contact -Replace @{info=$_.DisplayName} } # --- Replace Objects in Distribution Groups Write-Host "Replacing group membership with contacts..." -ForegroundColor Yellow Import-Csv $MailFolderMembers | ForEach { Write-Host $_.FolderName $GroupEmail = $_.GroupEmail $FolderEmail = $_.FolderEmail $ContactAlias = $_.FolderAlias + "-PFContact" $GroupDN = "LDAP://" + (Get-ADObject -LDAPFilter "(mail=$GroupEmail)").DistinguishedName $FolderDN = "LDAP://" + (Get-ADObject -LDAPFilter "(mail=$FolderEmail)").DistinguishedName $ContactDN = "LDAP://" + (Get-ADObject -LDAPFilter "(mailNickname=$ContactAlias)").DistinguishedName $Group = [ADSI]$GroupDN $Folder = [ADSI]$FolderDN $Contact = [ADSI]$ContactDN $Group.Add($Contact.ADsPath) $Group.Remove($Folder.ADsPath) } # --- Script complete Write-Host "Complete!" -ForegroundColor Green