В больших ИТ-инфраструктурах обслуживающих сразу несколько компаний периодически возникает потребность оперативного получения информации о количестве пользователей и компьютеров в разрезе этих компаний для разных целей, например при анализе текущей ситуации и планировании лицензирования ПО. Для того чтобы разделить всех пользователей и компьютеры в разрезе компаний в 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;
}
А как получить коли-во юзеров в каждой 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 юзеров
и тд и тп
http://gallery.technet.microsoft.com/scriptcenter/Count-Users-per-OU-3d587c9f
Спасибо! Но скрипт дальше 1го уровня вложености не ищет ((
т.е. выдал сумарное кол-во юзеров во всех ОУшках DC=holding,DC=com
А у меня есть такие ОУ где около 10 вложенных ОУ :)
Добрый день
357 OU в ad
более 10к comp
необходимо выгрузить и получить txt документ в форме таблицы с заголовками:
Name_OU Name (comp) Тип Description
Подскажите как составить запрос