If you ever migrated SharePoint users you should be familiar either with the Move-SPUser cmdlet or its predecessor, the migrateuser stsadm operation:
$sourceURL = "http://mysites.company.com"
$web = Get-SPWeb $sourceURL
$user = $web.SiteUsers["domain\jdoe"]
Move-SPUser -Identity $user -NewAlias "newDomain\john.doe" –IgnoreSID
or
stsadm -o migrateuser –oldlogin "domain\jdoe" -newlogin "newDomain\john.doe" -ignoresidhistory
As you see, both method relies on the SID (or on its ignorance), but what is this SID and how can we read its value for our SharePoint or Active Directory users?
Each user in the Active Directory (AD) has a security identifier (SID) that is a unique, immutable identifier, allowing the user to be renamed without affecting its other properties.
Reading the SID of a SharePoint user from PowerShell is so simple as:
$web = Get-SPWeb http://YourSharePoint.com
$user = $web.AllUsers["domain\LoginName"]
$user.Sid
To be able to work with Active Directory from PowerShell, you need of course the Active Directory cmdlets. If your machine has no role in AD, you should install this PowerShell module using the steps described in this post.
Once you have this module installed, and you imported it via “Import-Module ActiveDirectory”, you can read the SID of a user in AD:
$user = Get-ADUser UserLoginNameWithoutDomain -Server YourDomainController.company.com
$user.SID.Value
Where UserLoginNameWithoutDomain is the login name of the user without the domain name, like jdoe in case of domain\jdoe, and YourDomainController.company.com is your DC responsible for the domain of your user.
If you need the SID history from AD as well, it’s a bit complicated. In this case I suggest you to read this writing as well.
$ADQuery = Get-ADObject –Server YourDomainController.company.com`
-LDAPFilter "(samAccountName=UserLoginNameWithoutDomain )" `
-Property objectClass, samAccountName, DisplayName, `
objectSid, sIDHistory, distinguishedname, description, whenCreated |
Select-Object * -ExpandProperty sIDHistory
$ADQuery | % {
Write-Host $_.samAccountName
Write-Host Domain $_.AccountDomainSid.Value
Write-Host SID History
$_.sIDHistory | % {
$_.Value
}
Write-Host ——————–
}