Когда организация насчитывает сотни и тысячи сотрудников, сведения об организационной структуре становятся очень востребованными, потому что невозможно знать всех сотрудников или даже все подразделения и кто чем занимается.
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} }
}
Экономте свое время. Удачи!
Filed under: Active Directory, Powershell | Tagged: Active Directory, Powershell |
«Найти все неудаленные учетные записи» — Может все не отключенные учетные записи?
Угу :-)
[…] я публиковал статью Powershell – автоматизируем построение организационной ст…. Очень удобно, когда можно для любого пользователя […]