Function Extract-Rid([byte[]] $sid) { $sid_length = $sid.Count $sid[$sid_length - 4] + 256 * $sid[$sid_length - 3] + 65536 * $sid[$sid_length - 2] + 16777216 * [uint32]$sid[$sid_length - 1] } Function Is-SystemUserSid([byte[]] $sid) { if (($sid.Count -eq 28) -and ($sid[0] -eq 1) -and ($sid[1] -eq 5) -and ($sid[7] -eq 5) -and ($sid[8] -eq 21)) { $rid = Extract-Rid($sid) ($rid -lt 1000) } else { $FALSE } } Function Is-SystemGroupSid([byte[]] $sid) { ($sid.Count -eq 16) -and ($sid[0] -eq 1) -and ($sid[1] -eq 2) -and ($sid[7] -eq 5) -and ($sid[8] -eq 32) } $users_and_groups = Import-Csv -Path "users_and_groups.txt" -Delimiter "`t" -Encoding UTF8 $users = $users_and_groups | Where-Object { $_.Type -eq "user" } | foreach { $result = @{} } { $result[$_.RID.ToString()] = $_ } { $result } $groups = $users_and_groups | Where-Object { $_.Type -eq "group" } | foreach { $result = @{} } { $result[$_.RID.ToString()] = $_ } { $result } $computer = [ADSI] "WinNT://." $computer.Children.SchemaFilter.Clear() $computer.Children.SchemaFilter.AddRange(@("user", "group")) $computer.Children | foreach { $sid = $_.objectSid[0]; $rid = (Extract-Rid($sid)).toString() if (Is-SystemUserSid($sid) -and $users.Contains($rid)) { $user = $users[$rid]; Write-Host ("Updating user `"" + $_.Name.Value + "`" with new name `"" + $user.Name + "`" and description.") $_.Rename($user.Name) $_.Description = $user.Description $_.CommitChanges() } elseif (Is-SystemGroupSid($sid) -and $groups.Contains($rid)) { $group = $groups[$rid]; Write-Host ("Updating group `"" + $_.Name.Value + "`" with new name `"" + $group.Name + "`" and description.") $_.Rename($group.Name) $_.Description = $group.Description $_.CommitChanges() } }