Get-ADComputer: поиск сведений о компьютерах и фильтр компьютеров по их свойствам в Active Directory
Командлет Get-ADComputer PowerShell можно использовать для получения различной информации об объектах учётных записей компьютеров (серверах и рабочих станциях) из домена Active Directory. Это один из самых полезных командлетов для поиска компьютеров AD по различным критериям (для получения информации об учётных записях пользователей AD используется другой командлет — Get-ADUser).
Предположим, ваша задача — найти все неактивные компьютеры в Active Directory, которые не были зарегистрированы в домене более 120 дней, и отключить эти учётные записи.
Чтобы использовать командлет Get-ADComputer необходимо установить Модуль Active Directory для Windows PowerShell, в каких системах он уже присутствует и как его установить если он ещё не установлен, смотрите в статье «Как установить и использовать модуль Active Directory PowerShell». На рабочих станциях данный модуль вы можете установить следующей командой:
Add-WindowsCapability -online -Name "Rsat.ActiveDirectory.DS-LDS.Tools"
Get-ADComputer — синтаксис использования командлета
Чтобы получать информацию из AD с помощью командлетов из модуля AD для PowerShell, вам не нужны права администратора домена. Достаточно, чтобы учётная запись, под которой запускается командлет, была членом группы «Domain Users / Authenticated Users».
Чтобы получить информацию о конкретной учётной записи компьютера в домене, укажите её имя в качестве аргумента параметра -Identity:
Get-ADComputer -Identity hackware-server
Пример вывода:
DistinguishedName : CN=HACKWARE-SERVER,OU=Domain Controllers,DC=ds,DC=hackware,DC=ru DNSHostName : HackWare-Server-2022.ds.hackware.ru Enabled : True Name : HACKWARE-SERVER ObjectClass : computer ObjectGUID : 77e65141-ebec-4728-a1cc-563199d86bf8 SamAccountName : HACKWARE-SERVER$ SID : S-1-5-21-670420343-3848213752-1643348011-1000
Командлет Get-ADComputer вернул из AD только основные свойства объекта ADComputer. Нас интересует время последней регистрации компьютера в домене AD, но эта информация не отображается в выводе команды выше. Вы можете перечислить все доступные свойства этого компьютерного объекта из Active Directory:
Get-ADComputer -Identity hackware-server -Properties *
Используя Get-Member, вы можете получить список всех свойств объекта ADComputer:
Get-ADComputer -Filter * -Properties * | Get-Member
Дата последнего входа компьютеров в сеть указана в атрибуте LastLogonDate.
Командлет Get-ADComputer позволяет отображать любые свойства компьютера в результатах выполнения команды. Удалите всю ненужную информацию, оставив только значения атрибутов Name и LastLogonDate.
Get-ADComputer -identity hackware-win -Properties * | Format-Table Name,LastLogonDate -Autosize
Итак, мы получили данные о последней регистрации в домене для отдельного компьютера. Затем вам нужно изменить команду, чтобы она отображала информацию о времени последней сетевой регистрации для всех компьютеров в домене. Для этого замените -Identity на -Filter *:
Get-ADComputer -Filter * -Properties * | Format-Table Name,LastLogonDate -Autosize
У нас получилась простая таблица, которая содержит всего 2 поля: имя компьютера и дата LastLogonData. Вы можете добавить в эту таблицу другие поля объекта ADComputer.
Чтобы отобразить информацию об объектах компьютеров в определённом OU (организационном подразделении), используйте параметр -SearchBase:
Get-ADComputer -SearchBase 'OU=Paris,DC=woshub,DC=loc' -Filter * -Properties * | Format-Table Name,LastLogonDate -Autosize
Отсортируйте результаты запроса по дате последнего входа в систему с помощью командлета Sort-Object:
Get-ADComputer -Filter * -Properties * | Sort-Object LastLogonDate | Format-Table Name,LastLogonDate -Autosize
Итак, у нас есть список компьютеров и дата их последнего входа в домен Active Directory. Теперь мы хотим отключить учётные записи компьютеров, которые не использовались в течение 120 или более дней.
Используя Get-Date, мы можем получить значение текущей даты в переменной и уменьшить его до 120 дней:
$date_with_offset = (Get-Date).AddDays(-120)
Полученную переменную даты можно использовать как фильтр запроса Get-ADComputer в поле LastLogonDate:
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort-Object LastLogonDate | Format-Table Name,LastLogonDate -Autosize
Итак, мы создали список неактивных учётных записей компьютеров, которые не регистрировались в сети более 120 дней. Используйте команду Disable-ADAccount или Set-ADComputer, чтобы отключить их.
Совет. В первый раз лучше проверить результаты выполнения команды с помощью переключателя -WhatIf, который позволяет увидеть, что произойдёт, если бы команда была запущена, но при этом в системе ничего изменено не будет.
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonData -lt $date_with_offset } | Set-ADComputer -Enabled $false -WhatIf
Теперь вы можете отключить все неактивные учётные записи компьютеров:
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonData -lt $date_with_offset } | Set-ADComputer -Enabled $false
Примечание. Также вы можете получить список заблокированных, отключённых и неактивных компьютеров и пользователей домена с помощью отдельного командлета Search-ADAccount.
Примеры использования Get-ADComputer
Ниже приведены ещё несколько полезных примеров использования командлета Get-ADComputer для запроса и поиска компьютерных объектов в домене по определенным критериям.
Чтобы получить общее количество всех активных (не заблокированных) компьютеров в Active Directory:
(Get-ADComputer -Filter {enabled -eq "true"}).count
Подсчёт количества экземпляров Windows Server в домене AD:
Get-ADComputer -Filter {enabled -eq "true" -and OperatingSystem -Like '*Windows Server*' } | Measure-Object | select Count
Чтобы получить список компьютеров в определённом OU, имена которых начинаются с LonPC:
Get-ADComputer -Filter {Name -like "LonPC*"} -SearchBase 'OU=London,DC=ds,DC=hackware,DC=ru' | Format-Table Name,DNSHostName,IPv4Address -Wrap -Auto
При поиске в OU можно использовать дополнительный параметр «-SearchScope 1», что означает, что вам нужно искать только в корне OU. Параметр «-SearchScope 2» указывает на рекурсивный поиск компьютеров во всех вложенных подразделениях.
Чтобы найти все рабочие станции под управлением Windows 10:
Get-ADComputer -Filter {OperatingSystem -like '*Windows 10*'}
Чтобы получить список серверов в домене с версией ОС, установленным пакетом обновлений и IP-адресом:
Get-ADComputer -Filter 'OperatingSystem -like "*Windows server*" -and enabled -eq "true"' -Properties Name,Operatingsystem,OperatingSystemVersion, OperatingSystemServicePack,IPv4Address | Sort-Object -Property Operatingsystem | Select-Object -Property Name,Operatingsystem,OperatingSystemVersion,OperatingSystemServicePack, IPv4Address| Format-Table -Wrap -Auto
На выходе получилась красивая таблица со списком Windows Server в AD.
Атрибут -LDAPFilter позволяет использовать различные запросы LDAP в качестве параметра командлета Get-ADComputer, например:
Get-ADComputer -LDAPFilter "(name=*db*)" | Format-Table
Чтобы найти все отключённые компьютеры в определённом подразделении Active Directory:
Get-ADComputer -filter * -SearchBase 'OU=Computers,OU=London,DC=hackware,dc=ru' | Where-Object {$_.enabled -eq $False}
Чтобы удалить все учётные записи компьютеров, которые не входили в домен более 6 месяцев, вы можете использовать команду:
Get-ADComputer -properties lastLogonDate -filter * | where { $_.lastLogonDate -lt (get-date).addmonths(-6) } | Remove-ADComputer
Результат команды Get-ADComputer можно экспортировать в текстовый файл:
Get-ADComputer -Filter { OperatingSystem -Like '*Windows Server 2008*' } -Properties OperatingSystem | Select DNSHostName, OperatingSystem | Format-Table -AutoSize C:\Script\server_system.txt
Вы также можете получить список компьютеров и экспортировать его в файл CSV:
Get-ADComputer -Filter * -Property * | Select-Object Name,OperatingSystem,OperatingSystemServicePack | Export-CSV All-Windows.csv -NoTypeInformation -Encoding UTF8
Или получите файл отчёта в формате HTML со списком компьютеров и необходимыми свойствами:
Get-ADComputer -Filter {OperatingSystem -Like '*Windows Server 2012*' } -Properties * | Select-Object Name,OperatingSystem | ConvertTo-Html | Out-File C:\ps\ad_computers_list.html
Чтобы выполнить определённое действие со всеми компьютерами в результирующем списке, необходимо использовать цикл ForEach-Object. В этом примере мы хотим создать список серверов в домене и запросить конкретную информацию с каждого сервера (файл результатов должен содержать имя сервера, производителя и модель сервера).
$Computers = Get-ADComputer -Filter {OperatingSystem -Like '*Windows Server*'} ForEach-Object ($Computer in $Computers) { $Hostname = $Computer.Name $ComputerInfo = (Get-WmiObject -Computername $Hostname Win32_ComputerSystem) $Manufacturer = $Computer.Manufacturer $Model = $Computer.Model Write-Host "Name: $Hostname" Write-Host "Manufacturer: $Manufacturer" Write-Host "Model: $Model" Write-Host " " $Content = "$Hostname;$Manufacturer;$Model" Add-Content -Value $Content -Path "C:\PS\ServersInfo.txt" }
Вы можете использовать более короткий синтаксис цикла. Предположим, вам нужно запустить определённую команду на всех компьютерах в определённом OU (в этом примере я хочу запустить команду обновления групповой политики на всех серверах):
Get-ADComputer -SearchBase "OU=Servers,DC=woshub,DC=com" -Filter * | %{ Invoke-Command -Computer $_.Name -ScriptBlock {gpupdate /force} }
Используя Get-AdComputer в скриптах автозапуска PowerShell, вы можете управлять различными настройками компьютера. Например, я слежу за состоянием агента (службы) SCCM на компьютерах пользователей. Небольшой скрипт входа в систему выполняется на каждом компьютере во время запуска, он сохраняет статус службы ccmexec в неиспользуемый атрибут компьютера — extensionAttribute10.
Затем с помощью следующей команды я могу найти компьютеры, на которых служба CCMExec отсутствует или не работает.
Get-ADComputer -filter {extensionAttribute10 -ne "SCCM Agent:Running"} -SearchBase “OU=Compters,OU=London,DC=hackware,DC=ru” -properties dNSHostName,extensionAttribute10,LastLogonDate | Select-Object dNSHostName,extensionAttribute10,LastLogonDate
Ещё примеры использования. Допустим, имеется задача получить информацию о всех компьютерах, у которых имя начинается с определённой строки. Для этого можно использовать опцию -Filter с оператором сравнения -like.
Смотрите также: Операторы сравнения в PowerShell
Следующая команда выведет имя, DNS-имя хоста и IPv4-адрес для всех компьютеров, чьё имя начинается на User01:
Get-ADComputer -Filter 'Name -like "User01*"' -Properties IPv4Address | Format-Table Name,DNSHostName,IPv4Address -A
Пример вывода:
name dnshostname ipv4address ---- ----------- ----------- User01-SRV1 User01-SRV1.User01.com 10.194.99.181 User01-SRV2 User01-SRV2.User01.com 10.194.100.3
Можно строить более сложные логические условия используя операторы сравнения, например, следующая команда выведет указанные свойства всех компьютеров с именами, начинающимися с Computer01 или Computer02.
Get-ADComputer -Filter 'Name -like "Computer01*" -or Name -like "Computer02*"' -Properties IPv4Address | Format-Table Name,DNSHostName,IPv4Address -A
Пример вывода:
name dnshostname ipv4address ---- ----------- ----------- Computer01-SRV1 Computer01-SRV1.Computer01.com 10.194.99.181 Computer02-SRV2 Computer02-SRV2.Computer02.com 10.194.100.3
Предположим, нужно вывести все компьютеры, которые изменили свой пароль за определённый период времени. Следующая команда получает все компьютеры, которые изменили свой пароль за последние 90 дней.
$Date = [DateTime]::Today.AddDays(-90)
Get-ADComputer -Filter 'PasswordLastSet -ge $Date' -Properties PasswordLastSet | Format-Table Name,PasswordLastSet
Пример вывода:
Name PasswordLastSet ---- --------------- USER01-SRV4 3/12/2009 6:40:37 PM USER01-SRV5 3/12/2009 7:05:45 PM
Предположим имеется задача составить список аккаунтов компьютеров в определённой локации используя LDAPFilter. Следующая команда получает учётные записи компьютеров в расположении CN=Computers,DC=User01,DC=com, при этом с помощью LDAPFilter выбираются только компьютеры, которые указаны как ноутбуки.
Get-ADComputer -LDAPFilter "(name=*laptop*)" -SearchBase "CN=Computers,DC= User01,DC=com"
Пример вывода:
name ---- pattiful-laptop davidche-laptop
Если нужно просто вывести все аккаунты компьютеров, то выполните следующую команду:
Get-ADComputer -Filter *
Следующие команды покажут имя, имя хоста DNS и адрес IPv4 всех компьютеров, чьё имя начинается со строки «Computer01» И у которых пароль последний раз установлен в течение предшествующих 30 дней.
$Date = [DateTime]::Today.AddDays(-30)
Get-ADComputer -Filter 'Name -like "Computer01*" -and PasswordLastSet -ge $Date' -Properties IPv4Address | FT Name,DNSHostName,IPv4Address -A
Пример вывода:
name dnshostname ipv4address ---- ----------- ----------- Computer01-SRV1 Computer01-SRV1.Computer01.com 10.194.99.181
Связанные статьи:
- Как установить и использовать Модуль Active Directory для Windows PowerShell (100%)
- LAPS: управление паролями локальных администраторов на компьютерах домена (65.4%)
- Get-ADUser: поиск сведений о пользователях и фильтр пользователей по их свойствам в Active Directory (61.6%)
- Управление группами Active Directory с помощью PowerShell (61.6%)
- Как настроить Windows Server 2022 с помощью PowerShell (50%)
- Снижение уровня контроллеров домена в Windows Server в PowerShell и графическом интерфейсе (RANDOM - 50%)