вторник, 30 октября 2012 г.

PowerShell script: Исправление членства в группах, на основе совпадения свойств учётных записей

Привет всем.
Решил выложить 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

}
}
}
}

Надеюсь кому нибудь пригодится в работе или пригодятся идеи, заложенные в этом скрипте.
 

Комментариев нет:

Отправить комментарий

Уважаемый коллега, Ваш комментарий пройдёт модерацию, чтобы избежать спам-атак в ленте. Спасибо за понимание.