как узнать в каком контейнере ad находится компьютер
Как найти включенные компьютеры в сети с AD средствами PowerShell v2
Всем привет
Недавно передо мной стал вопрос, о поиске в сети офиса, компьютеров работающих после окончания рабочего дня(что крайне не приветствуется руководством). Решать этот вопрос я решил средствами powershell(так как давно хотел разобраться с этим инструментом), как оказалось в этом нет ничего трудного, достаточно провести немного времени за изучением статей и форумов. В итоге у меня получился вот такой скрипт:
Данный скриптик достает из AD, из нужной нам OU список компов, записывает их в файл, затем берет из этого файла и проверяет доступность поочередно, и если комп в сети то записывает в другой файлик.(вместо файла ля хранения списка компов можно использовать переменную но мне было проще сделать так(иногда бывает нужен список компов)). А дальше достаточно поотправлять всем включенным компьютерам сигнал выключения, позже добавлю как это сделать. Надеюсь моя небольшая заметка кому нибудь пригодиться.
О песочнице
Это «Песочница» — раздел, в который попадают дебютные посты пользователей, желающих стать полноправными участниками сообщества.
Если у вас есть приглашение, отправьте его автору понравившейся публикации — тогда её смогут прочитать и обсудить все остальные пользователи Хабра.
Чтобы исключить предвзятость при оценке, все публикации анонимны, псевдонимы показываются случайным образом.
О модерации
Не надо пропускать:
Как узнать в каком контейнере ad находится компьютер
Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов по системному администрированию Pyatilistnik.org. В прошлый раз мы с вами разобрали вопрос, почему у вас отсутствует в системе библиотека vcruntime140.dll и научились ее успешно устанавливать. В сегодняшней публикации я бы вас хотел научить производить поиск в Active Directory по компьютерам с определенной операционной системой. Я расскажу в каких ситуациях вам, это будет полезно.
Постановка задачи
Вы наверняка знаете, что с конца 2019 года компания Microsoft перестает в базовом варианте поддерживать операционные системы Windows Server 2008 R2 и Windows 7, останется только расширенная поддержка для корпоративных пользователей. Вам как системному администратору можете поступить задача, определить сколько у вас таких рабочих станций или серверов, доступны ли они по сети, когда последний раз обращались к контроллеру домена и были изменены их данные.
Второй вариант, когда вам необходимо найти компьютеры с определенными операционными системами, связан с лицензированием, чтобы понять сколько у вас используется.
Решение задачи
Так как у меня доменная инфраструктура и единой точкой получения информации является база Active Directory и это удобно. Получить данные мы можем тремя методами:
Получение компьютеров через LDAP запрос
Задаете понятное имя LDAP запроса и нажимаем кнопку «Запрос«.
В значении пишите Windows Server 2008 и нажимаете кнопку добавить.
Сохраняем настройки, нажимая кнопку «Ок».
В результате мы получили вот такой LDAP зарос:
На выходе вы получите список компьютеров с нужной вам операционной системой, у меня получилось 86 серверов, большая часть из них имеет статус отключен, об этом говорит стрелка вниз на значке. Так же удобно будет добавить столбец последнего изменения.
Получить список компьютеров по ОС из PowerShell
Запускаем оболочку PowerShell, для того чтобы получить список всех компьютеров с нужной операционной системой введите вот такую команду:
На выходе получите список из имени и версии ОС
Согласитесь, что это не информативно. Хочется, чтобы были данные:
Эту задачу я выполню с помощью вот такого кода, который я писал еще пару лет назад:
# Скрипт с сайта Pyatilistnik.org
В итоге я получил вот такой замечательный текстовый файл, в котором я вижу, какой компьютер живой и отвечает по сети, а какой нет и когда он последний раз обращался к контроллеру домена.
Поиск компьютеров в SCCM
Выбираем коллекцию и нажимаем построить отчет.
На выходе вы получите отчет по вашим хостам. В принципе данную информацию можно получить и через запрос в SCCM, как это делать смотрите по ссылке.
Get-ADComputer: вывод информации о компьютерах в Active Directory через PowerShell
PowerShell командлет Get-ADComputer можно использовать для получения различных сведений об учётных записях компьютеров (серверах и рабочих станциях) в домене Active Directory. Это один из наиболее полезных командлетов для выборки и поиска компьютеров по разным критериям в домене AD ( для получения информации об учетных записях пользователей AD используется другой командлет — Get-ADUser).
Допустим, ваша задача – найти в Active Directory все неактивные компьютеры, которые не регистрировались в домене более 120 дней и заблокировать учетные записи этих компьютеров.
Прежде чем приступить к работе с командлетом Get-ADComputer, необходимо подключить модуль Active Directory Module for Windows PowerShell.
Основы синтаксиса и использование командлета Get-ADComputer
Справка о параметрах командлета Get-ADComputer вызывается стандартно с помощью Get-Help:
Чтобы получить информацию о доменной учетной записи конкретного компьютера или сервера, укажите его имя в качестве аргумента параметра —Identity:
Командлет вернул только базовые свойства объекта Computer из AD. Нас интересует время последней регистрации компьютера в домене AD, но этой информация в выводе команды нет. Выведем все доступные свойства данного компьютера из Active Directory:
Как вы видите, время последнего входа данного компьютера в сеть указано в атрибуте компьютера LastLogonDate – 21.09.2015 0:20:17.
Командлет Get-ADComputer позволяет вывести в результатах команды любые из свойств компьютера. Уберем всю лишнюю информацию, оставив в выводе только значения полей Name и LastLogonDate.
Итак, мы получили данные о последнем времени регистрации в домене для одного компьютера. Теперь нам нужно изменить команду так, чтобы она возвращала информацию о времени последней регистрации в сети для всех компьютеров домена. Для этого заменим параметр –Identity на —Filter:
Отсортируем результаты запроса по времени последнего логина в сеть (поле LastLogonDate) с помощью команды Sort:
Итак, мы получили список компьютеров домена и время их последнего входа в сеть Active Directory. Теперь мы хотим заблокировать учетные записи компьютеров, которые не использовались более 120 дней.
С помощью Get-Date получим в переменной значение текущей даты и вычтем из текущей даты 120 дней:
Полученную переменную с датой можно использовать в качестве фильтра запроса Get-ADComputer по полю LastLogonDate
Таким образом, мы получили список неактивных компьютеров, не регистрировавшихся в сети более 120 дней. С помощью командлета Set-ADComputer или Disable-ADAccount вы можете отключить эти учетные записи.
Теперь можно заблокировать все полученные учетные записи компьютеров:
Примеры использования командлета Get-ADComputer
Ниже представлены еще несколько полезных примеров команд с использованием командлета Get-ADComputer, которые можно использовать для выборки и поиска компьютеров домена по определенными критериям.
Получить общее количество активных (незаблокированных) компьютеров в Active Directory:
Почитать количество серверов с Windows Server в домене:
Получить список компьютеров в определенном OU, имена которых начинаются с BuhPC:
При поиске по OU вы можете использовать дополнительный параметр -SearchScope 1, который означает, что нужно искать только в корневом разделе. Параметр -SearchScope 2 означает рекурсивный поиск компьютеров во всех вложенных OU.
Выбрать все рабочие станции с ОС Windows 10:
На выходе получили такую красивую таблицу со списком Windows Server в AD.
Выбрать заблокированные компьютеры в определенном OU:
Чтобы удалить все аккаунты компьютеров в домене, не авторизовавшиеся в домене более 6 месяцев, можете воспользоваться командой:
Результат выполнения команды Get-ADComputer можно выгрузить в текстовый файл:
Также вы можете получить выборку компьютеров и экспортировать его в CSV файл:
Или получить HTML файл отчета со списком компьютеров и нужных атрибутов компьютера:
Чтобы выполнить определенной действие со всеми компьютерами из полученного списка нужно использовать цикл Foreach. В этом примере мы хотим получить список серверов в домене с моделью и производителем:
Либо можно использовать более короткий синтаксис цикла. Допустим нам нужно выполнить определенную команду на всех компьютерах в определенном OU (в этом примере мы хотим запустить на всех серверах команду обновления настроек групповых политик):
С помощью Get-AdComputer и логон скрипта PowerShell вы можете контролировать различные параметры компьютера. Я, например, контролирую состояние агента SCCM на компьютерах пользователей. При загрузке каждого компьютера на нем отрабатывает логон скрипт, который с помощью Set-ADComputer сохраняет состояние службы ccmexec в свободный атрибут компьютера — extensionAttribute10.
Затем с помощью следующей команды я могу найти компьютеры, на которых отсутствует или не запушена служба CCMExec:
Как узнать в каком контейнере ad находится компьютер
Для генерации лицензии нам необходим путь до контейнера с экземпляром системы Indeed-ID в формате distinguishedName.
Если вы создавали хранилище данных при помощи утилиты IndeedID.instance.exe и не указывали параметры /company и /product то автоматически были созданы контейнер Indeed Identity и подконтейнер Indeed AM.
Пример:
IndeedID.instance.exe i:/DC=domain,DC=demo
Где DC=domain,DC=demo это distinguishedName корня вашего домена. В этом случае в корне домена были созданы контейнер Indeed Identity и подконтейнер Indeed AM. Путь для получения лицензий будет: DC=domain,DC=demo.
Если при создании хранилища данных вы использовали параметры /company и /product.
Пример:
IndeedID.instance.exe i:/DC=domain,DC=demo /company:Company /product:Indeed
В этом случае в корне домена были созданы контейнер Company и подконтейнер Indeed, путь до экземпляра системы останется прежним: DC=domain,DC=demo.
Если экземпляр системы расположен не в корне домена.
Пример:
IndeedID.instance.exe i:/OU=MSK-Office,DC=domain,DC=demo
В этом случае нам необходим distinguishedName подразделения MSK-Office так как контейнер Indeed Identity находится внутри. Путь для получения лицензий будет следующим: OU=MSK-Office,DC=domain,DC=demo.
Active Directory: пользователи и компьютеры
Для того чтобы узнать distinguishedName контейнера с экземпляром системы вы можете воспользоваться оснасткой Active Directory: пользователи и компьютеры (Active Directory: Users and Computers):
Веб-приложение Indeed EMC
Вы можете узнать distinguishedName контейнера с экземпляром системы через веб-приложение Indeed EMC. Для этого вам необходимо в браузере Internet Explorer перейти по адресу по которому расположено приложение.
Получение списка компьютеров с Get-ADComputer в Powershell
Так же как и с получением списка пользователей AD с Get-ADUser с помощью Powershell мы можем вернуть список компьютеров. Этот список может быть отфильтрован исключая или включая отключенные учетные записи, по-определенному OU, экспортированы в CSV и многое другое. Эти примеры, а так же множество других, вы можете увидеть в статье ниже.
Навигация по посту
Получение компьютеров
Команда, которая вернет список всех компьютеров в домене следующая:
Команда точно выполнится на домен контроллере, так как все поддерживаемые серверные версии ОС устанавливают нужный модуль Powershell вместе с Active Directory (если вы только специально не отключали эту возможность). Если вы планируете выполнять команду с клиента на Windows 7 и выше, то такой модуль устанавливается вместе с RSAT (Remote Server Administration Tools). В отдельном случае может понадобится импортировать этот модуль следующей командой:
Вы так же можете проверить, что этот модуль у вас установлен следующей командой:
В остальных случаях стоит смотреть на явные запреты на выполнение скриптов Powershell и чтения Active Directory.
Что бы вернуть данные по одному пользователю используется ключ Identity:
Параметр Filter является обязательным. Вы можете вернуть дополнительные данные используя Properties:
Как установить Powershell AD модуль
Фильтрация вывода
У нас есть базовые свойства, которые фильтруются с помощью Filter. Это:
И ряд свойств, которые возвращаются с параметром Properties. Их можно фильтровать через дополнительные условия (конвейер, where-object, циклы). Имена этих свойств можно вернуть так:
Использование Filter
Если вы планируете получить информацию по определенному доменному компьютеру, то вам нужно добавить условие. В примере ниже я возвращаю информацию только по компьютеру у которого имя равно «AD1»:
Знаки * говорят, что в этих местах может быть еще текст. Такое написание «C*L» соответствовало бы логике: строка начинается с буквы «C», затем может быть еще текст завершающийся на «L».
Использование Properties
Свойства возвращаемые через ключ Properties можно фильтровать двумя способами.
Указать больше свойств можно через запятую. Например:
Так же можно фильтровать через команду where-object. На примере ниже я получаю компьютеры со всеми свойствами, но созданные до 31 декабря 2019 года:
Ограничить вывод определенными свойствами можно через Select:
Получение включенных и отключенных учетных записей
Используя свойства Enabled можно вернуть учетные записи активных и деактивированных записей. Так будут возвращены отключенные учетные записи:
Получение компьютеров из определенных OU
Вместе с командой это получится так:
Если у вас несколько доменов или OU, которые нужно посмотреть, можно использовать циклы и массивы:
Как создавать команды и функции в Powershell вызывать их и передавать параметры
Ограничение вывода
Если у вас очень большой AD, то вывод всех компьютеров может быть долгим. Вы можете изменить это ограничив вывод с помощью ResultSetSize. Так я выведу только одну запись: