Public/Update-SPAduserUPNFederatedInformation.ps1
Function Update-SPAduserUPNFederatedInformation { # .ExternalHelp .\Update-SPAduserUPNFederatedInformation.xml [cmdletbinding(SupportsShouldProcess)] param( [parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,Mandatory=$true,ParameterSetName="ByUsername")] [string[]]$UserName, [parameter(ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true,Mandatory=$true,ParameterSetName="BySearchBase")] [string]$SearchBase, [parameter(ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true,Mandatory=$true)] [string]$ADLocalDomain, [parameter(ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true,Mandatory=$true)] [string]$AzureADSyncServerFQDN, [parameter(ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true,Mandatory=$true)] [string]$FederatedDomain, [parameter(ValueFromPipeline=$false,ValueFromPipelineByPropertyName=$true,Mandatory=$true)] [ValidateScript( {Test-Path $_ -PathType Container})] [string]$LogFilePath ) BEGIN{ Function Get-UPNAzureADSyncStatus { param( [object]$SyncJobStatus ) $Script:ADSyncStauts = $null if($SyncJobStatus -eq "Success"){ $SyncInProgress = $true do{ $SyncInProgress = Invoke-Command -ComputerName $AzureADSyncServerFQDN -ScriptBlock {Get-ADSyncScheduler | select-object -ExpandProperty SyncCycleInProgress} -ErrorAction Stop if($SyncInProgress -eq $true){ Start-Sleep -Seconds 10 }#end_SubIF }While($SyncInProgress -eq $true) $Script:ADSyncStauts = "Complete" return }#END_IF }#END_ScriptFunction Function Start-UpnUpdateAzureADSync{ param( [String]$ServerName ) filter Out-Default { $_ | Out-Null } $JobStatus = "Success" $AzureADjobRunStatus = "Running" while($AzureADjobRunStatus -eq "Running"){ Get-UPNAzureADSyncStatus -SyncJobStatus $JobStatus if($($Script:ADSyncStauts) -eq "Complete"){ $ADSyncStart = Invoke-Command -ComputerName $ServerName -ScriptBlock {Start-ADSyncSyncCycle -PolicyType Delta} -ErrorAction Stop Return $ADSyncStart.Result }#END_IF }#While }#END_ScriptFunction }#BEGIN PROCESS{ Try{ if($UserName){ if($PSCmdlet.ShouldProcess($Username)){ $DomainUPN = $false $FederatedUPN = $false while($DomainUPN -eq $false){ foreach ($AdUser in $UserName){ Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Updating: UPN to $($ADLocalDomain) for user $($AdUser)" Set-AdUserUPNInformation -UserName $AdUser -Domain $ADLocalDomain -Verbose -ErrorAction Stop }#END_Foreach Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Invoking: Active directory replication $($AzureADSyncServerFQDN)" Start-AdDCSync -logFilePath $LogFilePath -Verbose:$false Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Invoking: AzureAD DeltaSync on server $($AzureADSyncServerFQDN)" $AzureJobStatus = Start-UpnUpdateAzureADSync -ServerName $AzureADSyncServerFQDN Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Enumerating: AzureAD DeltaSync Job Status on server $($AzureADSyncServerFQDN)" Get-UPNAzureADSyncStatus -SyncJobStatus $AzureJobStatus Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Updating: AzureAD Sync Complete" $DomainUPN = $true }#END_While while($FederatedUPN -eq $false){ foreach ($AdUser in $UserName){ Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Updating: User UPN to $($FederatedDomain) for user $($UserName)" Set-AdUserUPNInformation -UserName $AdUser -Domain $FederatedDomain -Verbose -ErrorAction Stop }#foreaech Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Invoking: Active directory replication $($AzureADSyncServerFQDN)" Start-AdDCSync -logFilePath $LogFilePath -Verbose:$false Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Invoking: AzureAD DeltaSync on server $($AzureADSyncServerFQDN)" $AzureJobStatus = Start-UpnUpdateAzureADSync -ServerName $AzureADSyncServerFQDN Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Enumerating: AzureAD DeltaSync Job Status on server $($AzureADSyncServerFQDN)" Get-UPNAzureADSyncStatus -SyncJobStatus $AzureJobStatus Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Updating: AzureAD Sync Complete" Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Complete: User UPN updated successfully" $FederatedUPN = $true }#END_While }#END_IF }#END_IF elseif($SearchBase){ if($PSCmdlet.ShouldProcess($SearchBase)){ Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Updating: user UPN to $($ADLocalDomain) in OU $($SearchBase)" Set-AdUserUPNInformation -SearchBase $SearchBase -Domain $ADLocalDomain -Verbose -ErrorAction Stop Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Invoking: Active directory replication $($AzureADSyncServerFQDN)" Start-AdDCSync -logFilePath $LogFilePath -Verbose:$false | Out-Null Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Invoking: AzureAD DeltaSync on server $($AzureADSyncServerFQDN)" $AzureJobStatus = Start-UpnUpdateAzureADSync -ServerName $AzureADSyncServerFQDN Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Enumerating: AzureAD DeltaSync Job Status on server $($AzureADSyncServerFQDN)" Get-UPNAzureADSyncStatus -SyncJobStatus $AzureJobStatus Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Updating: AzureAD Sync Complete" Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Updating: User UPN to $($FederatedDomain) in OU $($SearchBase)" Set-AdUserUPNInformation -SearchBase $SearchBase -Domain $FederatedDomain -Verbose -ErrorAction Stop Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Invoking: Active directory replication $($AzureADSyncServerFQDN)" Start-AdDCSync -logFilePath $LogFilePath -Verbose:$false | Out-Null Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Invoking: AzureAD DeltaSync on server $($AzureADSyncServerFQDN)" $AzureJobStatus = Start-UpnUpdateAzureADSync -ServerName $AzureADSyncServerFQDN Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Enumerating: AzureAD DeltaSync Job Status on server $($AzureADSyncServerFQDN)" Get-UPNAzureADSyncStatus -SyncJobStatus $AzureJobStatus Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Updating: AzureAD Sync Complete" Get-ADUser -Filter * -SearchBase $($SearchBase) | Select-Object Name, UserPrincipalName Write-Verbose "[$((get-date).TimeOfDay.ToString()) PROCESS ] Complete: User UPN in OU $($SearchBase) updated successfully" }#END_IF }#EndElseIF }#Try Catch{ $ErrorMessage = $_.Exception.Message $ErrorMessage }#Catch }#PROCESS END{ }#END }#Function # SIG # Begin signature block # MIIIaAYJKoZIhvcNAQcCoIIIWTCCCFUCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUS6no0zX5YuzMHPP94tAJJb1v # k++gggXMMIIFyDCCBLCgAwIBAgITHwAAAAKXhlLnQ34QXwAAAAAAAjANBgkqhkiG # 9w0BAQsFADBOMRIwEAYKCZImiZPyLGQBGRYCYXUxEzARBgoJkiaJk/IsZAEZFgNv # cmcxFDASBgoJkiaJk/IsZAEZFgRBQklPMQ0wCwYDVQQDEwRDQ1JUMB4XDTE4MDcy # MDAzNDczMFoXDTIwMDcyMDAzNTczMFowZzESMBAGCgmSJomT8ixkARkWAmF1MRMw # EQYKCZImiZPyLGQBGRYDb3JnMRQwEgYKCZImiZPyLGQBGRYEQUJJTzEOMAwGA1UE # AxMFVXNlcnMxFjAUBgNVBAMTDUFkbWluaXN0cmF0b3IwggEiMA0GCSqGSIb3DQEB # AQUAA4IBDwAwggEKAoIBAQCNq7s560Wz2Q/s2pZ3sN2r1u0ldKPpGlhhJnzdJMra # kHKybnUbRB76TY5VBN6t3FDrBMN7qV31gWKn5GHveppDS6gZHVJGQNEcAREpaGgy # tewEkpmyY7toNSdXn7ydvlqql1AGGu2kGNFA5jEaOqHfm4Nw+Mt0EBfkXXKjSWB5 # 6+0a44feZiAfaGnNUbDq/5P8zgPvnNnrOuKRuagjPy3AehDElk19fDK9ZKOMzu4S # 11QbPS8Pppc9hOi956d/HysPdKfaCC7UFBlrMagRAOi7M4MDS3JB4heZ5iBcEIBZ # l7QY6m2NH103YDZ1xUl2cobo196XCiUObCIpZQzbliYPAgMBAAGjggKEMIICgDA9 # BgkrBgEEAYI3FQcEMDAuBiYrBgEEAYI3FQiD9+NKhIacS4eBnT+Gz8FFhKz9TEeB # vf4ZhaODBgIBZAIBBTATBgNVHSUEDDAKBggrBgEFBQcDAzAOBgNVHQ8BAf8EBAMC # B4AwGwYJKwYBBAGCNxUKBA4wDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU162YALpI # MdSWjsWIwbV0i4A8gk0wHwYDVR0jBBgwFoAUKVmuscbhxWcRNj/GnF+rJD3Fdwcw # gcoGA1UdHwSBwjCBvzCBvKCBuaCBtoaBs2xkYXA6Ly8vQ049Q0NSVCxDTj1GT1NB # VU1FTERDMDEsQ049Q0RQLENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNl # cnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9QUJJTyxEQz1vcmcsREM9YXU/Y2Vy # dGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERpc3Ry # aWJ1dGlvblBvaW50MIG5BggrBgEFBQcBAQSBrDCBqTCBpgYIKwYBBQUHMAKGgZls # ZGFwOi8vL0NOPUNDUlQsQ049QUlBLENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2Vz # LENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9QUJJTyxEQz1vcmcsREM9 # YXU/Y0FDZXJ0aWZpY2F0ZT9iYXNlP29iamVjdENsYXNzPWNlcnRpZmljYXRpb25B # dXRob3JpdHkwNAYDVR0RBC0wK6ApBgorBgEEAYI3FAIDoBsMGUFkbWluaXN0cmF0 # b3JAQUJJTy5vcmcuYXUwDQYJKoZIhvcNAQELBQADggEBAFh89pk6ZQf/o99v1yip # YpDd1FO3R8aRJIOCVAIrkcY/lWngUPzCftxU3qRMwltFLn7qHIApi1U3H7MAvvBG # GLvEkJUVI1tXg9NqowwLSggPhtzRH/T/G404UL3c3wRFOqm3ctj66FfqIY2JJRds # UeX6divBXz6SRYfMko+Yedu7xoab/Uz7FHgQ37NZb6Jn+iqanrty88stDSnSy0Zv # EvnZkUx1BY3ObVUPht4U/SWYS/O2QoK7AOO2SJMOBHIFDB+nlrB4bKwfAe50bGfG # x4cGstq3EpBRpHh79A3mFhvjOYrCHMkuo+TKeBD8lKbzatq26rhKYnlskWPH8092 # tu0xggIGMIICAgIBATBlME4xEjAQBgoJkiaJk/IsZAEZFgJhdTETMBEGCgmSJomT # 8ixkARkWA29yZzEUMBIGCgmSJomT8ixkARkWBEFCSU8xDTALBgNVBAMTBENDUlQC # Ex8AAAACl4ZS50N+EF8AAAAAAAIwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwx # CjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGC # NwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFB54dYskMy4AeGIB # 8G46uzlZP8cOMA0GCSqGSIb3DQEBAQUABIIBAASuCl9lOHm34kfIZfxyAuujlaYR # BOGgOH63QaIN/a0gwsQLz+2H7HqtQql5bG1fB8ScymoYVmcrFv0R68oI8TBnIp4k # 2GIzHupN0aXD5HgspLI5H1w42liYZ41H16U7NNCAEkW9r5wVxvOs7gcakUW918yM # MPHpY4nYHJVbGlSQgmBvkUQH3ZVRy3fmQm6Y9Z6ZJ0KeC4VclgtEdllSr2EqMkUx # AqWOid/93RSWt3qLJcq6LA4o2GEYhBHZy7cj15YcIrg97NCKxZTmkuDOLD8pBymK # cqnWVTc0OYQgcSAkrRMLMXECZ9pE7QSAAcPJpNRY5U0LFbZc6X01POL9OnE= # SIG # End signature block |