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

Рекомендуется Вам:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *