Достаточно часто системному администратору Windows приходится делать различные выгрузки по информации о пользователях домена Active Directory. Представим, что у нас есть список учетных записей (имена пользователя в формате samAccountName), и нам, например, необходимо получить информацию о том, в какой организации эти пользователи работают и их Canonical Name (CN). Ранее для получения такой информации мне приходилось писать небольшой скрипт на vbs, который последовательно перебирает все записи в Excel и возвращает обратно требуемую информацию из Active Directory. Такой механизм полностью работоспособен, но не очень удобен, поэтому я решил воспользоваться мощью языка Visual Basic from Application и выполнять запросы к Active Directory прямо из Excel (из макроса), т.к. такая методика была бы достаточно универсальной и в принципе все эти скрипты можно со спокойной совестью передавать менее подкованным бухгалтерам и экономистам!
Я создал новый макрос в книге Excel, и создал функцию с именем GetADInfo, которая на входе получает имя поля, по которому осуществляется поиск (в моем случае это имя пользователя, которое хранится в атрибуте Active Directory – samAccountName), значение этого поля (значение ячейки с именем пользователя) и имя артибута AD, значение которого функция должна вернуть.
Как же все это работает? В моем примере в ячейке A2 содержится имя пользователя домена, и я хочу для этого пользователя узнать компанию, в которой он числится (поле AD “Company”) и его каноническое имя (поле AD «distinguishedName»), в этом случае формулы для ячеек соответственно будут выглядеть следующим образом:
Ячейка B2 (наименование организации):
=GetADInfo("samAccountName";A2; "Company")
Ячейка C2 (CN):
=GetADInfo("samAccountName";A2; "distinguishedName")
Код макроса на VBA для получения данных из AD следующий:
Function GetADInfo(ByVal SearchField, ByVal SearchString, ByVal ReturnField) ' Указываем имя домена ("dc=domain, dc=local") Dim adoCommand, strDomain, objConnection strDomain = "dc=winitpro,dc=ru" Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" ' Подключаемся Set adoCommand = CreateObject("ADODB.Command") adoCommand.ActiveConnection = objConnection ' Рекурсивный поиск по AD, начиная с корня домена adoCommand.CommandText = _ "<LDAP://" & strDomain & ">;(&(objectCategory=" & "User" & ")" & _ "(" & SearchField & "=" & SearchString & "));" & SearchField & "," & ReturnField & ";subtree" ' создаем набор записей RecordSet Dim objRecordSet Set objRecordSet = adoCommand.Execute If objRecordSet.RecordCount = 0 Then GetADInfo = "not found" ' ничего не найдено Else GetADInfo = objRecordSet.Fields(ReturnField) ' возвращаемое значение End If ' Закрываем подключение objConnection.Close ' Очищаем переменные Set objRecordSet = Nothing Set objCommand = Nothing Set objConnection = Nothing End Function
Чтобы данная функция заработала, необходимо подключить ряд библиотек в VBA. В редакторе VBA выбираем меню Tools->References и в появившемся окне отмечаем следующие библиотеки:
- Visual Basic For Application
- Microsoft Excel 14.0 Object Library
- OLE Automation
- Microsoft Office 14.0 Object Library
- Microsoft ActiveX Data Objects 2.8 Library (или около того)
- Microsoft Scripting Runtime
- Microsoft VBScript Regular Expressions 5.5
После того, как вы активируете следующие компоненты, сохраните макрос VBAи книгу Excel, и в результате в соответствующих полях Excel появится информация из Active Directory. Прелесть данного скрипта состоит в том, что он достаточно универсальный и с небольшими модификациями он поможет динамически получать практически любую информацию из Active Directory прямо в книге прямо в книге Excel!
Using Excel 2016 to query Active Directory (AD) directly is my personal favorite Get & Transform feature. Excel 2010 and Excel 2013 users can download the free Microsoft Power Query plug-in for Excel.
Contents
- Example 1: Extract user information
- Selecting only columns that contain requested information
- Expand columns to choose individual attributes
- Filtering columns to show only attributes matching certain criteria
- Make the result more user-friendly
- Example 2: Extract computer information
- Selecting only columns that contain requested information
- Expand columns to choose individual attributes
- Filtering columns to show only attributes matching certain criteria
- Transform the existing column and remove the unneeded one
- Adding new columns to extend current possibilities
- Aggregate information with a pivot table
- Aggregate information with a pivot chart
- Author
- Recent Posts
Ruben is an infrastructure specialist with strong backround in Active Directory, PKI, and System Center Operations Manager. He automates in VBS, PowerShell and C#.
You can follow him on Twitter @Ruben8Z.
After years of creating Visual Basic and PowerShell scripts, I finally found a way to coach IT users to get AD data themselves. Excel stores all steps performed to extract, transform, and load the information as an M query within the workbook. You can also select an option to refresh the data when opening it or on a schedule.
See two examples below showing Get & Transform features and what you can do with the information.
Example 1: Extract user information
In the first example we extract the first name, last name, user ID, telephone number, division, city, last logon, and employment date. Furthermore, we set only enabled users from two cities as criteria. We also set the employment date as equal to the creation date of the user account.
Excel table showing specific up to date user information
To avoid high memory consumption and long durations, we split all the steps into smaller pieces.
Selecting only columns that contain requested information
Open a new Excel workbook and navigate to the Data ribbon. In the New Query drop-down menu, point to From Other Sources and select From Active Directory.
Selecting From Active Directory
In the next window, confirm or change the current logged-on domain by clicking OK.
In the Navigator window, type in user to specify the concrete object class and proceed by clicking Edit.
Navigate to the user object class
Within the Query Editor, first select displayName, user, organizationalPerson, person, top, and securityPrincipal. Then click on Remove Other Columns.
Reduce the query to required columns only
Finish the first query by giving it a name (such as qry_AD_Usr_Raw) and clicking Close & Load.
Confirm and close after naming the query
Expand columns to choose individual attributes
To proceed with the data based on the first query, qry_AD_Usr_Raw, create a Reference to it.
Referencing the first query
In the Query Editor, start with the user column and clear the defaults by unchecking (Select All Columns) and Use the original column name as prefix.
Clearing defaults in the column context window
Proceed by selecting the attributes givenName, lastLogonTimestamp, and userAccountControl.
Select the necessary attributes in the column context window
Proceed by filtering other columns as follows:
- L and company from organizationalPerson
- sn and telephoneNumber from person
- whencreated from top
- SamAccountName from securityPrincipal
Finalize the second query by giving it a proper name (such as qry_AD_Usr_Expand) and clicking Close & Load.
Filtering columns to show only attributes matching certain criteria
Based on qry_AD_user_Expand, create a reference. Within the Query Editor, start by limiting it to enabled users (User Account Control = 512).
Set a number filter on the userAccountControl column
In case city names are not consistently in proper case, ensure this by fixing the Format of the l column.
Capitalize Each Word to harmonize names
Use the check boxes to limit the cities to those of your interest, such as Suzhou and Shanghai.
Select the desired cities in the column context
If Excel does not interpret the logonTimeStamp correctly, fix it by changing it to the correct data type (Date/Time).
Correct data type for logonTimeStamp
You can arrange columns in a different order simply by dragging and dropping them.
Reorder columns via drag and drop
As we don’t need the displayName and userAccountControl columns, Remove them from the query.
Remove the DisplayName and userAccountControl columns
Sort the city in Ascending order by clicking the option in the l column.
Apply ascending sorting for the selected column
Omit records with empty telephone numbers by unchecking (null) values.
Deselecting (null) values for the telephoneNumber
Last, change the query name to qry_AD_Usr_ActiveChina, and load the result back into the workbook.
Make the result more user-friendly
Depending on the audience, you may need to make the results a bit easier to understand. To do so, create a reference for qry_AD_Usr_ActiveChina.
Perform the following transformations:
- Rename the columns by double-clicking givenName to First Name, sn to Last Name, l to City, company to Division, lastLogonTimestamp to Last Logon, and whenCreated to Employment Date.
- Change the Employment Date data type from Date/Time/Timezone to Date.
- Rename the query to qry_AD_Usr_ActiveChina_Friendly and click on Close & Load.
On Excel’s Design ribbon, choose the table styles to change from the defaults.
Choose table style to change defaults
As the last step, configure automatic data refreshing so it automatically updates information upon opening the workbook.
Refresh data when opening the file
Example 2: Extract computer information
In the second example, we extract computer object information. Queried attributes are cn, operatingSystem, operatingSystemServicePack, operatingSystemVersion, and whenCreated.
Set a filter to include only server operating systems (OSes).
Server names here derive from a name convention where the third to fifth characters stand for a site code.
For example: XZLINVM123 (LIN is the site code).
The query result aggregated in a pivot table will show the number of servers created each year aligned with the three-character site code they belong to.
Excel pivot table aggregating OS versions and computer object creation date
A diagram as a second aggregation will show the distribution of OS versions in use.
Excel pivot chart visualizing the distribution of OS versions
Selecting only columns that contain requested information
Open a new Excel workbook and navigate to the Data ribbon. In the New Query drop-down menu, point to From Other Sources and select From Active Directory.
In the next window, confirm or change the current logged-on domain by clicking OK.
Type or select the computer class in the Navigator window and continue by clicking Edit.
Select the computer class in the Navigator window
Keep the columns displayName, computer, and top. Rename the query (e.g., qry_AD_computer_raw) and confirm by clicking Close & Load.
Name the query properly and close it
Create a reference based on qry_AD_computer_raw.
Expand columns to choose individual attributes
In the Query Editor, expand the computer column. First uncheck (Select All Columns) and Use original column name as prefix.
Clear defaults in computer column properties
Stay in the computer column and select the attributes cn, operatingSystem, operatingSystemServicePack, and operatingSystemVersion. Confirm by clicking OK.
In the top column, limit the selection to the whenCreated attribute.
Rename the query to qry_AD_computer_filtered and click on Close & Load.
Create a new query referencing qry_AD_computer_filtered.
Filtering columns to show only attributes matching certain criteria
Back in the Query Editor, filter the operatingSystem column so it shows only server OSes. Use the Text Filter Contains… for this.
Set a text filter on the operatingSystem column
Type Server in the text box and confirm by clicking OK.
Specify and apply filter
Transform the existing column and remove the unneeded one
Stay in the current query and choose the Transform ribbon. Select the whenCreated column and pick Year in the Date drop-down menu.
Transform whenCreated date to Year
Remove the displayName column.
Adding new columns to extend current possibilities
Change to the Add Column ribbon and click on Custom Column. Type in Site as a new column name.
Add a custom column for site information
Double-click on the cn column and confirm by clicking OK.
Change to the Transform ribbon, select the Site column, and choose Range in the Extract drop-down menu.
Extract a Range from the Site column
Choose 2 for Starting Index and 3 for Number of Characters. Confirm by clicking OK.
Rename the query to qry_AD_computer_Servers and click on Close & Load.
Aggregate information with a pivot table
In Excel, change to the Insert ribbon, place the cursor in the table, and click on Pivot Table.
Insert a pivot table
Confirm the default settings in the Create PivotTable dialog.
In the pivot table field selector window, drag operatingSystem and Site into Rows, cn into Values, and whenCreated into the Columns section.
Drag columns into the field areas
On the Design ribbon, click on Subtotals and choose Do Not Show Subtotals.
To improve visibility, pick one of the PivotTable Styles and check Banded Rows and Banded Columns.
Check PivotTable Style Options and Styles
Aggregate information with a pivot chart
In Excel, change to the Insert ribbon, place the cursor in the table, and click on PivotChart.
Click PivotChart in the Insert ribbon
Confirm the default settings in the Create PivotChart dialog.
Pull cn into Values and operatingSystem into Axis.
Change the chart type by selecting it and clicking on Change Chart Type in the Design ribbon.
Change Chart Type of the selected bar diagram
Choose Pie (for example) and Confirm the window.
Содержание
- Карточка сотрудника Active Directory через Excel
- Знакомство с темой
- Об Active Directory
- Active directory from excel
- Об Active Directory
- Скрипты выгрузки всех пользователей из MS Active Directory (ITGC). Excel вместо PowerShell: запросы к AD и системные отчеты «на коленке
- Разминка: посмотрим, когда наши пользователи логинились
- Создаем адресную книгу, или что делать, когда корпоративный портал с AD не дружит
- Быстрый отчет по составу рабочих станций, без внедрения агентов и прочей подготовки
- Экспортируем пользователей AD при помощи PowerShell в отдельный файл
- Требования
- Задача 1: Сброс пароля пользователя
- Задача 2: Активировать и деактивировать учетные записи
- Задача 3: Разблокировать учетную запись пользователя
- Задача 4: Удалить учетную запись
- Задача 5: Поиск пустых групп
- Задача 6: Добавление пользователей в группу
- Задача 8: Найти устаревшие учетные записи компьютеров
- Задача 9: Деактивировать учетную запись компьютера
- Задача 10: Найти компьютеры по типу
- Синтаксис
- Параметры
- Замечания
- Примеры
Карточка сотрудника Active Directory через Excel
Знакомство с темой
Продолжим наше знакомство с Excel через призму сетевых технологий.
Наша сегодняшняя тема будет рассматривать возможность отображения каких либо данных из Active Directory в выходные формы Excel. Для чего же нам нужно? Самый простая задача которая требудет прочтения этой статьи.
Руководитель поставил задачу создать красивый отчет по всем сотрудникам которые работают в корпоративной сети ( под управлением Active Directory).
То есть на каждого сотрудника должна быть карточка формата А4, в которой будут заполнены ФИО, должность, комната, все его телефоны и так далее.
Карточка должна быть раскрашена в корпоративном цвете и определенной шапкой в заголовке.
Так как дураков нет, то поручили её вам, как администратору сети 🙂 ( у нас именно так.. все нерешаемые вопросы в компании, которые не требуют административного решения, стекаются в отдел ИТ)
Какие же есть варианты решения. В большинстве, вариант простой — делается экспорт всех пользователей домена в csv формат, а дальше разбирается и на основе экспортированных данных строится та карточка сотрудника компании которая необходима.
Есть немного другой принцип, он отличается тем что получаемые данные в карточке всегда актуальны, а не только на дату экспортированного файла.
Мы рассматривали POST запрос через Excel пойдем по этому же пути, с небольшими расширениями и уточнениями.
Не могу не воспользоваться что бы в очередной раз сказать свое «фи» компании Микрософт, по поводу отсутствия встроенного парсера JSON в Excel.
Об Active Directory
Мы не будем рассматривать общуюю концепцию Active Directory, откуда появилась и прочее. Скажем лишь одно, что эта она из реализаций протокола LDAP, взятой компанией Microsoft на вооружение при создании операционной системой.
А раз так то, то все что применимо для протокола LDAP применимо и для работы с AD.
Если мы возьмем бесплатную программу для просмотра и редактирования LDAP аттрибутов (Apache Directory Studio) и подключимся к контроллеру домена, то нам откроется огромный мир аттрибутов и их значений, которые обычно скрыты стандартными программами, и недоступны для пользователей и администраторов.
Вот только лишь часть тех аттрибутов, которые существуют в моей сети у каждого пользователя.
Источник
Active directory from excel
Продолжим наше знакомство с Excel через призму сетевых технологий.
Наша сегодняшняя тема будет рассматривать возможность отображения каких либо данных из Active Directory в выходные формы Excel. Для чего же нам нужно? Самый простая задача которая требудет прочтения этой статьи.
Руководитель поставил задачу создать красивый отчет по всем сотрудникам которые работают в корпоративной сети ( под управлением Active Directory).
То есть на каждого сотрудника должна быть карточка формата А4, в которой будут заполнены ФИО, должность, комната, все его телефоны и так далее.
Карточка должна быть раскрашена в корпоративном цвете и определенной шапкой в заголовке.
Так как дураков нет, то поручили её вам, как администратору сети 🙂 ( у нас именно так.. все нерешаемые вопросы в компании, которые не требуют административного решения, стекаются в отдел ИТ)
Какие же есть варианты решения. В большинстве, вариант простой — делается экспорт всех пользователей домена в csv формат, а дальше разбирается и на основе экспортированных данных строится та карточка сотрудника компании которая необходима.
Есть немного другой принцип, он отличается тем что получаемые данные в карточке всегда актуальны, а не только на дату экспортированного файла.
Мы рассматривали POST запрос через Excel пойдем по этому же пути, с небольшими расширениями и уточнениями.
Не могу не воспользоваться что бы в очередной раз сказать свое «фи» компании Микрософт, по поводу отсутствия встроенного парсера JSON в Excel.
Об Active Directory
Мы не будем рассматривать общуюю концепцию Active Directory, откуда появилась и прочее. Скажем лишь одно, что эта она из реализаций протокола LDAP, взятой компанией Microsoft на вооружение при создании операционной системой.
А раз так то, то все что применимо для протокола LDAP применимо и для работы с AD.
Если мы возьмем бесплатную программу для просмотра и редактирования LDAP аттрибутов (Apache Directory Studio) и подключимся к контроллеру домена, то нам откроется огромный мир аттрибутов и их значений, которые обычно скрыты стандартными программами, и недоступны для пользователей и администраторов.
Вот только лишь часть тех аттрибутов, которые существуют в моей сети у каждого пользователя.
Источник
Скрипты выгрузки всех пользователей из MS Active Directory (ITGC). Excel вместо PowerShell: запросы к AD и системные отчеты «на коленке
Оставьте комментарий 6,950
В комментариях к предыдущей статье вспомнили про учет в Excel вместо 1С. Что ж, проверим, насколько вы знаете Excel. Сегодня я покажу, как получать данные из Active Directory и работать с ними без макросов и PowerShell — только штатными механизмами Office. Например, можно запросто получить аналитику по использованию операционных систем в организации, если у вас еще нет чего-либо вроде Microsoft SCOM. Ну, или просто размяться и отвлечься от скриптов.
Конечно, получить данные как в примерах ниже можно буквально одной строчкой на PowerShell. Но, во-первых, PowerShell — это слишком скучно, а во-вторых, Excel умеет динамически обновлять данные ― получившиеся документы можно опубликовать в сети и забыть про их актуализацию.
Для работы с данными я буду использовать механизм Power Query . Для офиса 2010 и 2013 придется устанавливать плагин , в Microsoft Office 2016 этот модуль уже встроен. К сожалению, стандартной редакции нам не хватит, понадобится Professional.
Сам механизм предназначен для получения и обработки данных из самых разных источников ― от старого ODBC и текстовых файлов, до Exchange, Oracle и Facebook. Подробнее о механизме и встроенном скриптовом языке «M» уже писали на Хабре , я же разберу пару примеров использования Power Query для получения данных из Active Directory.
Разминка: посмотрим, когда наши пользователи логинились
Сам запрос к базе домена создается на вкладке «Данные ― Новый запрос ― Из других источников ― Из Active Directory».
Указываем источник данных.
Понадобится выбрать название домена, указать необходимые данные для подключения. Далее выберем тип объектов, в этом примере ― user . Справа в окне предпросмотра запрос уже выполняется, показывая предварительный вид данных.
Подготавливаем запрос, любуемся предпросмотром.
Предварительно запрос стоит подготовить, нажав кнопку «изменить» и выбрав нужные колонки. По сути эти колонки ― это классы Каждый из них содержит набор определенных атрибутов объекта Active Directory, кроме основной колонки displayName , которая сама является атрибутом. Я остановлюсь на классах user , person , top и securityPrincipal . Теперь необходимо выбрать нужные атрибуты из каждого класса с помощью «расширения» ― значок с двумя стрелочками у заголовка колонки:
- класс user расширим, выбрав lastLogonTimestamp и userAccountControl ;
- в person выберем telephoneNumber ;
- в top ― whenCreated ;
- и в securityPrincipal ― SamAccountName .
Расширяем запрос.
Теперь настроим фильтр: в частности, чтобы не получить заблокированные аккаунты, нужно чтобы атрибут userAccountControl имел значение 512 или 66048. Фильтр может быть другой в вашем окружении. Подробнее про атрибут можно прочитать в документации Microsoft .
Применяем фильтр .
Иногда Excel неверно определяет формат данных, особенно значения атрибута lastLogonTimestamp. Если вдруг постигла такая беда, на вкладке «Преобразовать» можно выставить верный формат.
Теперь столбец userAccountControl стоит удалить ― в отображении он не нужен совершенно. И нажимаем «Загрузить и закрыть».
Получилась табличка, которую осталось совсем немного довести до ума. Например, переименовать столбцы в что-то удобочитаемое. И настроить автоматическое обновление данных.
Автоматическое обновление при открытии таблицы или по таймауту настраивается во вкладке «Данные» в «Свойствах».
Настройка обновления данных.
После того, как настройка обновления будет завершена, можно смело отдавать таблицу сотрудникам отдела персонала или службе безопасности ― пусть знают, кто и когда входил в систему.
Код запроса на языке «М» под спойлером.
let Источник = ActiveDirectory.Domains(«domain.ru»), domain.ru = Источник<>[#»Object Categories»], user1 = domain.ru<>, #»Удаленные столбцы» = Table.RemoveColumns(user1,<«organizationalPerson», «shadowAccount», «posixAccount», «msExchOmaUser», «msExchBaseClass», «msExchIMRecipient», «msExchCertificateInformation», «msExchMultiMediaUser», «msExchMailStorage», «msExchCustomAttributes», «mailRecipient», «distinguishedName»>), #»Развернутый элемент securityPrincipal» = Table.ExpandRecordColumn(#»Удаленные столбцы», «securityPrincipal», <«sAMAccountName»>, <«sAMAccountName»>), #»Развернутый элемент top» = Table.ExpandRecordColumn(#»Развернутый элемент securityPrincipal», «top», <«whenCreated»>, <«whenCreated»>), #»Развернутый элемент person» = Table.ExpandRecordColumn(#»Развернутый элемент top», «person», <«telephoneNumber»>, <«telephoneNumber»>), #»Развернутый элемент user» = Table.ExpandRecordColumn(#»Развернутый элемент person», «user», <«lastLogonTimestamp», «userAccountControl»>, <«lastLogonTimestamp», «userAccountControl»>), #»Строки с применным фильтром» = Table.SelectRows(#»Развернутый элемент user», each ( = 512 or = 66048)), #»Измененный тип» = Table.TransformColumnTypes(#»Строки с примененным фильтром»,<<«lastLogonTimestamp», type datetime>>), #»Удаленные столбцы1″ = Table.RemoveColumns(#»Измененный тип»,<«userAccountControl»>) in #»Удаленные столбцы1″
Создаем адресную книгу, или что делать, когда корпоративный портал с AD не дружит
Другой вариант использования Excel в связке с Active Directory ― это формирование адресной книги, исходя из данных AD. Понятно, что адресная книга получится актуальной, только если в домене порядок.
Создадим запрос по объекту user , развернем класс user в mail , а класс person в telephoneNumber . Удалим все столбцы, кроме distinguishedName ― структура домена повторяет структуру предприятия, поэтому названия Organizational Units соответствуют названиям подразделений. Аналогично в качестве основы названий подразделений можно использовать и группы безопасности.
Теперь из строки CN=Имя Пользователя, OU=Отдел Бухгалтерии, OU=Подразделения, DC=domain, DC=ru нужно извлечь непосредственно название отдела. Проще всего это сделать с использованием разделителей на вкладке «Преобразование».
Извлекаем текст.
В качестве разделителей я использую OU= и ,OU= . В принципе, достаточно и запятой, но я перестраховываюсь.
Вводим разделители.
Теперь с помощью фильтра можно отсечь ненужные OU , вроде заблокированных пользователей и Builtin , настроить сортировку и загрузить данные в таблицу.
Вид итоговой таблицы.
Быстрый отчет по составу рабочих станций, без внедрения агентов и прочей подготовки
Теперь попробуем создать полезную таблицу, получив данные по компьютерам. Сделаем отчет по используемым компанией операционным системам: для этого создадим запрос, но в навигаторе на этот раз выберем computer .
Делаем запрос по объекту computer.
Оставим классы-колонки computer и top и расширим их:
- класс computer расширим, выбрав cn , operatingSystem , operatingSystemServicePack и operatingSystemVersion ;
- в классе top выберем whenCreated .
Расширенный запрос.
При желании можно сделать отчет только по серверным операционным системам. Например, применить фильтр по атрибуту operatingSystem или operatingSystemVersion. Я не буду этого делать, но поправлю отображение времени создания ― мне интересен только год. Для этого на вкладке «Преобразование» выберем нужную нам колонку и в меню «Дата» выберем «Год».
Извлекаем год из времени ввода компьютера в домен.
Теперь останется удалить столбец displayname за ненадобностью и загрузить результат. Данные готовы. Теперь можно работать с ними, как с обычной таблицей. Для начала сделаем сводную таблицу на вкладке «Вставка» ― «Сводная таблица». Согласимся с выбором источника данных и настроим ее поля.
Настройки полей сводной таблицы.
Теперь остается настроить по вкусу дизайн и любоваться итогом:
Сводная таблица по компьютерам в AD.
При желании можно добавить сводный график, также на вкладке «Вставка». В «Категории» (или в «Ряды», по вкусу) добавим operatingSystem , в данные ― cn . На вкладке «Конструктор» можно выбрать тип диаграммы по душе, я предпочел круговую.
Круговая диаграмма.
Теперь наглядно видно, что, несмотря на идущее обновление, общее количество рабочих станций с Windows XP и серверов с Windows 2003 довольно велико. И есть к чему стремиться.
Код запроса под спойлером.
let Источник = ActiveDirectory.Domains(«domain.ru»), domain.ru = Источник<>[#»Object Categories»], computer1 = domain.ru<>, #»Удаленные столбцы» = Table.RemoveColumns(computer1,<«user», «organizationalPerson», «person»>), #»Другие удаленные столбцы» = Table.SelectColumns(#»Удаленные столбцы»,<«displayName», «computer», «top»>), #»Развернутый элемент computer» = Table.ExpandRecordColumn(#»Другие удаленные столбцы», «computer», <«cn», «operatingSystem», «operatingSystemServicePack», «operatingSystemVersion»>, <«cn», «operatingSystem», «operatingSystemServicePack», «operatingSystemVersion»>), #»Развернутый элемент top» = Table.ExpandRecordColumn(#»Развернутый элемент computer», «top», <«whenCreated»>, <«whenCreated»>), #»Извлеченный год» = Table.TransformColumns(#»Развернутый элемент top»,<<«whenCreated», Date.Year>>), #»Удаленные столбцы1″ = Table.RemoveColumns(#»Извлеченный год»,<«displayName»>) in #»Удаленные столбцы1″
Сегодня мы попробуем выгрузить список все пользователей в отдельный файл из Active Directory. Главным помощником в этом деле у нас будет PowerShell. Всё дело в том, что Microsoft изначально планировала командную консоль PowerShell как основной инструмент для управления серверными компонентами Windows. И на сегодняшний день, когда мы имеем уже версию 2.0, по большому счету, это так и есть.
Ещё в недалеком прошлом, чтобы хоть как-то взаимодействовать с AD, администраторам необходимо было иметь в своем распоряжении либо утилиту dsquery, либо разного рода скрипты или утилиты. Сегодня же начиная с версии Windows Server 2008 R2, мы можем работать с AD через PowerShell. С приходом PowerShell 2.0 для взаимодействия с Active Directory используется специальный модуль Active Directory Module for Windows PowerShell , который содержит в себе необходимый список командлетов. Для наших задач мы будем использовать команду Get-ADUser .
Итак, в зависимости под управлением какой операционной системы мы будем запускать консоль PowerShell, нам необходимо будет выполнить “подготовительные действия”.
1) Если мы работаем из-под Windows Server до версии 2012 , то нам необходимо выполнить команду:
- Import-Module activedirectory – команда для импортирования модуля в AD
Для версий операционной системы от 2012 и выше, данный модуль уже включен по умолчанию.
2) Если мы работаем из под любой клиентской Windows, то на ней должен быть установлен пакет удаленного администрирования RSAT, с проинсталлированным компонентом Active Directory Module for Windows PowerShell.
Стоит отметить, что командлет Get-ADUser рекомендуется выполнять при количестве выгружаемых данных до 1000 пользователей.
Для начала вызовем справку для команды Get-ADUser. В результате Вы получите все необходимые команды для дальнейшего администрирования.
- help Get-ADUser – команда для вызова справки
Чтобы получить в окне PowerShell список всех пользователей со всеми свойствами, необходимо выполнить следующую команду:
- Get-ADUser -filter * – экспорт списка пользователей AD
Данная выгрузка не совсем информативна и не умещает в окне всю необходимую информацию. Поэтому попробуем сузить поиск и выведем свойства конкретного пользователя с именем user1:
- Get-ADUser -identity user1 -properties * – экспорт свойств определенного пользователя
А теперь попробуем экспортировать список всех пользователей с их свойствами во внешний txt или csv файл:
- Get-ADUser -filter * -properties * | Export-csv -path c:users.csv -encoding Unicode – экспорт пользователей в отдельный файл
Хотелось бы обратить отдельное внимание на ключ -encoding Unicode . Он служит для того, чтобы русская кириллица, после экспорта из AD, могла корректно отображаться в выгруженном файле. Например, через Microsoft Excel мы увидим вопросительные знаки вместо русских букв.
При просмотре файла данные экспортируются в одну строку и тем самым не пригодны для чтения. Чтобы это изменить, нам необходимо выполнить следующие действия:
Посвященную использования PowerShell для администрирования AD. В качестве исходного пункта автор решил взять 10 типичных задач администрирования AD и рассмотреть то, как их можно упростить, используя PowerShell:
- Сбросить пароль пользователя
- Активировать и деактивировать учетные записи
- Разблокировать учетную запись пользователя
- Удалить учетную запись
- Найти пустые группы
- Добавить пользователей в группу
- Вывести список членов группы
- Найти устаревшие учетные записи компьютеров
- Деактивировать учетную запись компьютера
- Найти компьютеры по типу
Помимо этого автор ведет блог (по PowerShell, конечно), рекомендуем заглянуть — jdhitsolutions.com/blog . А самое актуальное Вы можете получить из его твиттера twitter.com/jeffhicks .
Итак, ниже приводим перевод статьи “Top 10 Active Directory Tasks Solved with PowerShell”.
Управление Active Directory (AD) с помощью Windows PowerShell – это проще, чем Вы думаете, и я хочу доказать Вам это. Вы можете просто взять приведенные ниже скрипты и с их помощью решить ряд задач по управлению AD.
Требования
Чтобы использовать PowerShell для управления AD, нужно соблюсти несколько требований. Я собираюсь продемонстрировать, как командлеты для AD работают на примере компьютера на Windows 7.
Чтобы использовать командлеты, контроллер домена у Вас должен быть уровня Windows Server 2008 R2, или же Вы можете скачать и установить Active Directory Management Gateway Service на наследуемых контроллерах домена (legacy DCs). Внимательно прочитайте документацию перед установкой; требуется перезагрузка КД.
На стороне клиента, скачайте и установите (RSAT) либо для Windows 7 , либо для Windows 8 . В Windows 7, Вам необходимо будет открыть в Панели управления (Control Panel) раздел Программы (Programs) и выбрать Включить или выключить функции Windows (Turn Windows Features On or Off) . Найдите Remote Server Administration Tools и раскройте раздел Role Administration Tools . Выберите подходящие пункты для AD DS and AD LDS Tools, особенно обратите внимание на то, что должен быть выбран пункт Active Directory Module for Windows PowerShell , как показано на рисунке 1. (В Windows 8 все инструменты выбраны по умолчанию). Теперь мы готовы работать.
Рис.1 Включение AD DS и AD LDS Tools
Я вошел в систему под учетной записью с правами доменного администратора. Большинство командлетов, которые я буду показывать, позволят Вам уточнить альтернативные полномочия (credentials). В любом случае я рекомендую прочитать справку (Get-Help ) и примеры, которые я буду демонстрировать ниже.
Начните сессию PowerShell и импортируйте модуль:
PS C:> Import-Module ActiveDirectory
В результате импорта создается новый PSDrive, но мы не будем использовать его. Однако, Вы можете посмотреть, какие команды имеются в импортированном модуле.
PS C:> get-command -module ActiveDirectory
Прелесть этих команд в том, что если я могу использовать команду для одного объекта AD, то ее можно использовать для 10, 100 и даже 1000. Посмотрим, как некоторые из этих командлетов работают.
Задача 1: Сброс пароля пользователя
Давайте начнем с типичной задачи: сброс пароля пользователя. Сделать это легко и просто можно через командлет Set-ADAccountPassword . Сложная часть заключается в том, что новый пароль должен быть уточнен как защищенная строка: фрагмент текста, который зашифрован и хранится в памяти на протяжении PowerShell сессии. Во-первых, создадим переменную с новым паролем:
PS C:> $new=Read-Host «Enter the new password» -AsSecureString
Затем, введем новый пароль:
Теперь мы можем извлечь учетную запись (использование samAccountname – лучший вариант) и задать новый пароль. Вот пример для пользователя Jack Frost:
PS C:> Set-ADAccountPassword jfrost -NewPassword $new
К сожалению, в случае с этим командлетом наблюдается баг: -Passthru , -Whatif , и –Confirm не работают. Если Вы предпочитаете короткий путь, попробуйте следующее:
PS C:> Set-ADAccountPassword jfrost -NewPassword (ConvertTo-SecureString -AsPlainText -String «[email protected]» -force)
В итоге мне необходимо, чтобы Jack сменил пароль при следующем входе в систему, и я модифицирую учетную запись используя Set-ADUser .
PS C:> Set-ADUser jfrost -ChangePasswordAtLogon $True
Результаты выполнения командлета не пишутся в консоль. Если это необходимо сделать, используйте –True . Но я могу узнать, успешно или нет прошла операция, произведя извлечения имени пользователя с помощью командлета Get-ADUser и уточнив свойство PasswordExpired , как показано на рисунке 2.
Рис. 2. Результаты работы командлета Get-ADUser Cmdlet со свойством PasswordExpired
Итог: сбросить пароль пользователя с помощью PowerShell совсем не сложно. Признаюсь, что сбросить пароль также просто через оснастку Active Directory Users and Computers консоли Microsoft Management Console (MMC). Но использование PowerShell подходит в том случае, если Вам необходимо делегировать задачу, Вы не хотите разворачивать вышеупомянутую оснастку или сбрасываете пароль в ходе большого автоматизированного ИТ-процесса.
Задача 2: Активировать и деактивировать учетные записи
А теперь давайте деактивируем учетную запись. Продолжим работать с Jack Frost. Этот код использует параметр –Whatif , который Вы можете встретить в других комадлетах, которые осуществляют изменения, чтобы проверить мою команду не запуская ее.
PS C:> Disable-ADAccount jfrost -whatif What if: Performing operation «Set» on Target «CN=Jack Frost, OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local».
А теперь деактивируем по-настоящему:
PS C:> Disable-ADAccount jfrost
А когда настанет время активировать учетную запись, какой командлет нам поможет?
PS C:> Enable-ADAccount jfrost
Эти командлеты могут быть использованы в конвейерном выражении (pipelined expression), позволяя активировать или деактивировать столько учетных записей, сколько душе угодно. Например, этот код деактивирует все учетные записи в отделе продаж (Sales)
PS C:> get-aduser -filter «department -eq «sales»» | disable-adaccount
Конечно, писать фильтр для Get-ADUser довольно-таки сложно, но именно здесь использование параметра –Whatif вместе с командлетом Disable-ADAccount приходит на помощь.
Задача 3: Разблокировать учетную запись пользователя
Рассмотрим ситуацию, когда Jack заблокировал свою учетную запись, пытаясь ввести новый пароль. Вмест того, чтобы пытаться найти его учетную запись через GUI, процедуру разблокировки можно осуществить с помощью простой команды.
PS C:> Unlock-ADAccount jfrost
Командлет также поддерживает параметры -Whatif и -Confirm .
Задача 4: Удалить учетную запись
Неважно, сколько пользователей Вы удаляете, — это просто осуществить с помощью командлета Remove-ADUser . Мне не хочется удалять Jack Frost, но если бы я захотел, то использовал бы такой код:
PS C:> Remove-ADUser jfrost -whatif What if: Performing operation «Remove» on Target «CN=Jack Frost,OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local».
Или я могу ввести несколько пользователей и удалить их с помощью одной простой команды:
PS C:> get-aduser -filter «enabled -eq «false»» -property WhenChanged -SearchBase «OU=Employees, DC=Globomantics,DC=Local» | where <$_.WhenChanged -le (Get-Date).AddDays(-180)>| Remove-ADuser -whatif
С помощью этой команды будут найдены и удалены все деактивованные учетные записи подразделения (OU) Employees, которые не менялись в течение 180 и более дней.
Задача 5: Поиск пустых групп
Управление группами – занятие бесконечное и неблагодарное. Существует множество способов найти пустые группы. Некоторые выражения могут работать лучше, чем другие, в зависимости от Вашей организации. Код, приведенный ниже, позволит найти все группы в домене, включая встроенные (built-in).
PS C:> get-adgroup -filter * | where <-Not ($_ | get-adgroupmember)>| Select Name
Если у Вас есть группы с сотнями членов, тогда использование этой команды может занять много времени; Get-ADGroupMember проверяет каждую группу. Если Вы можете ограничить или настроить, это будет лучше.
Вот еще один подход:
PS C:> get-adgroup -filter «members -notlike «*» -AND GroupScope -eq «Universal»» -SearchBase «OU=Groups,OU=Employees,DC=Globomantics, DC=local» | Select Name,Group*
Эта команда находит все универсальные группы (Universal groups), которые не имеют членство в OU Groups и выводит некоторые из свойств. Результат приведен на рисунке 3.
Рис. 3. Поиск и фильтрация универсальных групп
Задача 6: Добавление пользователей в группу
Давайте добавим Jack Frost в группу Chicago IT:
PS C:> add-adgroupmember «chicago IT» -Members jfrost
Да, все так просто. Вы можете также легко добавлять сотни пользователей в группы, хотя, на мой взгляд, это слегка неудобно:
PS C:> Add-ADGroupMember «Chicago Employees» -member (get-aduser -filter «city -eq «Chicago»»)
Я использовал вводное конвейерное выражение (parenthetical pipelined expression), чтобы найти всех пользователей, у которых имеется свойство City в Chicago. Код в скобках выполняется, и полученные объекты передаются в параметр –Member. Каждый пользовательский объект добавляется в группу Chicago Employees. Неважно, имеем ли мы дело с 5 или 5000 пользователей, обновление членства в группах занимает всего несколько секунд. Это выражение может также быть написано с использованием ForEach-Object , что может быть удобнее:
PS C:> Get-ADUser -filter «city -eq «Chicago»» | foreach
Задача 7: Выводим список членов группы
Вы возможно захотите узнать, кто находится в определенной группе. Например, Вы должны периодически узнавать, кто входит в группу доменных администраторов (Domain Admins):
PS C:> Get-ADGroupMember «Domain Admins»
На рисунке 4 приведен результат.
Рис. 4. Члены группы Domain Admins
Командлет выводит объект AD для каждого члена группы. А что делать с вложенными группами? Моя группа Chicago All Users является коллекцией вложенных групп. Чтобы получить список всех учетных записей, я всего лишь должен использовать параметр –Recursive .
PS C:> Get-ADGroupMember «Chicago All Users» -Recursive | Select DistinguishedName
Если Вы хотите пойти другим путем – найти, в каких группах пользователь состоит, — используйте свойство пользователя MemberOf :
PS C:> get-aduser jfrost -property Memberof | Select -ExpandProperty memberOf CN=NewTest,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago Test,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago IT,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago Sales Users,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local
Я использовал параметр -ExpandProperty , чтобы вывести имена MemberOf как строки.
Задача 8: Найти устаревшие учетные записи компьютеров
Мне часто задают этот вопрос: “Как найти устаревшие учетные записи компьютеров?”. И я всегда отвечаю: “А что для вас является устаревшим?” Компании по-разному определяют то, когда учетная запись компьютера (или пользователя, неважно), признается устаревшей и не подлежит дальнейшему использованию. Что касается меня, то я обращаю внимание на те учетные записи, у которых пароли не менялись в течение определенного периода времени. Этот период для меня составляет 90 дней – если компьютер не сменил пароль вместе с доменом за этот период, скорее всего он находится оффлайн и является устаревшим. Используется командлет Get-ADComputer :
PS C:> get-adcomputer -filter «Passwordlastset -lt «1/1/2012″» -properties *| Select name,passwordlastset
Фильтр замечательно работает с жестким значением, но этот код будет обновляться для всех учетных записей компьютеров, которые не изменили своих паролей с 1 января 2012 года. Результаты приведены на рисунке 5.
Рис. 5. Находим устаревшие учетные записи компьютеров
Другой вариант: предположим, вы хотя бы на функциональном уровне домена Windows 2003. Поставьте фильтр по свойству LastLogontimeStamp . Это значение – число 100 наносекундных интервалов с 1 января, 1601 года, и храниться в GMT, поэтому работа с этим значением слегка сложно:
PS C:> get-adcomputer -filter «LastlogonTimestamp -gt 0» -properties * | select name,lastlogontimestamp, @>,passwordlastset | Sort LastLogonTimeStamp
Рис. 6. Конвертируем значение LastLogonTimeStamp в привычный формат
Чтобы создать фильтр, мне необходимо конвертировать дату, например, 1 января 2012, в корректный формат. Конвертация осуществляется в FileTime:
PS C:> $cutoff=(Get-Date «1/1/2012»).ToFileTime() PS C:> $cutoff 129698676000000000
Теперь я могу использовать эту переменную в фильтре для Get-ADComputer :
PS C:> Get-ADComputer -Filter «(lastlogontimestamp -lt $cutoff) -or (lastlogontimestamp -notlike «*»)» -property * | Select Name,LastlogonTimestamp,PasswordLastSet
Приведённый код находит те же самые компьютеры, что были показаны на рисунке 5.
Задача 9: Деактивировать учетную запись компьютера
Возможно, когда Вы найдете неактивные или устаревшие учетные записи, Вы захотите деактировать их. Сделать это довольно просто. Мы будем использовать тот же командлет, что использовали в работе с учетными записями пользователей. Вы можете уточнить его, использовав samAccountname учетной записи.
PS C:> Disable-ADAccount -Identity «chi-srv01$» -whatif What if: Performing operation «Set» on Target «CN=CHI-SRV01, CN=Computers,DC=GLOBOMANTICS,DC=local».
Или же использовав конвейерное выражение:
PS C:> get-adcomputer «chi-srv01» | Disable-ADAccount
Я также могу использовать мой код, чтобы найти устаревшие учетные записи и все их деактивировать:
PS C:> get-adcomputer -filter «Passwordlastset -lt «1/1/2012″» -properties *| Disable-ADAccount
Задача 10: Найти компьютеры по типу
Мне также часто задают вопрос, как найти учетные записи компьютеров по типу, например, серверы или рабочие станции. С вашей стороны это требует определенной креативности. В AD нет ничего такого, чтобы отличало сервер от клиента, разве что ОС. Если Ваш компьютер работает под Windows Server 2008, придется слегка сделать несколько дополнительных действий.
Для начала необходимо получить список ОС, а затем осуществляем фильтрацию учетных записей по имеющимся ОС.
PS C:> Get-ADComputer -Filter * -Properties OperatingSystem | Select OperatingSystem -unique | Sort OperatingSystem
Результаты показаны на рисунке 7.
Рис. 7. Извлечение списка ОС
Я хочу найти все компьютеры, на которых стоит серверная ОС:
PS C:> Get-ADComputer -Filter «OperatingSystem -like «*Server*»» -properties OperatingSystem,OperatingSystem ServicePack | Select Name,Op* | format-list
Результаты приведены на рисунке 8.
Как и другими командлетами AD Get, Вы можете настроить поисковые параметры и ограничить запрос отдельными OU, если это необходимо. Все выражения, которые я показал, могут быть интегрированы в большие PowerShell выражения. Например, Вы можете сортировать, группировать, применять фильтры, экспортировать в CSV или создавать и отправлять на почту HTML отчеты – и все это из PowerShell! При этом Вам не придется писать ни единого скрипа.
Вот Вам бонус: отчет о возрасте пароля пользователя (user password-age report), сохраненный в HTML файле:
PS C:> Get-ADUser -Filter «Enabled -eq «True» -AND PasswordNeverExpires -eq «False»» -Properties PasswordLastSet,PasswordNeverExpires,PasswordExpired | Select DistinguishedName,Name,pass*,@> |sort PasswordAge -Descending | ConvertTo-Html -Title «Password Age Report» | Out-File c:Workpwage.htm
Хотя это выражение может выглядеть слегка пугающим, при минимальном знании PowerShell им легко воспользоваться. И остается лишь последний совет: как определить кастомное свойство под названием PasswordAge . Значение представляет собой промежуток между сегодняшним днем и свойством PasswordLastSet. Затем я сортирую результаты для моего нового свойства. На рисунке 9 показан выход для моего небольшого тестового домена.
Upd:
В посте приведен перевод статьи на портале
Не секрет, что начиная с первой версии PowerShell, Microsoft пытается сделать из него основной инструмент администрирования Windows. И во многом это получается! Сегодня на простых примерах, мы покажем возможности PowerShell, которые можно использовать для получения различной информации о пользователях Active Directory и их атрибутах.
Примечание . Ранее для получения информации об атрибутах учетных записей пользователей AD приходилось использовать различные инструменты: консоль ADUC (в том числе ), утилиту и т.п. Выбор инструмента обычно основывался на поставленной задачи и способностях администратора в программировании.
В PowerShell 2.0 появился специальный модуль для работы с Active Directory — (представлен в Windows Server 2008 R2), командлеты которого позволяют выполнять различные манипуляции с объектами каталога AD. Для получения информации о пользователях домена Active Directory и их свойствах предназначен командлет Get-ADUser . С помощью командлета Get-ADUser можно получить значение любого атрибута существующей учетной записи пользователя в AD. Кроме того, можно указывать различные критерии выборки и формировать списки пользователей домена и их атрибутов.
В этом примере мы покажем, как с помощью командлета PowerShell Get-ADUser получить информацию, о том, когда последний раз менялся пароля пользователя и когда истекает срок его действия.
Запускаем окно Powershll с правами администратора и импортируем модуль Active Directory командой:
Совет . В Windows Server 2012 и выше этот пункт можно пропустить, так как модуль PowerShell Active Directory подключен по-умолчанию.
В клиентских ОС (в той же Windows 10) для работы коммандера Get-AdUser нужно установить соответствующую версию RSAT и включить в панели управления компонент Active Directory Module for Windows PowerShell (Remote Server Administration Tools -> Role Administration Tools -> AD DS and AD LDS Tools -> AD DS Tools).
Полный список всех аргументов командлета Get-ADUser можно получить так:
Чтобы вывести список всех учетных записей домена, выполним команду:
Формат возвращаемого списка не очень удобен для использования, выводится только некоторые основные 10 из более 120 атрибутов и свойств учетных записей пользователей (DN, SamAccountName, Name, UPN и т.д) кроме того, мы видим, что информация о времени последней смены пароля отсутствует.
Чтобы вывести полную информации обо всех доступных атрибутах пользователя tuser, выполним команду:
Get-ADUser -identity tuser -properties *
Итак, мы видим полный список атрибутов пользователя AD и их значений, ассоциированных с учетной записью пользователя. Далее мы перейдем к форматированию вывода командлета Get-ADUser, так, чтобы отображались нужные нам поля. Нас интересуют атрибуты:
- PasswordExpired
- PasswordLastSet
- PasswordNeverExpires
Get-ADUser tuser -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires
Теперь в данных пользователя есть информация о дате смены пароля и времени, когда он просрочится. Представим информацию в более удобном табличном виде:
Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires
Чтобы вывести данные пользователей из определенной OU, воспользуемся параметром SearchBase :
Get-ADUser -SearchBase ‘OU=Moscow,DC=winitpro,DC=loc’ -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires
Результат выполнения команды можно выгрузить в текстовый файл:
Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires > C:tempusers.txt
Или в CSV, который в дальнейшем будет удобно экспортировать в Excel (дополнительно с помощью sort-object отсортируем таблицу по столбцу PasswordLastSet , а также добавим условие where – имя пользователя должно содержать строку «Dmitry»):
Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | where <$_.name –like “*Dmitry*”>| sort-object PasswordLastSet | select-object Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires | Export-csv -path c:tempuser-password-expires-2015.csv
Таким образом, можно построить таблицу с любыми необходимыми атрибутами пользователей Active Directory.
Для получения списка учетных записей пользователей AD по определенному признаку используется параметр –Filter. В качестве аргументов этого параметра можно указать значение определённых атрибутов пользователей Active Directory, в результате командлет Get-ADUser будет применятся для пользователей, которые попадают под критерии фильтра.
Вывод пользователей AD, имя которых начинается с Roman:
Список всех активных (не заблокированных) учетных записей в AD:
Get-ADUser -Filter | Select-Object SamAccountName,Name,Surname,GivenName | Format-Table
Список учетных записей с истекшим сроком действия пароля:
Get-ADUser -filter -properties passwordExpired | where
Список активных учеток с почтовыми адресами:
Get-ADUser -Filter <(mail -ne «null») -and (Enabled -eq «true»)>-Properties Surname,GivenName,mail | Select-Object Name,Surname,GivenName,mail | Format-Table
Задача: для списка учетных записей, которые хранятся в текстовом файле (по одной учетке в строке) нужно получить телефон пользователя в AD и выгрузить информацию в текстовый csv файл (можно легко импортировать в Esxel).
Import-Csv c:psusernsme_list.csv | ForEach
Следующий пример позволяет выгрузить адресную книгу предприятия в виде csv файла, который в дальнейшем можно импортировать в Outlook или Mozilla Thunderbird:
Get-ADUser -Filter <(mail -ne «null») -and (Enabled -eq «true»)>-Properties Surname,GivenName,mail | Select-Object Name,Surname,GivenName,mail | Export-Csv -NoTypeInformation -Encoding utf8 -delimiter «,» $env:tempmail_list.csv
Пользователи, которые не меняли свой пароль в течении последних 90 дней:
$90_Days = (Get-Date).adddays(-90) Get-ADUser -filter
$user = Get-ADUser winadmin -Properties thumbnailPhoto $user.thumbnailPhoto | Set-Content winadmin.jpg -Encoding byte
Список групп, в которых состоит учетная запись пользователя
Get-AdUser winadmin -Properties memberof | Select memberof -expandproperty memberof
Используется для создания, изменения и удаления объектов каталога. Пользователь может также использовать команду ldifde для расширения схемы, экспорта сведений Active Directory о пользователе и группе в другие приложения или службы, а также для заполнения службы ADAM (Active Directory Application Mode) данными из других служб каталогов.
Синтаксис
Параметры
-i Определяет режим импорта. Если параметр не определен, по умолчанию используется режим экспорта. -f имя_файла Указывает имя файла импорта или экспорта. -s имя_сервера Указывает компьютер, на котором должна выполняться операция импорта или экспорта. По умолчанию программа ldifde будет выполняться на компьютере, на котором ldifde установлена. -c строка1 строка2 Заменяет все вхождения строки1 содержимым строки2 . Обычно используется в случае, когда производится импорт данных из одного домена в другой, и при этом необходимо заменить различающееся имя домена, производящего экспорт (строка1 ), именем импортирующего домена (строка2 ). -v Включает режим подробного протоколирования. -j путь Задает местоположение файла журнала. По умолчанию используется текущий путь. -t номер_порта Указывает номер порта протокола LDAP (Lightweight Directory Access Protocol). По умолчанию используется порт LDAP 389. Портом глобального каталога является 3268. -d DN_базы Задает различающееся имя базы поиска для экспорта данных. -r фильтр LDAP Создает фильтр поиска LDAP для экспорта данных. Например, с помощью следующего фильтра выполняется экспорт всех пользователей с определенным отчеством: csvde -r (и(objectClass= Пользователь )(sn= Отчество )) -p область Задает область поиска. Параметрами области поиска являются Base , OneLevel и SubTree . -l список_атрибутов_LDAP Задает список атрибутов, возвращаемых в результатах запроса экспорта. Если данный параметр пропущен, возвращаются все атрибуты. -o список_атрибутов_LDAP Задает список атрибутов, опускаемых из результатов запроса экспорта. Обычно этот параметр используется при экспорте объектов из Active Directory с последующим импортом в другой LDAP-совместимый каталог. Если какие-либо атрибуты не поддерживаются другим каталогом, их можно исключить из набора результатов с помощью данного параметра. -g Исключает постраничные поиски. -m Опускает атрибуты, которые не могут быть записаны, такие как ObjectGUID и objectSID . -n Опускает экспорт двоичных значений. -k Игнорирует ошибки во время операции импорта и продолжает обработку. Ниже приводится полный список игнорируемых ошибок:
- объект уже является членом группы;
- нарушение класса объекта (означающее, что указанный класс объекта не существует), если импортируемый объект не имеет других атрибутов;
- объект уже существует;
- нарушение ограничения;
- атрибут или значение уже существует;
- такого объекта не существует.
-aразличающееся_имя_пользователя пароль Задает выполнение команды с использованием указанных различающегося_имени_пользователя и пароля-b . -bимя_пользователя домен пароль Задает команду, выполняемую с использованием указанных имени_пользователя, домена и пароля . По умолчанию команда будет выполняться, используя учетные данные пользователя, который в текущий момент зарегистрирован в сети. Не может использоваться с параметром -a . -? Отображает меню команд.
Замечания
- С параметром -c можно использовать константы #schemaNamingContext и #configurationNamingContext вместо различающихся имен раздела каталога схемы и раздела каталога конфигурации.
- При создании файла импорта для команды ldifde , используйте значение changeType , чтобы определить тип изменений, содержащихся в файле импорта. Значения changeType приведены в таблице ниже.
Примеры
Чтобы извлечь только различающееся имя, общее имя, имя, фамилию и номер телефона возвращенных объектов, введите:
-l различающееся_имя , CN, имя , SN, телефон
Чтобы исключить глобальный уникальный идентификатор (GUID) для объекта, введите:
-o когда_создан , когда_изменен , GUID_объекта
Источник
Если вам нужно создать много новых учетных записей пользователей в домене одновременно, крайне неэффективно создавать их все вручную с графической консоли Active Directory Users and Computers (ADUC).
В этой статье мы рассмотрим простой скрипт PowerShell, который позволяет импортировать пользовательские данные из файла CSV / XLS и создавать для них учетные записи в домене Active Directory.
Прежде всего, создайте файл NewUser.xlsx в Excel со следующей структурой заголовка:
FullName;sn;givenName;company;department;title;telephoneNumber;City;sAMAccountName;Password
Заполните файл Excel данными всех пользователей, которых вы хотите создать в Active Directory (обычно эти данные предоставляются из системы учета персонала).
Экспортируйте файл Excel в формат CSV с запятыми в качестве разделителей (Файл> Сохранить как> Тип файла: CSV, Имя файла: new_as_users.csv).
Если вы хотите использовать «;» в качестве разделителя, вам нужно добавить следующий аргумент в командлет Import-CSV -delimiter «;».
Для создания новых пользователей в домене мы будем использовать командлет New-ADUser из модуля Active Directory для Windows PowerShell, поэтому перед запуском скрипта PowerShell убедитесь, что этот модуль установлен на сервере / компьютере, с которого вы выполняете импорт пользователей.
Создайте файл import_ad_users.ps1 со следующим кодом PowerShell (измените имя своего домена и организационную единицу Active Directory, в которой вы хотите создать пользователей):
Import-Module ActiveDirectory $Domain="@theitbros.cpm" $UserOu="OU=Users,OU=UK,DC=theitbros,DC=com" $NewUsersList=Import-CSV "C:PSnew_as_users.csv" ForEach ($User in $NewUsersList) { $FullName=$User.FullName $Company=$User.company $Department=$User.department $Description=$User.description $givenName=$User.givenName $title=$User.title $City=$User.City $telephoneNumber=$User.telephoneNumber $sAMAccountName=$User.sAMAccountName $sn=$User.sn $userPrincipalName=$User.sAMAccountName+$Domain $userPassword=$User.Password $expire=$null New-ADUser -PassThru -Path $UserOu -Enabled $True -ChangePasswordAtLogon $True -AccountPassword (ConvertTo-SecureString $userPassword -AsPlainText -Force) -CannotChangePassword $False -City $City -Company $Company -Department $Department –title $title –OfficePhone $telephoneNumber -DisplayName $FullName -GivenName $givenName -Name $FullName -SamAccountName $sAMAccountName -Surname $sn -UserPrincipalName $userPrincipalName }
Запись. Options-ChangePasswordAtLogon $ True требует изменения пароля пользователя при первом входе в систему, -CannotChangePassword $ False – позволяет пользователю самостоятельно изменять пароли.
Если вы создаете учетные записи служб, вы можете указать -ChangePasswordAtLogon $ False, -CannotChangePassword $ True.
Запустите скрипт из командной строки PowerShell, затем откройте консоль ADUC и убедитесь, что в указанном подразделении появились новые пользователи.
Как видите, этот скрипт PowerShell позволяет массово импортировать пользователей в Active Directory за несколько минут.
Вы можете удалить или добавить любые атрибуты пользователя в скрипт и файл CSV / Excel из AD.
Полный список доступных пользовательских атрибутов в схеме вашего домена можно отобразить с помощью следующего командлета:
Get-ADUser –identity administrator –filter * -properties *|fl
Как Вы поняли нет ничего сложного получать данные из каталога LDAP в Excel для дальнейшей работы в режиме онлайн. При необходимой сноровке, через Excel можно модифицировать значения аттрибутов, что иногда удобнее чем через ВЕБ форму. Например — редактирование телефонных справочников компании. Причем меняется только скрипт который на стороне сервера, что бы он мог не только читать данные из каталога, но еще и записывать данные в него.
На этом знакомство Excel и JSON запросов завершим, и перейдем к написанию других интересных статей.
Листинг бибилиотеки Excel jsonlib
Option Explicit
Const INVALID_JSON As Long = 1
Const INVALID_OBJECT As Long = 2
Const INVALID_ARRAY As Long = 3
Const INVALID_BOOLEAN As Long = 4
Const INVALID_NULL As Long = 5
Const INVALID_KEY As Long = 6
Private Sub Class_Initialize()
End Sub
Private Sub Class_Terminate()
End Sub
‘
‘ parse string and create JSON object (Dictionary or Collection in VB)
‘
Public Function parse(ByRef str As String) As Object
Dim index As Long
index = 1
On Error Resume Next
Call skipChar(str, index)
Select Case Mid(str, index, 1)
Case «{«
Set parse = parseObject(str, index)
Case «[«
Set parse = parseArray(str, index)
End Select
End Function
‘
‘ parse collection of key/value (Dictionary in VB)
‘
Private Function parseObject(ByRef str As String, ByRef index As Long) As Object
Set parseObject = CreateObject(«Scripting.Dictionary»)
‘ «{«
Call skipChar(str, index)
If Mid(str, index, 1) <> «{» Then Err.Raise vbObjectError + INVALID_OBJECT, Description:=»char » & index & » : » & Mid(str, index)
index = index + 1
Do
Call skipChar(str, index)
If «}» = Mid(str, index, 1) Then
index = index + 1
Exit Do
ElseIf «,» = Mid(str, index, 1) Then
index = index + 1
Call skipChar(str, index)
End If
Dim key As String
‘ add key/value pair
parseObject.Add key:=parseKey(str, index), Item:=parseValue(str, index)
Loop
End Function
‘
‘ parse list (Collection in VB)
‘
Private Function parseArray(ByRef str As String, ByRef index As Long) As Collection
Set parseArray = New Collection
‘ «[«
Call skipChar(str, index)
If Mid(str, index, 1) <> «[» Then Err.Raise vbObjectError + INVALID_ARRAY, Description:=»char » & index & » : » + Mid(str, index)
index = index + 1
Do
Call skipChar(str, index)
If «]» = Mid(str, index, 1) Then
index = index + 1
Exit Do
ElseIf «,» = Mid(str, index, 1) Then
index = index + 1
Call skipChar(str, index)
End If
‘ add value
parseArray.Add parseValue(str, index)
Loop
End Function
‘
‘ parse string / number / object / array / true / false / null
‘
Private Function parseValue(ByRef str As String, ByRef index As Long)
Call skipChar(str, index)
Select Case Mid(str, index, 1)
Case «{«
Set parseValue = parseObject(str, index)
Case «[«
Set parseValue = parseArray(str, index)
Case «»»», «‘»
parseValue = parseString(str, index)
Case «t», «f»
parseValue = parseBoolean(str, index)
Case «n»
parseValue = parseNull(str, index)
Case Else
parseValue = parseNumber(str, index)
End Select
End Function
‘
‘ parse string
‘
Private Function parseString(ByRef str As String, ByRef index As Long) As String
Dim quote As String
Dim char As String
Dim code As String
Call skipChar(str, index)
quote = Mid(str, index, 1)
index = index + 1
Do While index > 0 And index <= Len(str)
char = Mid(str, index, 1)
Select Case (char)
Case «»
index = index + 1
char = Mid(str, index, 1)
Select Case (char)
Case «»»», «\», «/»
parseString = parseString & char
index = index + 1
Case «b»
parseString = parseString & vbBack
index = index + 1
Case «f»
parseString = parseString & vbFormFeed
index = index + 1
Case «n»
parseString = parseString & vbNewLine
index = index + 1
Case «r»
parseString = parseString & vbCr
index = index + 1
Case «t»
parseString = parseString & vbTab
index = index + 1
Case «u»
index = index + 1
code = Mid(str, index, 4)
parseString = parseString & ChrW(Val(«&h» + code))
index = index + 4
End Select
Case quote
index = index + 1
Exit Function
Case Else
parseString = parseString & char
index = index + 1
End Select
Loop
End Function
‘
‘ parse number
‘
Private Function parseNumber(ByRef str As String, ByRef index As Long)
Dim value As String
Dim char As String
Call skipChar(str, index)
Do While index > 0 And index <= Len(str)
char = Mid(str, index, 1)
If InStr(«+-0123456789.eE», char) Then
value = value & char
index = index + 1
Else
‘some parts commented out here. It incorrectly converted to Int, which caused errors for high numbers
‘If InStr(value, «.») Or InStr(value, «e») Or InStr(value, «E») Then
parseNumber = CDbl(value)
‘Else
‘ parseNumber = CInt(value)
‘End If
Exit Function
End If
Loop
End Function
‘
‘ parse true / false
‘
Private Function parseBoolean(ByRef str As String, ByRef index As Long) As Boolean
Call skipChar(str, index)
If Mid(str, index, 4) = «true» Then
parseBoolean = True
index = index + 4
ElseIf Mid(str, index, 5) = «false» Then
parseBoolean = False
index = index + 5
Else
Err.Raise vbObjectError + INVALID_BOOLEAN, Description:=»char » & index & » : » & Mid(str, index)
End If
End Function
‘
‘ parse null
‘
Private Function parseNull(ByRef str As String, ByRef index As Long)
Call skipChar(str, index)
If Mid(str, index, 4) = «null» Then
parseNull = Null
index = index + 4
Else
Err.Raise vbObjectError + INVALID_NULL, Description:=»char » & index & » : » & Mid(str, index)
End If
End Function
Private Function parseKey(ByRef str As String, ByRef index As Long) As String
Dim dquote As Boolean
Dim squote As Boolean
Dim char As String
Call skipChar(str, index)
Do While index > 0 And index <= Len(str)
char = Mid(str, index, 1)
Select Case (char)
Case «»»»
dquote = Not dquote
index = index + 1
If Not dquote Then
Call skipChar(str, index)
If Mid(str, index, 1) <> «:» Then
Err.Raise vbObjectError + INVALID_KEY, Description:=»char » & index & » : » & parseKey
End If
End If
Case «‘»
squote = Not squote
index = index + 1
If Not squote Then
Call skipChar(str, index)
If Mid(str, index, 1) <> «:» Then
Err.Raise vbObjectError + INVALID_KEY, Description:=»char » & index & » : » & parseKey
End If
End If
Case «:»
If Not dquote And Not squote Then
index = index + 1
Exit Do
End If
Case Else
If InStr(vbCrLf & vbCr & vbLf & vbTab & » «, char) Then
Else
parseKey = parseKey & char
End If
index = index + 1
End Select
Loop
End Function
‘
‘ skip special character
‘
Private Sub skipChar(ByRef str As String, ByRef index As Long)
While index > 0 And index <= Len(str) And InStr(vbCrLf & vbCr & vbLf & vbTab & » «, Mid(str, index, 1))
index = index + 1
Wend
End Sub
Public Function toString(ByRef obj As Variant) As String
Select Case VarType(obj)
Case vbNull
toString = «null»
Case vbDate
toString = «»»» & CStr(obj) & «»»»
Case vbString
toString = «»»» & encode(obj) & «»»»
Case vbObject
Dim bFI, i
bFI = True
If TypeName(obj) = «Dictionary» Then
toString = toString & «{«
Dim keys
keys = obj.keys
For i = 0 To obj.Count — 1
If bFI Then bFI = False Else toString = toString & «,»
Dim key
key = keys(i)
toString = toString & «»»» & key & «»»:» & toString(obj(key))
Next i
toString = toString & «}»
ElseIf TypeName(obj) = «Collection» Then
toString = toString & «[«
Dim value
For Each value In obj
If bFI Then bFI = False Else toString = toString & «,»
toString = toString & toString(value)
Next value
toString = toString & «]»
End If
Case vbBoolean
If obj Then toString = «true» Else toString = «false»
Case vbVariant, vbArray, vbArray + vbVariant
Dim sEB
Dim NoDims As Long
toString = multiArray(obj)
Case Else
toString = Replace(obj, «,», «.»)
End Select
End Function
Private Function encode(str) As String
Dim i, j, aL1, aL2, c, p
aL1 = Array(&H22, &H5C, &H2F, &H8, &HC, &HA, &HD, &H9)
aL2 = Array(&H22, &H5C, &H2F, &H62, &H66, &H6E, &H72, &H74)
For i = 1 To Len(str)
p = True
c = Mid(str, i, 1)
For j = 0 To 7
If c = Chr(aL1(j)) Then
encode = encode & «» & Chr(aL2(j))
p = False
Exit For
End If
Next
If p Then
Dim a
a = AscW(c)
If a > 31 And a < 127 Then
encode = encode & c
ElseIf a > -1 Or a < 65535 Then
encode = encode & «u» & String(4 — Len(Hex(a)), «0») & Hex(a)
End If
End If
Next
End Function
Private Function multiArray(aBD) ‘ Array BoDy, Integer BaseCount, String PoSition
Dim NoDimensions
Dim i1 As Long, i2 As Long
Dim DimList(1 To 10) As Long
NoDimensions = HowManyDimensions(aBD)
Select Case NoDimensions
Case 1
multiArray = multiArray & «[«
For i1 = LBound(aBD, 1) To UBound(aBD, 1)
multiArray = multiArray & toString(aBD(i1))
If i1 < UBound(aBD, 1) Then multiArray = multiArray & «,»
Next i1
multiArray = multiArray & «]»
Case 2
multiArray = multiArray & «[«
For i1 = LBound(aBD, 1) To UBound(aBD, 1)
multiArray = multiArray & «[«
For i2 = LBound(aBD, 2) To UBound(aBD, 2)
multiArray = multiArray & toString(aBD(i1, i2))
If i2 < UBound(aBD, 2) Then multiArray = multiArray & «,»
Next i2
multiArray = multiArray & «]»
If i1 < UBound(aBD, 1) Then multiArray = multiArray & «,»
Next i1
multiArray = multiArray & «]»
Case Else
‘Not much point in doing anything here. The error would just leave it blank.
End Select
End Function
Private Function HowManyDimensions(AnArray) As Long
‘find number of dimensions
On Error GoTo DimensionOverflow
Dim ErrorCheck As Long, DimensionNumber As Long
For DimensionNumber = 1 To 60001
ErrorCheck = LBound(AnArray, DimensionNumber)
Next DimensionNumber
DimensionOverflow:
HowManyDimensions = DimensionNumber — 1
End Function