I’m working on a migration project where I need to create temporary accounts for each user that I’m going to be migrating (long story, don’t ask!). I wanted a way to create the temporary account based on the real user name, have them easily identifiable as belonging to that user, and then make sure to not use the primary domain for their email address, just to make sure there was no confusion.
Based on these requirements, I started working on a script to provision these user accounts – I wanted to take a user’s name and UPN from a CSV file, and then produce the temporary migration account from there.
For example, my csv file looked like this:
Name | samAccountName | UPN | LicenseType | UsageLocation |
YVR E1 Test | yvrE1test | yvrE1test@masterandcmdr.com | E1 | CA |
Just so you can follow along, I’ve imported the CSV file into my Shell so we can work with it:
Now that I have my variable defined, I needed to get just the beginning of the UPN, so I could create a new user. I know what you’re thinking – why not just use the samAccountName, since it matches? Well, I wanted to make sure I wouldn’t end up with discrepancies if I ran this against a larger batch of users, and had some where those values didn’t match – I figured the safest bet would be take the UPN value that I’d be using later (for the real user account), and build off of that.
So, I started out by using the .TrimEnd method to remove the domain name from the end of the UPN, like so:
$migUser = $($u.upn).TrimEnd(“@masterandcmdr.com”)
And after that, add a prefix, and the onmicrosoft domain to create a new UPN:
$migUPN = “mc-$migUser“+“@masterandcmdr.onmicrosoft.com”
And finally, I wanted the Display Name to make it obvious that this was my temporary migration account:
$migDisplay = “$($u.Name) (MC)”
What happened next was really weird – .TrimEnd was taking away more characters than I had expected, like so:
So the end result was that my user would be created, but the results were inconsistent – very frustrating!
Doing some digging around on the internet I discovered that TrimEnd treats the characters that you specify as a character array, and not a string like I was expecting it to. Since all of the letters for “test” are found in “masterandcmdr.com”, it was trimming away every character that it found at the end of the string that matched ANY of those characters. As soon as it hits a character that doesn’t match the array of characters you’ve provided, it stops trimming, which is why it doesn’t take away the remaining “rE” from my username.
To solve this problem, and to make sure that you are removing a specific string of text from the end of a word, use the -replace function instead, like so:
# Define migration user account format
$migUser = $($u.upn) -replace ‘@masterandcmdr.com’,”
$migUPN = “mc-$migUser“+“@masterandcmdr.onmicrosoft.com”
$migDisplay = “$($u.Name) (MC)”
As you can see, this time my results were exactly as expected:
So, lessons learned – make sure if you need to remove a specific string of characters from the end of a string in PowerShell, use -replace and not .TrimEnd!