Powershell – автоматизируем построение организационной структуры в Active Directory. Часть 2.


 

Как-то я публиковал статью  Powershell – автоматизируем построение организационной структуры в Active Directory. Очень удобно, когда можно для  любого пользователя видеть его руководителя и подчиненных. Видеть это можно в Outlook, Sharepoint и Lync. А еще можно использовать визард в Visio, с помощью которого автоматически построить графическое отображение организационной структуры, и опубликовать его на сайте Sharepoint!

Недавно столкнулся с более сложной ситуацией: несколько филиалов и несколько доменов, GAL синхронизируется с помощью FIM (т.е. кроме учетных записей пользователей надо обрабатывать контакты), организационная структура включает в себя филиалы, имена которых внесены в атрибут Company учетных записей, сотрудники одного филиала могут подчиняться руководителю другого филиала.

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

 

#
#   Заполнение полей Manager для учетных записей сотрудников
#   Непосредственный начальник определяется по имени филиал+подразделение и списку должностей начальников
#

$SearchBase = "OU=GALContacts,DC=domain,DC=ru"

$adusers = Get-ADObject -LDAPFilter "(&(&(&(objectCategory=user)(objectClass=user)(department=*)(!userAccountControl:1.2.840.113556.1.4.803:=2)) ))" `
                -Properties department,manager,title,Company

#
# Кроме пользователей нам нужны контакты GAL
#
$adcontacts = Get-ADObject -LDAPFilter "(&(&(&(objectCategory=contact)(objectClass=contact)(department=*)) ))" `
                -Properties department,manager,title,Company -SearchBase $SearchBase

$adusers += $adcontacts

$bossTitleList = @("Нач. цеха","Глав.бух.","Начальник отдела", "Начальник службы", "Начальник центра")

#
#   Для каждого подразделения составляем список его сотрудников
#
$deps = @{}
$adusers | % { $deps[$_.Company + $_.Department] += @($_) }

#
#   Для каждого подразделения находим его начальника
#
$depboss = @{}
foreach ( $dep in $deps.keys ) {

   $deps[$dep] | ? {$bossTitleList -contains $_.title} | % {$depboss[$dep] = $_ }

}

#
#   Для каждого начальника берем его подразделение и каждому сотруднику заполняем поле Manager
#
foreach ( $dep in $depboss.keys ) {

   $boss = $depboss[$dep]
   $deps[$dep] | ? {$_ -ne $boss} | ? {$_.manager -ne $boss.DistinguishedName} | % { Set-ADObject -Identity $_ -Replace @{manager=$boss.DistinguishedName} }

}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, «Courier New», courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

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