Извлекаем информацию из Active Directory

  • Михаил
  • 12 мин. на прочтение
  • 127
  • 13 Dec 2016
  • 13 Dec 2016

В больших ИТ-инфраструктурах обслуживающих сразу несколько компаний периодически возникает потребность оперативного получения информации о количестве пользователей и компьютеров в разрезе этих компаний для разных целей, например при анализе текущей ситуации и планировании лицензирования ПО. Для того чтобы разделить всех пользователей и компьютеры в разрезе компаний в 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;
}