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


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

Active Directory может нам облегчить жизнь: в ней можно хранить сведения об организационной структуре и подчиненности сотрудников. Подчиненность отражается в учетных записях с помощью атрибута Manager (Руководитель). Также полезно указывать значения атрибутов Title (Должность) и Department (Подразделение).

Если открыть карточку контакта в Outlook или Lync, когда все эти поля заполнены, то на закладке «Организация» отображаются сведения о начальнике сотрудника и его подчиненных на основе значения атрибута Manager, а также должность и подразделение сотрудника. Аналогичные сведения отображаются в профиле пользователя на сервере Sharepoint.

Все это позволяет сотрудникам лучше ориентироваться и быстрее находить нужных коллег.

Сведения о должностях и принадлежности подразделениям лучше всего брать из кадровой системы путем синхронизации соответствующих атрибутов. Сведения о подчиненности в принципе тоже можно взять из кадровой системы. Но в моем случае это было проблематично. Поэтому я решил использовать скрипт для заполнения атрибута Manager.

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

Конечно это не строит полную иерархию подчиненности, а заполняет атрибут Manager только для рядовых сотрудников. Тем не менее это уже автоматизация большей части работы: указать подчиненность начальников подразделений заместителям директора можно вручную или сделать отдельный скрипт.

И так сам скрипт.

Найти все неудаленные учетные записи, у которых заполнен атрибут Подразделение:

$adusers = Get-ADUser -LDAPFilter «(&(&(&(objectCategory=user)(objectClass=user)(department=*)(!userAccountControl:1.2.840.113556.1.4.803:=2)) ))» -Properties department,manager,title

Заводим список должностей начальников:

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

Для каждого подразделения составляем список его сотрудников:

$deps = @{}

$adusers | % { $deps[$_.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-ADUser -Identity $_ -Replace @{manager=$boss.DistinguishedName} }

}

Экономте свое время. Удачи!

комментария 3

  1. «Найти все неудаленные учетные записи» — Может все не отключенные учетные записи?

  2. […] я публиковал статью  Powershell – автоматизируем построение организационной ст…. Очень удобно, когда можно для  любого пользователя […]

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