Извлекаем информацию из Active Directory в разрезе компаний с помощью PowerShell

imageВ больших ИТ-инфраструктурах обслуживающих сразу несколько компаний периодически возникает потребность оперативного получения информации о количестве пользователей и компьютеров в разрезе этих компаний для разных целей, например при анализе текущей ситуации и планировании лицензирования ПО. Для того чтобы разделить всех пользователей и компьютеры в разрезе компаний в AD можно воспользоваться атрибутом company, который имеет место быть не только для учетных записей пользователей (что очевидно), но и для учетных записей компьютеров. Соответственно если мы имеем заполненным значение этого атрибута то с помощью PowerShell можем выполнять нехитрые запросы, сворачивая информацию в нужных нам разрезах. Далее небольшой ряд примеров…

***

Подсчитываем в AD количество компьютеров в разрезе версий ОС и организаций к которым относятся эти компьютеры (из атрибута company) и при этом сворачиваем данные сначала по версии операционной системы, а затем по юр.лицу:

Import-Module ActiveDirectory

$OU =  "dc=holding,dc=com"

$Filter = "(&(objectClass=computer)(cn=KOM-*)(!description=*cluster*)(!userAccountControl:1.2.840.113556.1.4.803:=2))"

Get-ADComputer -SearchBase $OU -ResultSetSize $null -LDAPFilter $Filter -Properties * | Sort-Object operatingSystem, company | Group-Object operatingSystem, company | FT -AutoSize

В этом примере используется LDAP-фильтр, в котором выбираются все объекты AD типа Компьютер с именем начинающимся с определённого префикса и при этом отбрасываются выключенные учетные записи и те учетные записи у которых в описании встречается слово cluster, так как, как правило, это служебные учетные записи которые создаются службами класастеризации Windows Server Failover Clustering

Если же требуется свернуть данные сначала по организации, а уже потом по версии ОС, достаточно просто поменять местами атрибуты operatingSystem и company на этапе сортировки и группировки

***

Подсчитываем фактическое использование клиентских лицензий (CAL) для Lync в консоли Lync Server Management Shell.
Пользователи с SIP выключенные:

(Get-CsUser -OU "ou=KOM,dc=holding,dc=com" -LdapFilter "&(objectCategory=user)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2)").count

Пользователи с SIP действующие:

(Get-CsUser -OU "ou=KOM,dc=holding,dc=com" -LdapFilter "&(objectCategory=user)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)").count

Посчитать пользователей по конкретной маске имени организации можно добавив в параметр LdapFilter значение типа (company=*сбыт*)


Чобы получить свод в разрезе всех имеющихся значений атрибута company используем командлет AD - Get-ADUser:

Import-Module ActiveDirectory

$OU =  "ou=KOM,dc=holding,dc=com"

$Filter = "(&(objectClass=user)(msRTCSIP-UserEnabled=TRUE)(!userAccountControl:1.2.840.113556.1.4.803:=2))"

Get-ADUser -SearchBase $OU  -ResultSetSize $null -LDAPFilter $Filter -Properties * | Sort-Object company, cn | Group-Object company | FT -AutoSize

***

Подсчитываем количество пользователей имеющих почтовые ящики Exchange в разрезе компаний.
Всего пользователей с почтовыми ящиками:       

(Get-ADUser -SearchBase "ou=KOM,dc=holding,dc=com" -ResultSetSize $null -LDAPFilter "(&(objectClass=user)(HomeMDB=*))").count

Пользователей с почтовыми ящиками (отключенных):

(Get-ADUser -SearchBase "ou=KOM,dc=holding,dc=com" -ResultSetSize $null -LDAPFilter "(&(objectClass=user)(HomeMDB=*)(userAccountControl:1.2.840.113556.1.4.803:=2))").count

Пользователей с почтовыми ящиками (активных):

(Get-ADUser -SearchBase "ou=KOM,dc=holding,dc=com" -ResultSetSize $null -LDAPFilter "(&(objectClass=user)(HomeMDB=*)(!userAccountControl:1.2.840.113556.1.4.803:=2))").count

Активные пользователи c почтовыми ящиками в разрезе компаний:           

Import-Module ActiveDirectory

$OU =  "ou=KOM,dc=holding,dc=com"

$Filter =  "(&(objectClass=user)(HomeMDB=*)(!userAccountControl:1.2.840.113556.1.4.803:=2))"

Get-ADUser -SearchBase $OU -ResultSetSize $null -LDAPFilter $Filter  -Properties * | Sort-Object company, cn | Group-Object company | FT -AutoSize

***

Пример скрипта для массовой замены атрибута company для всех пользователей в определённом OU:

Import-Module ActiveDirectory

$OU = "OU=KOM,DC=holding,DC=com"

$DC = "KOM-DC01.holding.com"

$Company = 'ОАО "Рога и Копыта"'

$Filter = "(&(objectCategory=user)((objectClass=user))(!company=*)(!userAccountControl:1.2.840.113556.1.4.803:=2)(cn=s-*))"

Get-ADobject -LDAPFilter $Filter -SearchBase $OU -Server $DC | Set-adobject -Server $DC -Add @{company=$Company;}

…другой пример, - для обновления учетных записей компьютеров:

Import-Module ActiveDirectory

$OU = "OU=KOM,DC=holding,DC=com"

$Company = 'ОАО "Рога и Копыта"'

Get-ADComputer -Filter {(Enabled -eq $True)} -SearchBase $OU -Properties company | `

ForEach-Object {

    $PC = Get-ADComputer -Identity $_.name -Properties company;

    $PC.company=$Company;

    Set-ADComputer -Instance $PC;

}

Всего комментариев: 4 Комментировать

  1. odarchuk /

    А как получить коли-во юзеров в каждой OU ? Т.е. у меня есть OU=KOM,DC=holding,DC=com в которой еще 100500 OU (причем вложеность очень большая) и нужно получить рез-т в виде:
    OU=KOM,DC=holding,DC=com = 0 юзеров
    OU=IT,OU=KOM,DC=holding,DC=com = 20 юзеров
    и тд и тп

      1. odarchuk /

        Спасибо! Но скрипт дальше 1го уровня вложености не ищет ((
        т.е. выдал сумарное кол-во юзеров во всех ОУшках DC=holding,DC=com
        А у меня есть такие ОУ где около 10 вложенных ОУ :)

  2. Андрей Дымов /

    Добрый день
    357 OU в ad
    более 10к comp
    необходимо выгрузить и получить txt документ в форме таблицы с заголовками:
    Name_OU Name (comp) Тип Description
    Подскажите как составить запрос

Добавить комментарий