Як отримати список обраних груп AD, членом яких є список користувачів? Вивантаження даних із контейнерів AD

Доброго дня шановні читачі та передплатники, продовжуємо з вами вивчення можливостей Powershell та Active Directory. Як ви пам'ятаєте всі облікові записи користувачів і комп'ютерів, перебувають у базі даних NTDS.dit, все здорово і централізовано. Коли в компанії більше одного системного адміністратора, може вийти ситуація, що в ній накопичується сміття та зайві облікові дані. Всі ми люди і якісь речі можемо забувати, а в якісь моменти нас можуть відволікти, що призведе, так само до забування важливої ​​інформації. І приходимо, ми до того, що в Actvie Directory накопичуються не активні користувачі (звільнені чи забуті), у будь-якому випадку, хороший системний адміністратор повинен їх виявляти, відключати і далі за бажанням видаляти, чим ми й займемося.

Через оснащення ADUC

Минулого разу я вже наводив приклад використання оснастки Active Directory Користувачі та комп'ютери, через які ми шукали зниклі комп'ютери в локальній мережі, які не з'являлися вже місяць. Зараз зробимо все те ж саме і з обліковими записами користувача. У мене AD на Windows Server 2012 R2, відкриваємо ADUC, натисніть WIN+R і введіть dsa.msc.

У формі запиту, що відкрилася, задайте:

  • Ім'я запиту > у мене це користувачі, що втратилися
  • Опис за необхідності
  • Корінь запиту > тут можна залишити весь домен або конкретизувати на потрібному OU

Після цього тиснемо кнопку запит.

На вкладці користувачі бачимо пункт "Кількість днів з часу останнього входу в систему" я поставив 60 днів.

У результаті ви отримаєте необхідний вам список, неактивних облікових записів співробітників.

Через оснастку PowerShell

Все те саме можна зробити і через Powershell. Відразу наведу код, завданням якого є пошук неактивних користувачів, для цього я вибрав період 45 днів, відключення даних користувачів та переміщення у спеціально відведену для цього OU.

$date_with_offset=(Get-Date).AddDays(-45)
$users = Get-ADUser -Properties LastLogonDate -Filter (LastLogonDate -lt $date_with_offset ) | Sort LastLogonDate
foreach ($user in $users) (set-aduser $user -enabled $false; move-adobject -identity $user -targetpath "ou=Звільнені,ou=Мск Л. користувачі,ou=Location,dc=msk,dc= contoso,dc=com")
Get-ADUser -Properties LastLogonDate -Filter (LastLogonDate -lt $date_with_offset ) | Sort LastLogonDate | FT Name, LastLogonDate -AutoSize | Out-File c:\Script\users.txt

  • У першому рядку ви оголошує змінну, в якій задаєте термін пошуку
  • Створюємо змінну і робимо вибірку за останнім часом
  • Переміщуємо користувачів

  • Робимо звіт у файл

Ще корисні речі для роботи з користувачем. Перед використанням нижче команд потрібно завантажити модуль Active Directory через команду

Get-Help Get-ADUser

Скрипти вивантаження всіх користувачів із MS Active Directory (ITGC)

Іван Піскунов

Однією із стандартних процедур проведення аудиту ITGC для каталогу Active Directory є отримання розвантаження всіх користувачів домену. З отриманих даних далі формуються процедури тестування, наприклад вивчення списку адміністраторів чи виявлення користувачів з паролем. Найбільш ефективним для формування такого вивантаження буде використання стандартного інтерфейсу PowerShell , приклади якого ми і розглянемо у цій статті

1. Експрес вивантаження скриптом на PowerShell

Нижче представлений скрипт PowerShell, як один з найбільш простих і швидких способів отримати список всіх користувачів домену AD у форматі CSV, який без проблем відкривається тим самим Excel.

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = "LDAP://ou=Users,ou=Departmets,dc=test,dc=uk" $objSearcher.Filter = "(&(objectCategory=person) (!userAccountControl:1.2.840.113556.1.4.803:=2))" $users = $objSearcher.FindAll() # Кількість облікових записів $users.Count $users | ForEach-Object ( $user = $_.Properties New-Object PsObject -Property @( Посада = $user.description Відділ = $user.department Логін = $user.userprincipalname Телефон = $user.telephonenumber Кімната = $user.physicaldeliveryofficename ПІБ) = $user.cn)) | Export-Csv -NoClobber -Encoding utf8 -Path З: list_domen_users.csv

