I needed to move a list of users from our on-premises Skype for Business 2015 servers to Skype Online.
I know how to do this one user at a time.
$cred = Get-Credential username@tenanant.com Move-CsUser -Identity UPN -Credential $cred -Target sipfed.online.lync.com -Confirm:$falseThats nice and all, but I had a list of 15 users.
I came across this post from Brett Janzen:
He deserves a shit load of traffic to his site for this strike of genius :-)
He created a script to move users from on-premises to Online, to check if they are enabled if the move went well or not and notify you of this by email.
His version can be found here, I made some adjustments because my environment reacted a bit differently.
# Edit this script at lines: 4, 13, (possibly at 17), 23, 32, 46, 51 and 58 to 61 #This 1 liner creates the hash file that we will need in the next script. Needs to be run only the first time, or if password changes Read-Host -Prompt "Enter your tenant password" -AsSecureString | ConvertFrom-SecureString | Out-File "cred.txt" #------------------------- #Script starts here: #------------------------- #Time Stamp used for file naming $DTStamp = get-date -f "dd-MM-yyyy HH-mm" #This uses a hash value of the password for the service user. This will allow us to run the script with out being asked $AdminName = "username@tenant.onmicrosoft.com" $Pass = Get-Content "cred.txt" | ConvertTo-SecureString $credential= new-object -typename System.Management.Automation.PSCredential -argumentlist $AdminName, $Pass #Initialize session $session = New-CsOnlineSession -Credential $credential #-OverrideAdminDomain "domain.com" Import-PSSession $session -AllowClobber Set-ExecutionPolicy Unrestricted -force #The Beginning of the inspection of users that will be moved #Does the userlist file exist? If ((test-path "userlist.txt") -eq $False) { Send-MailMessage -from "Skype@domain.com" -to "admin@domain.com"-subject "Skype Migrations: No File" -body "Looks like we dont have a file to work with" -smtpServer smtp.domain.com }else{ #check to see if the users are enabled. This will output new file for working with. ForEach ($UserToBeMigrated in (Get-Content userlist.txt)) { get-csuser $UserToBeMigrated | Where-object {$_.Enabled -eq $False} | Select-object -expandProperty sipaddress | Out-File NotEnabledUsers.txt -append get-csuser $UserToBeMigrated | Where-object {$_.Enabled -eq $True} | Select-object -expandProperty sipaddress | Out-File EnabledUsers.txt -append } #Start of moving users to the cloud with enabledusers.txt ForEach ($UserToBeMigrated in (Get-Content EnabledUsers.txt)) { Move-CsUser $UserToBeMigrated -Target sipfed.online.lync.com -Credential $credential -Confirm:$False #-verbose #-HostedMigrationOverrideUrl "https://youradmindomainname.online.lync.com/HostedMigration/hostedmigrationservice.svc" -ProxyPool "proxypool.domain.com" } # Lets give it a pause for any replication delays Start-Sleep 60 #Lets verify the users where migrated ForEach ($UserToBeMigrated in (Get-Content EnabledUsers.txt)) { Get-CsUser $UserToBeMigrated | where-object {$_.hostingprovider -ne "sipfed.online.lync.com"} |Select-object -ExpandProperty Sipaddress | out-file LeftOvers.txt -Append } #If there were users that didnt move it will show up in the left overs file If ((Get-Content "LeftOvers.txt") -eq $Null) { ForEach ($UserToBeMigrated in (Get-Content EnabledUsers.txt)) { get-csuser $UserToBeMigrated | select-object SipAddress, HostingProvider | Out-file completedList.txt -append } #If it passes lets send an email to the admin with some txt files to look through if he or she wants to Send-MailMessage -from "Skype@domain.com" -to "admin@domain.com" -subject "Move Complete" -body "Passed on first try. Logs attached" -Attachment "CompletedList.txt","NotEnabledUsers.txt" -smtpServer smtp.domain.com #Cleanup! rename-item -path completedList.txt -newName "CompletedList- $DTStamp.txt" } else { #If there is failure email and let the admin know Send-MailMessage -from "Skype@domain.com" -to "admin@domain.com" -subject "Move Had Errors" -body "Looks like there was a failure. Logs attached" -attachment "LeftOvers.txt" -smtpServer smtp-lb.domain.com #Here we could add another try to see if we can move the users again. This is a work in progress } } #Close them sessions get-pssession | remove-pssession #Clean Up rename-item -path "D:\Scripts\Move-CSUser to Skype Online\leftovers.txt" -newName "_LeftOvers- $DTStamp.txt" rename-item -path "D:\Scripts\Move-CSUser to Skype Online\userlist.txt" -newName "_UserList- $DTStamp.txt" rename-item -path "D:\Scripts\Move-CSUser to Skype Online\NotEnabledUsers.txt" -newName "_NotEnabledUsers- $DTStamp.txt" rename-item -path "D:\Scripts\Move-CSUser to Skype Online\EnabledUsers.txt" -newName "_EnabledUsers- $DTStamp.txt"