Привет всем.
Решил выложить Powershell скрипт, который я использовал для исправления членства пользователей в группах, после миграции, когда нет возможности использовать утилиты Quest или им подобные.
Наименование учётных записей в обоих службах каталогов должно совпадать. В принципе, думаю возможно осуществить привязку по какому либо свойству учётной записи, к примеру: SamAccountName. Групп в Active Directory с именами, как в исходной службе каталогов не существует .
Идея заключалась в следующем:
Ну и собственно сам скрипт:
# This script allows to find previously migrated (as example: from NDS with help of MSDSS) users account and groups,
# then to define corresponding ADDS users account and add them to the correct previously migrated from NDS groups, and replace migrated accounts to ADDS users accounts.
#which are currently are used by users.
import-module ActiveDirectory
set-executionpolicy remotesigned
#Define functions
function WriteToLog($TextOut)
{
#Defining Variables
$Null = 0 #This variable is used to check the array $GroupsArray for NULL value;
$GroupsArray = $Null
#Defining Array for List of Groups in container
$GroupsArray = Get-ADGroup -Filter {GroupCategory -eq 'security'} -SearchBase 'OU=GROUPS,DC=ABC,DC=COM' #Getting list of ADDS Groups from current OU;
if ($GroupsArray -eq $Null ) #Checking $GroupsArray for NULL value;
{
Write-host "Groups not found. Run migration process or define correct container"
$TextOut = "Groups not found. Run migration process or define correct container"
WriteToLog $TextOut
Exit
} else{#Getting a list of users for each group
Foreach ($group in $GroupsArray)
{$GrpName = Get-AdGroup -Identity $group #Getting CN of ADDS Groups;
$TextOut= "Following group discovered: " + $GrpName
WriteToLog $TextOut
$a = Get-ADGroupMember -Identity $GrpName #Getting a list of ADDS Groups members;
$TextOut= "Following members discovered: " + $a
WriteToLog $TextOut
Foreach ($user in $a)
{
$ADUserNameOriginal = (Get-AdUser -Identity $user -Properties Name).Name
$ADUserNameOriginal = $ADUserNameOriginal -Replace "001", ""
$ADUserNameTarget = (Get-AdUser -Identity $user -Properties Name).Name -eq $ADUserNameOriginal
if ($ADUserNameTarget = $ADUserNameOriginal){
$TextOut = "Account " + $ADUserNameTarget + " is already presents in the group"
WriteToLog $TextOut }
else
{
#For each user in sAMAccountName property cutting the numeric ending;
$ADUserNameOriginal = (Get-AdUser -Identity $user -Properties Name).Name
$ADUserNameOriginal = $ADUserNameOriginal -Replace "001", ""
#Finding similar SamAccountName in ADDS, setting up it into varible & adding to the ADDS Group
$FoundedUser = Get-AdUser -filter {SamAccountName -like
$ADUserNameOriginal}
$TextOut = "Account " + $c + " was successfully added to the group " + $GrpName
WriteToLog $TextOut
Add-ADGroupMember $GrpName $c #Adding member to a group
}
}
Надеюсь кому нибудь пригодится в работе или пригодятся идеи, заложенные в этом скрипте.
Решил выложить Powershell скрипт, который я использовал для исправления членства пользователей в группах, после миграции, когда нет возможности использовать утилиты Quest или им подобные.
Наименование учётных записей в обоих службах каталогов должно совпадать. В принципе, думаю возможно осуществить привязку по какому либо свойству учётной записи, к примеру: SamAccountName. Групп в Active Directory с именами, как в исходной службе каталогов не существует .
Идея заключалась в следующем:
- Пользовательские учётные записи и группы, в которые пользователи входят, мигрируются в Active Directory из сторонней службы каталогов с текущей схемой наименования; К пользовательских учётным записям, чтобы избежать конфликтов, добавляется числовой идентификатор "001" - учётные записи должны совпадать;
- Скрипт получает список мигрированных групп, находящихся в определённом контейнере Active Directory, затем для каждой группы получает список пользователей;
- Далее для каждого пользователя в группе с числовым идентификатором "001" находиться аналог (существующая учётная запись Active Directory) с помощью метода -like в службе каталогов и добавляет его в группу.
- Скрипт ведёт лог происходящего.
Ну и собственно сам скрипт:
# This script allows to find previously migrated (as example: from NDS with help of MSDSS) users account and groups,
# then to define corresponding ADDS users account and add them to the correct previously migrated from NDS groups, and replace migrated accounts to ADDS users accounts.
#which are currently are used by users.
import-module ActiveDirectory
set-executionpolicy remotesigned
#Define functions
function WriteToLog($TextOut)
{
#This function creates and writes log file to the root partition of the "C Drive"
Write-host $TextOut
$CurrDateTime = Get-date -format 'u'
$CurrDateTime + " " + $TextOut | Out-file c:\ScriptLog.log -append
}#Defining Variables
$Null = 0 #This variable is used to check the array $GroupsArray for NULL value;
$GroupsArray = $Null
#Defining Array for List of Groups in container
$GroupsArray = Get-ADGroup -Filter {GroupCategory -eq 'security'} -SearchBase 'OU=GROUPS,DC=ABC,DC=COM' #Getting list of ADDS Groups from current OU;
if ($GroupsArray -eq $Null ) #Checking $GroupsArray for NULL value;
{
Write-host "Groups not found. Run migration process or define correct container"
$TextOut = "Groups not found. Run migration process or define correct container"
WriteToLog $TextOut
Exit
} else{#Getting a list of users for each group
Foreach ($group in $GroupsArray)
{$GrpName = Get-AdGroup -Identity $group #Getting CN of ADDS Groups;
$TextOut= "Following group discovered: " + $GrpName
WriteToLog $TextOut
$a = Get-ADGroupMember -Identity $GrpName #Getting a list of ADDS Groups members;
$TextOut= "Following members discovered: " + $a
WriteToLog $TextOut
Foreach ($user in $a)
{
$ADUserNameOriginal = (Get-AdUser -Identity $user -Properties Name).Name
$ADUserNameOriginal = $ADUserNameOriginal -Replace "001", ""
$ADUserNameTarget = (Get-AdUser -Identity $user -Properties Name).Name -eq $ADUserNameOriginal
if ($ADUserNameTarget = $ADUserNameOriginal){
$TextOut = "Account " + $ADUserNameTarget + " is already presents in the group"
WriteToLog $TextOut }
else
{
#For each user in sAMAccountName property cutting the numeric ending;
$ADUserNameOriginal = (Get-AdUser -Identity $user -Properties Name).Name
$ADUserNameOriginal = $ADUserNameOriginal -Replace "001", ""
#Finding similar SamAccountName in ADDS, setting up it into varible & adding to the ADDS Group
$FoundedUser = Get-AdUser -filter {SamAccountName -like
$ADUserNameOriginal}
$TextOut = "Account " + $c + " was successfully added to the group " + $GrpName
WriteToLog $TextOut
Add-ADGroupMember $GrpName $c #Adding member to a group
}
}}
}
Надеюсь кому нибудь пригодится в работе или пригодятся идеи, заложенные в этом скрипте.