Некоторые особенности PowerShell при работе с учетными записями пользователей
Я считал, что неплохо разбираюсь в powershell, но мне никогда не приходилось работать с учетными данными пользователей. Однако сейчас я в поиске работы и на одном из собеседований мне поставили тестовое задание написать скрипт, который должен был:
- Проверить наличие и статус (включена/отключена) учетной записи пользователя.
- Проверить включена ли учетная запись в группу «Администраторы»
- Если учетная запись отсутствует, то создать учетную запись и добавить ее в группу администраторы, проставить флаги «Запретить смену пароля пользователем» и «Срок действия пароля не ограничен»
- Если учетная запись существует, но отключена либо не входит в группу «Администраторы», то включить учетную запись и добавить ее в группу «Администраторы», проставить флаги «Запретить смену пароля пользователем» и «Срок действия пароля не ограничен»
- Скрипт не должен зависеть от языка операционной системы.
Get-User admin
И тут же получил ошибку
Get-User : Имя «Get-User» не распознано как имя командлета, функции, файла сценария или выполняемой программы.
Немного опешив, от того, что такая полезная команда и не распознала я погуглил и обнаружил, что команда Get-User работает только в консоли Powershell для Exchange. Для работы с локальными пользователями необходимо использовать Get-Localuser, а для доменных Get-Aduser. Осознав свою ошибку, я вбил:
Get-Localuser admin
И получил ответ
Name Enabled Description ---- ------- ----------- Admin True Встроенная учетная запись администратора компьютера/домена
Ну теперь проверить есть пользователь или нет, не составит большого труда, однако и тут меня ждал очередной подвох. Через условный оператор if else сделать это оказалось не так-то просто.
Дело в том, что если пользователь есть в системе, то на выход мы получаем не значение true, а целый набор данных, с именем, описанием пользователя, включена эта учетная запись или нет. А если пользователя нет, то powershell выдает ошибку. Побродив по просторам интернета, я обнаружил, что для этих целей лучше использовать оператор try сatch.
$user = 'admin' try < Get-LocalUser $user -ErrorAction Stop | Out-Null write-host пользователь $user есть -foregroundcolor Green >Catch
Я добавил переменную $user, чтобы было проще менять имена пользователя во всем скрипте. ErrorAction Stop необходим, чтобы скрипт не прервался на этом шаге из-за ошибки. Знак | разделяет шаги конвейера, а Out-Null скроет вывод текста ошибки. Так же я добавил вывод текста с подсветкой, для удобства проверки скрипта.
Далее я захотел проверить, включена или отключена учетная запись. Как я уже говорил, команда Get-LocalUser выдает целый набор данных и для проверки, мне нужно было выделить только один параметр Enabled со значением true или false. Для этого я воспользовался следующей командой:
(Get-LocalUser $user).enabled
Убедившись, что он работает, я сделал следующую проверку и добавил команду включения пользователя.
$user = 'admin' if ((Get-LocalUser $user).enabled -eq "True") < write-host учетная запись включена -foregroundcolor Green >else
Для включения пользователя, естественно необходимо запускать консоль под правами администратора.
Во втором пункте задания, необходимо было определить входит ли пользователь в группу администраторов. Для проверки наличия пользователя в той или иной группе есть команда Get-LocalGroupMember. Однако имя группы администраторов, меняется от языка операционной системы. Поэтому мне пришлось воспользоваться стандартным SID S-1-5-32-544. Проверку я также сделал через try сatch.
$user = 'admin' try < Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host пользователь $user состоит в группе администраторы -foregroundcolor Green >Catch
В случае, если пользователь не состоит в группе, администраторов он будет в нее добавлен.
На следующем этапе, у меня стояла задача определить отключена настройка смены пароля у пользователя или нет. Тут я наткнулся на очередные подводные камни. Дело в том, что если у пользователя, срок действия пароля не ограничен, то параметр PasswordExpires не выдает никаких значений. А если эта галочка отключена, то у разных пользователей будет стоять разная дата смены пароля. Выход из этого положения я всё-таки придумал:
if ((Get-LocalUser $user).PasswordExpires -eq $null) < write-host срок действия паролья не ограничен -foregroundcolor Green >else
Дальше мне было необходимо создавать пользователя. Я никак не ожидал, что и здесь меня может ждать подвох. При создании пользователя командой
new-LocalUser -User $user -password P@ssW0rD!
Не удается привязать параметр «Password». Не удается преобразовать значение «P@ssW0rD!» типа «System.String» в тип «System.Security.SecureString».
Дело в том, что параметр -password должен использовать SecureString, вместо обычной текстовой строки. Для этого я сделал переменную $password и сконвертировал её в securestring.
$password = convertto-securestring "P@ssW0rD!" -asplaintext -force
А сам скрипт по созданию пользователя и добавления его в группу администраторов
new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
Готовый скрипт учитывающий все условия у меня получился таким образом:
$user = 'admin' $password = convertto-securestring "P@ssW0rD!" -asplaintext -force try < Get-LocalUser $user -ErrorAction Stop | Out-Null cls write-host пользователь $user есть -foregroundcolor Green if ((Get-LocalUser $user).enabled -eq "True") < write-host учетная запись включена -foregroundcolor Green >else < write-host учетная запись отключена -foregroundcolor Red Enable-LocalUser $user write-host учетная запись включена -foregroundcolor Green >if ((Get-LocalUser $user).PasswordExpires -eq $null) < write-host срок действия паролья не ограничен -foregroundcolor Green >else < write-host срок действия пароля ограничен -foregroundcolor Red set-LocalUser $user -PasswordNeverExpires:$true write-host срок действия паролья не ограничен -foregroundcolor Green >try < Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host пользователь $user состоит в группе администраторы -foregroundcolor Green >Catch < write-host пользователь $user не состоит в группе администраторы -foregroundcolor Red Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host пользователь $user состоит в группе администраторы -foregroundcolor Green >> Catch
Однако хранение пароля администратора в скрипте — это не лучшая практика с точки зрения безопасности. Для этого можно использовать хэш пароля, а не сам пароль.
$user = 'admin1' $hash = "01000000d08c9ddf0115d1118c7a00c04fc297eb0100000048baf1b47a72d845b4eeda8659da9fd70000000002000000000010660000000100002000000004d2a3bf03aac92c2e172dc002d1fe8759da4655850462aface5c25f52921e05000000000e8000000002000020000000bfa652b6f7cc6845e3cee1831b54ab93dc272d0b2203024c3de8bc4789a2698a10000000923fb50dcf01125913534d0c1ba6d827400000002757df7d8a8b39c8e84b81323acff1d72419580a0022cf610926e5f081a2e895320088d482eb407f8157aad82f091abee7427b357e871d12238a8f74131238e7" $hash $password = ConvertTo-SecureString -String $hash $password new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
Для того, чтобы получить хэш пароля можно воспользоваться следующим скриптом
$Secure = Read-Host -AsSecureString $Secure $hash = ConvertFrom-SecureString -SecureString $Secure $hash
Который запросит ввод пароля с клавиатуры.
И маленький бонус для вывода всех отключенных записей
Get-LocalUser | Where-Object
Надеюсь, потраченное мною время поможет кому-то в работе. Да и для себя будет полезно не забыть этот бесценный опыт.
Get-ADGroupMember возвращает ошибку для локальной группы домена членам из удаленных лесов
Эта статья поможет устранить ошибку Get-ADGroupMember , которая возникает при выполнении командлета в сценарии, где группа имеет участника из удаленного леса.
Применяется к: Windows Server 2012 R2
Исходный номер базы знаний: 3171600
Симптомы
Предположим, что вы используете Get-ADGroupMember командлет для идентификации членов группы в доменные службы Active Directory (AD DS). Однако при выполнении командлета для локальной группы домена возвращается следующую ошибку:
Get-ADGroupMember -verbose -identity «CN=Test-Local1,OU=Test Accounts,DC=contoso,DC=com»
Get-ADGroupMember: произошла неуказанная ошибка
В строке:1 char:1
+ Get-ADGroupMember -verbose -identity «CN=Test-Local1,OU=Test Accounts,DC=contoso .
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (CN=Test-Local1. bertm-w7,DC=com:ADGroup) [Get-ADGroupMember], ADExceptionon + FullyQualifiedErrorId : ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.GetADGroupMember
При одностороннем Get-ADGroupMember доверии при использовании командлета в группе из доверенного леса вы получаете следующие ошибки, если группа содержит участников из доверенного леса:
- «Произошла неуказанная ошибка»
- «Серверу не удалось обработать запрос из-за внутренней ошибки»
В качестве обходного решения используйте оснастку Пользователи и компьютеры Active Directory для просмотра членов группы или преобразования одностороннего доверия в одностороннее доверие.
Причина
Эта проблема возникает, если группа содержит участника из другого леса, учетная запись которого была удалена из леса учетной записи. Член представлен в локальном домене субъектом внешней безопасности (FSP). В экспорте LDIFDE группы членство отображается следующим образом:
dn: CN=Test-Local1,OU=Test Accounts,DC=contoso,DC=com
При удалении исходной учетной записи с идентификатором безопасности FSP не обновляется и не удаляется с учетом этого удаления. Необходимо вручную убедиться, что эти ссылки FSP удалены.
Решение
Чтобы устранить эту проблему, включите ведение журнала для запросов на разрешение, которые касаются этих идентификаторов безопасности и выполняются веб-службой Active Directory. Таким образом можно определить учетные записи, для которых не удается выполнить разрешение. Для этого выполните командлет Get-ADGroupMember contoso.com на контроллере домена (где заполнитель представляет указанный домен).
Чтобы включить ведение журнала, выполните следующие командные строки:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name LspDbgInfoLevel -Value 0x800 -Type dword -Force Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name LspDbgTraceOptions -Value 0x1 -Type dword -Force
Не забудьте отключить ведение журнала при наличии журнала:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name LspDbgInfoLevel -Value 0x0 -Type dword -Force
Вы увидите файл с именем c:\windows\debug\lsp.log, который отслеживает попытки SID-Name разрешения. При повторном запуске командлета на контроллере домена, где был выполнен командлет, файл регистрирует сбои и будет выглядеть следующим образом:
LspDsLookup — ввод функции LsapLookupSidsLspDsLookup — запрос LookupSids для 1 идентификаторов безопасности с level=1, mappedcount=0, options=0x0, clientRevision=2 обрабатывается. Идентификаторы безопасности: LspDsLookup — Sids[ 0 ] = S-1-5-21-3110691720-3620623707-1182478234-698540LspDsLookup — Requestor details: Local Machine, Process Process Name = C:\Windows\ADWS\Microsoft.ActiveDirectory.WebServices.exe LspDsLookup — Entering function LsapDbLookupSidsUsingIdentityCacheLspDsLookup — 1 sids remain unmappedLspDsLookup — Exiting function LsapDbLookupSidsUsingIdentityCache с состоянием 0x0LspDsLookup — запрос цепочки LookupSids (с помощью Netlogon) к \ dc3.northwindtraders.com для 1 sids будет выполнен с level=6, mappedcount=0, options=0x0, serverRevision=0. Идентификаторы безопасности: LspDsLookup — Sids[ 0 ] = S-1-5-21-3110691720-3620623707-1182478234-698540 LspDsLookup — Lookup request (using Netlogon) to \ dc3.northwindtraders.com returned with 0xc0000073 and mappedcount=0, serverRevision=0LspDsLookup — выход из функции LsapLookupSids с состоянием 0xc0000073
Проверьте наличие следующих элементов, чтобы убедиться, что это соответствующий раздел для этой проблемы (в предыдущем примере выходных данных):
- Процесс выполняется C:\Windows\ADWS\Microsoft.ActiveDirectory.WebServices.exe.
- Например, запрос отправляется контроллеру домена в другом лесу northwindtraders.com .
- Код возврата — это 0xc0000073, что равно STATUS_NONE_MAPPED.
Чтобы найти объект FSP, выполните следующую команду (замените доменные имена и идентификаторы безопасности):
get-AdObject -Searchbase "CN=ForeignSecurityPrincipals,DC=contoso,DC=com" -ldapfilter "(cn=S-1-5-21-3110691720-3620623707-1182478234-698540)"
Исходный объект для этого FSP больше не существует, поэтому его можно безопасно удалить. Это также приведет к удалению из всех групп, в которых он входит:
get-AdObject -Searchbase "CN=ForeignSecurityPrincipals,DC=contoso,DC=com" -ldapfilter "(cn=S-1-5-21-3110691720-3620623707-1182478234-698540)" | Remove-AdObject -Confirm:$false
Get aduser не распознано как имя командлета
Сообщения: 2
Благодарности: 0
Необходим такой скрипт:
Для каждого пользователя Active Directory (включая вложенные OU) провести проверку на заполнение поля e-mail.
Если в этом поле уже есть хоть один символ, то пропускаем.
Иначе надо заполнить это поле по следующему принципу:
берем значение «user logon name» текущего пользователя и конкатенируем без пробела с константой «@mail.ru»
Большое спасибо всем откликнувшимся!
Сообщения: 1259
Благодарности: 861
Get-ADUser -Filter | Foreach
Это сообщение посчитали полезным следующие участники:
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Сообщения: 2
Благодарности: 0
Спасибо!
Знание — сила!
Сообщения: 21
Благодарности: 0
не сработало. На контроллере домена создал файл ADfillemails.vbs , вставил в него эту строку.. ничего не произошло..
Windows PowerShell
(C) Корпорация Майкрософт, 2009. Все права защищены.
PS F:\Users\Администратор.IPIP> Get-ADUser -Filter | Foreach $_ -EmailAddress «$($_.samaccountname)@kamastretch.com»>
Имя «Get-ADUser» не распознано как имя командлета, функции, файла скрипта или выполняемой программы. Проверьте правильн
ость написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:11
+ Get-ADUser <<<< -Filter | Foreach samaccountname)@kamastretch.com">
+ CategoryInfo : ObjectNotFound: (Get-ADUser:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Get-ADComputer: получить информацию о компьютерах Active Directory через PowerShell

05.10.2022

itpro

PowerShell

комментариев 59
Для получения различной информации об учетных записях компьютера (серверах и рабочих станциях) в домене Active Directory можно использовать PowerShell командлет Get-ADComputer. Это один из наиболее полезных командлетов для выборки и поиска компьютеров по разным критериям в домене AD
Допустим, ваша задача – найти в Active Directory все неактивные компьютеры, которые не регистрировались в домене более 120 дней и заблокировать учетные записи этих компьютеров.
Прежде чем приступить к работе с командлетом Get-ADComputer, необходимо установить и импортировать модуль Active Directory Module для Windows PowerShell.
Совет. В версии PowerShell 3.0 (представлен в Windows Server 2012) и выше этот модуль подключается по умолчанию при установке компонента Remote Server Administration Tools -> Role Administration Tools -> AD DS and AD LDS Tools -> Active Directory модуль для Windows PowerShell. Чтобы использовать командлет Get-ADComputer в клиентских Windows 11 или 10 нужно скачать и установить компонент RSAT для вашей версии ОС и включить модуль AD-PowerShell из панели управления или командой:
Add-WindowsCapability –online –Name “Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0”

Вывести атрибуты компьютера с помощью Get-ADComputer
Справка о параметрах командлета Get-ADComputer вызывается стандартно с помощью Get-Help:

Для получения информации из AD с помощью командлетов модуля AD для Powershell не обязательно иметь права администратора домена, достаточно чтобы учетная запись под которой запускается командлет входила в группу пользователей домена (Authenticated Users / Domain Users).
Чтобы получить информацию о доменной учетной записи конкретного компьютера или сервера, укажите его имя в качестве аргумента параметра —Identity:
Get-ADComputer -Identity SRV-DB01

DistinguishedName : CN=DB01,OU=Servers,OU=MSK,DC=winitpro,DC=ru DNSHostName : DB01.winitpro.ru Enabled : True Name : DB01 ObjectClass : computer ObjectGUID : 1234567c-13f8-4a2c-8b00-b30a32324103 SamAccountName : DB01$ SID : S-1-5-21-3243682314-1360322815-2238451561-4318 UserPrincipalName :
Командлет вернул только базовые свойства объекта Computer из AD . Нас интересует время последней регистрации компьютера в домене AD, но этой информация в выводе команды нет. Выведем все доступные свойства (атрибуты) данного компьютера из Active Directory:

Get-ADComputer -Identity SRV-DB01 -Properties *
Этот список атрибутов компьютера также доступен в графической консоли Active Directory Users and Computers ( dsa.msc ) на вкладке редактора атрибутов.

С помощью Get-Member можно получить список всех свойств класса Computer в AD:
Get-ADComputer -Filter * -Properties * | Get-Member
Как вы видите, время последнего входа данного компьютера в сеть указано в атрибуте компьютера LastLogonDate – 6/2/2022 3:59:30 AM.
Командлет Get-ADComputer позволяет вывести в результатах команды любые из свойств компьютера. Уберем всю лишнюю информацию, оставив в выводе только значения атрибутов Name и LastLogonDate.
Get-ADComputer -identity SRV-DB01 -Properties * | FT Name, LastLogonDate -Autosize
Итак, мы получили данные о последнем времени регистрации в домене для одного компьютера. Теперь нам нужно изменить команду так, чтобы она возвращала информацию о времени последней регистрации в сети для всех компьютеров домена. Для этого заменим параметр –Identity на —Filter:

Get-ADComputer -Filter * -Properties * | FT Name, LastLogonDate -Autosize
Мы получили таблицу, которая содержит только 2 поля: имя компьютера и дата LastLogonData. Вы можете добавить в эту таблицу другие поля объекта Computer из AD. Чтобы вывести данные о компьютерах в определенном контейнере домена (OU), воспользуйтесь параметром SearchBase:
Get-ADComputer -SearchBase ‘OU=Moscow,DC=winitpro,DC=loc’ -Filter * -Properties * | FT Name, LastLogonDate -Autosize
Отсортируем результаты запроса по времени последнего логина в сеть (поле LastLogonDate) с помощью команды Sort:
Get-ADComputer -Filter * -Properties * | Sort LastLogonDate | FT Name, LastLogonDate -Autosize
Итак, мы получили список компьютеров домена и время их последнего входа в сеть Active Directory. Теперь мы хотим заблокировать учетные записи компьютеров, которые не использовались более 120 дней.
С помощью Get-Date получим в переменной значение текущей даты и вычтем из текущей даты 120 дней:
Полученную переменную с датой можно использовать в качестве фильтра запроса Get-ADComputer по полю LastLogonDate
Get-ADComputer -Properties LastLogonDate -Filter | Sort LastLogonDate | FT Name, LastLogonDate -Autosize
Таким образом, мы получили список неактивных компьютеров, которые не регистрировались в домене более 120 дней. С помощью командлета Set-ADComputer или Disable-ADAccount вы можете отключить эти учетные записи.
Совет. В первый раз лучше протестировать результаты команды с помощью переключателя –WhatIf, благодаря которому команда не вносит никаких изменений, показывая, что произойдет при ее выполнении.
Get-ADComputer -Properties LastLogonDate -Filter | Set-ADComputer -Enabled $false -whatif
Теперь можно заблокировать все найденные учетные записи компьютеров:
Get-ADComputer -Properties LastLogonDate -Filter | Set-ADComputer -Enabled $false
Совет. Список заблокированных, отключенных и неактивных компьютеров и пользователей домена можно получить также с помощью отдельного командлета Search-ADAccount.
Использование фильтров в Get-ADComputer
С помощью аргумента -Filter командлета Get-ADComputer вы можете выбрать несколько компьютеров Active Directory по определенным критериями. Здесь можно использовать подстановочные знаки (wildcards) и логические операторы сравнения. В качестве фильтров можно использовать только базовые атрибуты компьютера.
Если вам нужно использовать фильтры по расширенными атрибутам компьютеров, их можно задавать через where-object. Несколько примеров есть в следующем разделе статьи.
Получить общее количество активных (незаблокированных) компьютеров в Active Directory:
Вы можете использовать множественные фильтры для поиска компьютеров по нескольким параметрам сразу. Для этого используются логические операторы сравнения PowerShell (-and, -eq , -ne , -gt , -ge , -lt , -le , -like , -notlike , -and , -or , и т.д.).
Посчитать количество серверов с Windows Server в домене:

Получить список компьютеров в определенном OU, имена которых начинаются с BuhPC:
Get-ADComputer -Filter -SearchBase ‘OU=Moscow,DC=winitpro,DC=loc’ -Properties IPv4Address | Format-table Name,DNSHostName,IPv4Address | ft -Wrap –Auto
При поиске по OU вы можете использовать дополнительный параметр -SearchScope 1, который означает, что нужно искать только в корневом разделе. Параметр -SearchScope 2 означает рекурсивный поиск компьютеров во всех вложенных OU.
Выбрать все рабочие станции с ОС Windows 10:
Получить список серверов в домене с версией ОС, IP адресом и установленным Service Pack:
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| ft -Wrap –Auto
На выходе получили такую красивую таблицу со списком Windows Server в AD.

Полезные примеры использования командлета Get-ADComputer
Ниже представлены еще несколько полезных примеров команд с использованием командлета Get-ADComputer, которые можно использовать для выборки и поиска компьютеров домена по определенными критериям.
Атрибут -LDAPFilter позволяет использовать в качестве параметра командлета Get-ADComputer различные LDAP запросы, например:
Get-ADComputer -LDAPFilter «(name=*db*)»|ft
Выбрать заблокированные компьютеры в определенном OU:
Get-ADComputer -filter * -SearchBase ‘OU=Computers, dc=winitpro,dc=loc’ | Where-Object
Чтобы удалить все аккаунты компьютеров в домене, не авторизовавшиеся в домене более 6 месяцев, можете воспользоваться командой:
get-adcomputer -properties lastLogonDate -filter * | where < $_.lastLogonDate -lt (get-date).addmonths(-6) >| Remove-ADComputer
Вывести время последней смены пароля компьютера в Active Directory. По умолчанию пароль должен меняться компьютером автоматически раз в 30 дней, если пароль компьютера не совпадает с паролем в AD, доверительные отношения компьютера с доменом будут нарушены:
Get-ADComputer –Identity pc123456 -Properties PasswordLastSet
Результат выполнения команды Get-ADComputer можно выгрузить в текстовый файл:
Get-ADComputer -Filter < OperatingSystem -Like '*Windows Server 2019*' >-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 -Properties * | Select-Object Name,OperatingSystem | ConvertTo-Html | Out-File C:\ps\ad_computer.html

Можно удалено получить различную информацию с компьютеров AD через WMI (или CIM). Например, вывести серийные номера всех серверов в домене:
Get-ADComputer -Filter ‘operatingsystem -like «*Windows server*» -and enabled -eq «true»‘ | Select-Object Name | Foreach-Object
Чтобы выполнить определенной действие со всеми компьютерами из полученного списка нужно использовать цикл Foreach. В этом примере мы хотим получить список серверов в домене с моделью и производителем:
$Computers = Get-ADComputer -Filter
Foreach ($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. В этом примере мы с помощью Invoke-Command выполним на всех серверах команду обновления настроек групповых политик:
По аналогии вы можете получить различную полезную информацию со всех компьютеров в домене:
- Проверить статус активации Windows на компьютерах
- Проверить свободное место на дисках
- Проверить и обновить версию PowerShell
- Собрать сетевые настройки компьютеров и серверов
- Получить имена пользователей со всех компьютеров
С помощью Get-ADComputer и логон скриптов PowerShell вы можете контролировать различные параметры компьютера или хранить различную полезную информацию в атрибутах компьютера в AD (можно например добавить имя пользователя в описание компьютера).
Я, например, контролирую состояние агента SCCM на компьютерах пользователей. При загрузке каждого компьютера на нем отрабатывает логон скрипт, который с помощью Set-ADComputer сохраняет состояние службы ccmexec в свободный атрибут компьютера — extensionAttribute10.
Затем с помощью следующей команды я могу найти компьютеры, на которых отсутствует или не запушена служба CCMExec:
get-adcomputer -filter -SearchBase “OU=Computers,OU=MSK,DC=winitpro,DC=ru” -properties dNSHostName,extensionAttribute10,LastLogonDate |select-object dNSHostName,extensionAttribute10,LastLogonDate

Для получения информации об учетных записях пользователей AD используется другой командлет — Get-ADUser .
Предыдущая статья Следующая статья