Для того щоб скрипт відпрацював на вашій системі, необхідно його трохи підкоригувати, а саме вписати необхідні параметри, тобто. як у цьому прикладі це параметри Users у підрозділі Departments у домені Test.ru. А також вказати шлях до місця збереження файлу list_domen_users.csv

Після вивантаження, якщо одразу відкрити list_domen_users.csv , буде виглядати у не читальному вигляді, однак, станалртими засобами ми легко його приведемо в потрібний нам формат. Відкриваємо в Excel list_domen_users.csv , виділяємо перший стовпець, потім заходимо у вкладку "Дані" та натискаємо "Текст по стовпцям". Вибираємо "з роздільниками" та натискаємо "Далі". Готово!

!Необхідно помітити, що цей скрипт не відобразить більше 1000 користувачів. Для невеликої компанії цілком підійде, а тим же у кого в домені величезна кількість користувачів варто вдатися до описаних нижче методів.

2. Просунутий командлет PowerShell для отримання вивантаження користувачів Active Directory

Інструмент Active Directory Module for Windows PowerShell (представлений у Windows Server 2008 R2 і вище), дозволяє формувати командлети, які виконують різні маніпуляції з об'єктами каталогу AD. Для отримання інформації про користувачів та їх властивості призначений командлет Get-ADUser.

Для початку запускаємо вікно Powershell з правами адміністратора та імпортуємо модуль Active Directory для подальших дій:
Import-Module activedirectory

Щоб вивести список усіх облікових записів домен а, виконаємо команду:

Get-ADUser -filter *

Щоб вивести повну інформацію про всі доступні атрибути користувача tuser, виконаємо команду

Get-ADUser -identity tuser -properties *


Наприклад, нас цікавить інформація про дату зміни пароля та часу, коли він закінчиться . Результат виконання команди можна вивантажити до текстового файлу:

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

У коментарях до попередньої статті згадали про облік у 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колиCreated;
  • і в securityPrincipalSamAccountName.


Розширюємо запит.


Тепер налаштуємо фільтр: зокрема, щоб не отримати заблоковані облікові записи, потрібно щоб атрибут 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", "msExchCustomAttribut #"Розгорнутий елемент securityPrincipal" = Table.ExpandRecordColumn(#"Видалені стовпці", "securityPrincipal", ("sAMAccountName"), ("sAMAccountName")), #"Розгорнутий елемент top" = Table.ExpandRecordColumn(#" ", "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=uaпотрібно витягти безпосередньо назву відділу. Найпростіше це зробити з використанням роздільників на вкладці «Перетворення».



Витягуємо текст.


Як роздільники я використовую OU=і ,OU=. В принципі, достатньо і комою, але я перестраховуюсь.



Вводимо роздільники.


Тепер за допомогою фільтра можна відсікнути непотрібні OU, на кшталт заблокованих користувачів та Builtin, налаштувати сортування та завантажити дані до таблиці.



Вигляд підсумкової таблиці.

Швидкий звіт щодо складу робочих станцій, без впровадження агентів та іншої підготовки

Тепер спробуємо створити корисну таблицю, отримавши дані щодо комп'ютерів. Зробимо звіт за операційними системами, що використовуються компанією: для цього створимо запит, але в навігаторі цього разу виберемо computer.



Робимо запит щодо об'єкта computer.


Залишимо класи-колонки computerі topі розширимо їх:

  • клас computerрозширимо, обравши cn, operatingSystem, operatingSystemServicePackі operatingSystemVersion;
  • в класі topоберемо колиCreated.


Розширений запит.


За бажанням можна зробити звіт лише за серверними операційними системами. Наприклад, застосувати фільтр за атрибутом 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"

Додати теги

0

У мене є наступний робочий скрипт, який перевіряє, чи є великий список користувачів у файлі CSV членом групи AD і записує результати в results.csv.

Не знаєте, як перетворити сценарій, щоб я міг змінити $group = "InfraLite" на $group = DC .\List_Of_AD_Groups.CSV .

