When preparing for a migration of AD objects from one forest to another it is useful to know if any of the names are going to conflict. There are, as you probably know, a number of different naming attributes in AD, but the one most likely to cause problems in the event of a conflict is sAMAccountName. This is because sAMAccountName is used for domain logon (assuming UPN is not used). If you know which names conflict between source and target you can plan changes before you get into the migration itself.
I’ve written a couple of small scripts to detect sAMAccountName conflicts. I’ve used two scripts instead of one as there is not always trust connectivity between the two forests. The first script (SourceUsersToCSV) is run in the source domain and basically just dumps all the user sAMaccountName attribute values to a file. The second script (DupeCheckFromCSV) is run in the target domains and reads the exported file information line-by-line and checks to see if there are any conflicts in the target domain. If a conflict is found the sAMAccountName is written to a file.
Enjoy!
######################################################### # # Name: SourceUsersToCSV.ps1 # Author: Tony Murray # Version: 1.0 # Date: 14/07/2011 # Comment: PowerShell script to export AD user info # to CSV to support search for duplicate users # # ######################################################### ### --- Varible Definitions --- $DOMAIN = "source.com" $EXPFILE = "C:\util\CSV\domain_export.csv" $sourceOU = "OU=MyUsers,DC=source,DC=com" $filter = "(&(objectClass=user)(!iscriticalsystemobject=TRUE))" ### --- Main --- # Export Source AD User info to file if(@(get-module ` | where-object {$_.Name -eq "ActiveDirectory"} ).count -eq 0) {import-module ActiveDirectory} $objSourceDC = Get-ADDomainController -Discover -DomainName $DOMAIN $sourceDC = [string]$objSourceDC.HostName $UserInfo = '' | Select 'UsrsAMAccountName' $AllUsers = @() $MyUsers = Get-ADUser -LDAPFilter $filter -Server $sourceDC -SearchBase $sourceOU foreach($User in $MyUsers) { $UserInfo.'UsrsAMAccountName' = $User.sAMAccountname $AllUsers += $UserInfo | Select 'UsrsAMAccountName' } $AllUsers | Export-Csv $EXPFILE -NoTypeInformation
######################################################### # # Name: DupeCheckfromCSV.ps1 # Author: Tony Murray # Version: 1.0 # Date: 14/07/2011 # Comment: PowerShell script to import AD User info # from CSV to check for duplicates # ######################################################### ### Set Global variables $domain = "target.com" $impfile = "C:\util\CSV\Domain_Export.csv" $EXPFILE = "C:\util\CSV\Duplicate_Users.csv" $dc = Get-ADDomainController -Discover -DomainName $domain $targetdc = [string]$dc.HostName $arrSrcSAMs=@() $arrTarSAMs = @() $arrDupeUsers = @() ### Load the CSV file and extract the source domain unique User names $colsrcUsers = import-csv $impfile #| select UsrSAMAccountName foreach ($srcUser in $colsrcUsers) { $srcSAM = $srcUser.UsrSAMAccountName $arrsrcSAMs += $srcSAM } # Check for empty file if ($colsrcUsers.Count -eq 0) { write-host "No Users found in CSV import file!" break } ### Enumerate Users in the local (target) domain $coltarUsers = Get-ADUser -Filter '*' -Server $targetDC -Properties samaccountname foreach ($tarUser in $coltarUsers) { $tarSAM = [string]$tarUser.samaccountname $arrTarSAMs += $tarSAM } ### Find Users to Add or Modify foreach ($tarUser in $arrTarSAMs) { if ($arrSrcSAMs -contains $tarUser) { write-host "Duplicate User found for " $tarUser $arrDupeUsers += $tarUser } else { write-host "No Duplicate found for " $tarUser } } ### Add new Users to target and apply the membership $arrDupeUsers | out-file $EXPFILE
Your solution is probably more elegant than mine, but, I solve this type of problem with Excel and Adfind. Use adfind to dump the relevant data to two CSVs, import to Excel, vlookup to find the matching users in the two sheets, and then filter to matches.
How hard to add a third (and 4th) forest to this script?
Also want to say it runs great as is… still curious as to how I can add more than 2 forests so it compares dupes in all…
Hi,
This is a nice script. thanks for sharing..
I have a question. How can I add other attributes in the CSV exports “domain_export.csv & Duplicate_Users.csv”.
like; DistinguishedName,Name,GivenName,Surname (separated by column)
This would be very helpful..