Таким чином, сценарій не просто повертає збіги для однієї групи AD, але тому він повертає збіги для груп 80 AD, що містяться в List_of_AD_groups.csv. Написання YES/NO для кожної групи AD у новому стовпці CSV (або, якщо це неможливо, створення окремого файлу CSV для кожної групи з результатами буде також.

Я міг би зробити це вручну, змінивши значення з $group та ім'я файлу експорту та повторного запуску скрипту у 80 разів, але маю бути швидким був з PS, щоб зробити це

наприклад, results.csv ?:

NAME AD_GROUP1 AD_GROUP2 AD_GROUP80 etc. user1 yes no yes user2 no no yes user3 no yes no echo "UserName`InfraLite" >> results.csv $users = GC .\user_list.csv $group = "InfraLite" $members = Get-ADGroupMember -Identity $group -Recursive | Select -ExpandProperty SAMAccountName foreach ($user in $users) ( if ($members -contains $user) ( echo "$user $group`tYes" >> results.csv ) else ( echo "$user`tNo" >> results .csv ) )

  • 2 відповіді
  • Сортування:

    Активність

0

тривіальне вирішення вашої проблеми було б обернути ваш існуючий код в іншому циклі та створити вихідний файл для кожної групи:

$groups = Get-Content "C:\groups.txt" foreach ($group in $groups) ( $members = Get-ADGroupMember ... ... )

Більш витончений підхід був би створити шаблон відображення групи, клонувати його для кожного користувача і заповнити копію з членством у групах користувача. Щось подібне має працювати:

$template = @() Get-Content "C:\groups.txt" | ForEach-Object ( $template[$_] = $false ) $groups = @() Get-ADGroup -Filter * | ForEach-Object ( $groups[$_.DistinguishedName] = $_.Name ) Get-ADUser -Filter * -Properties MemberOf | ForEach-Object ( $groupmap = $template.Clone() $_.MemberOf | ForEach-Object ( $groups[$_] ) | Where-Object ( $groupmap.ContainsKey($_) ) | ForEach-Object ( $groupmap [$_] = $true ) New-Object -Type PSObject -Property $groupmap ) | Export-Csv "C:\user_group_mapping.csv" -NoType

0

я грав з цим на деякий час, і я думаю, що я знайшов спосіб, щоб отримати саме те, що ви були після.

Я думаю, що Ansgar був на правильному шляху, але я не змусив його робити те, що було після. Він згадав, що на момент написання статті він не мав доступу до середовища AD.

Ось що я вигадав:

$UserArray = Get-Content "C:\Temp\Users.txt" $GroupArray = Get-Content "C:\Temp\Groups.txt" $OutputFile = "C:\Temp\Something.csv" # Setting up a hashtable для останнього використання $UserHash = New-Object -TypeName System.Collections.Hashtable # Outer loop to add users and membership to UserHash $UserArray | ForEach-Object( $UserInfo = Get-ADUser $_ -Properties MemberOf # Strips the LPAP syntax для just SAMAccountName of the group $Memberships = $UserInfo.MemberOf | ForEach-Object( ($_.Split(",")) .replace("CN=","") ) #Adding the User=Membership знижується до Hash $UserHash.Add($_,$Memberships) ) # Outer loop to create an object per user $Results = $UserArray | ForEach-Object( # First create a simple object $User = New-Object -TypeName PSCustomObject -Property @( Name = $_ ) # Dynamically add members to the object, based on the $GroupArray $GroupArray | $UserHash to see if group shows up in user"s membership list $UserIsMember = $UserHash.($User.Name) -contains $_ #Adding property to object, and value $User | Add-Member -MemberType NoteProperty -Name $ _ -Value $UserIsMember ) #Returning the object to the variable Return $User ) #Convert the objects to a CSV, then output them $Results |ConvertTo-CSV -NoTypeInformation |Out-File $OutputFile

Сподіватимемося, що все має сенс. Я прокоментував стільки, скільки міг. Було б дуже просто перетворити на ADSI, якщо у вас не було RSAT, встановлений на будь-якій машині, на якій ви запускаєте це. Якщо це потрібно, дайте мені знати, і я зроблю деякі швидкі зміни.

Сьогодні ми спробуємо вивантажити список усіх користувачів в окремий файл із Active Directory. Головним помічником у цій справі буде PowerShell. Справа в тому, що Microsoft спочатку планувала командну консоль PowerShell як основний інструмент для управління серверними компонентами Windows. І на сьогоднішній день, коли ми вже маємо версію 2.0, за великим рахунком, це так і є.

Ще в недалекому минулому, щоб хоч якось взаємодіяти з AD, адміністраторам необхідно було мати у своєму розпорядженні або утиліту dsquery, або різного роду скрипти чи утиліти. Сьогодні ж, починаючи з версії Windows Server 2008 R2, ми можемо працювати з AD через PowerShell. З приходом PowerShell 2.0 для взаємодії з Active Directory використовується спеціальний модуль Active Directory Module для 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 користувачів.

Експортуємо користувачів AD за допомогою PowerShell в окремий файл

Для початку викличемо довідку для команди 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 ми побачимо знаки питання замість російських букв.

Під час перегляду файлу дані експортуються в один рядок і таким чином не підходять для читання. Щоб це змінити, нам необхідно виконати такі дії: