Excel вместо PowerShell: запросы к AD и системные отчеты «на коленке. Поиск неактивных пользователей в Active Directory

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 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 for later use $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 to just the SAMAccountName of the group $Memberships = $UserInfo.MemberOf | ForEach-Object{ ($_.Split(",")).replace("CN=","") } #Adding the User=Membership pair to the 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 | ForEach-Object { #Checking $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, установленного на любой машине, на которой вы запускаете это. Если вам это нужно, дайте мне знать, и я сделаю некоторые быстрые изменения.

Не секрет, что начиная с первой версии 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 командой:

Import-Module activedirectory

Совет . В 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 можно получить так:

Help Get-ADUser

Чтобы вывести список всех учетных записей домена, выполним команду:

Get-ADUser -filter *

Формат возвращаемого списка не очень удобен для использования, выводится только некоторые основные 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:\temp\users.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:\temp\user-password-expires-2015.csv

Таким образом, можно построить таблицу с любыми необходимыми атрибутами пользователей Active Directory.

Для получения списка учетных записей пользователей AD по определенному признаку используется параметр –Filter. В качестве аргументов этого параметра можно указать значение определённых атрибутов пользователей Active Directory, в результате командлет Get-ADUser будет применятся для пользователей, которые попадают под критерии фильтра.

Вывод пользователей AD, имя которых начинается с Roman:

Get-ADUser -filter {name -like "Roman*"}

Get-ADUser -Filter {SamAccountName -like "*"} | Measure-Object

Список всех активных (не заблокированных) учетных записей в AD:

Get-ADUser -Filter {Enabled -eq "True"} | Select-Object SamAccountName,Name,Surname,GivenName | Format-Table

Список учетных записей с истекшим сроком действия пароля:

Get-ADUser -filter {Enabled -eq $True} -properties passwordExpired | where {$_.PasswordExpired}

Список активных учеток с почтовыми адресами:

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:\ps\usernsme_list.csv | ForEach { Get-ADUser -identity $_.user -Properties Name, telephoneNumber | Select Name, telephoneNumber | Export-CSV c:\ps\export_ad_list.csv -Append -Encoding UTF8 }

Следующий пример позволяет выгрузить адресную книгу предприятия в виде 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:temp\mail_list.csv

Пользователи, которые не меняли свой пароль в течении последних 90 дней:

$90_Days = (Get-Date).adddays(-90) Get-ADUser -filter {(passwordlastset -le $90_days)}

$user = Get-ADUser winadmin -Properties thumbnailPhoto $user.thumbnailPhoto | Set-Content winadmin.jpg -Encoding byte

Список групп, в которых состоит учетная запись пользователя

Get-AdUser winadmin -Properties memberof | Select memberof -expandproperty memberof

В этой статье мы рассмотрим возможности PowerShell по управлению группами домена Active Directory. Мы рассмотрим, как создать новую группу в AD, добавить в нее пользователей (или удалить), вывести список пользователей группы и несколько других полезных действия с доменными группами, которые чрезвычайно полезны при повседневном администрировании. Для управления группами AD в модуле PowerShell для Active Directory имеются следующие основные командлеты:

Для использования данных командлетов в вашей сессии PowerShell должен быть загружен специальный модуль взаимодействия с AD — Active Directory Module for Windows PowerShell . Данный модуль впервые был представлен в Windows Server 208 R2. В Windows Server 2012 и выше этот модуль включен по умолчанию. На клиентских компьютерах его можно установить и включить в качестве одного из компонентов RSAT. Проверить, загружен ли модуль можно так:

Get-Module -Listavailable

Как вы видите, модуль ActiveDirectory загружен. Если нет – импортируйте его командой:

Import-Module activedirectory

Полный список команд модуля можно получить так:

Get-Command -Module ActiveDirectory

В модуле всего доступно 147 командлетов, из которых с группами могут работать 11.

Get-Command -Module ActiveDirectory -Name "*Group*"

Вот их список:

  • Add-ADPrincipalGroupMembership
  • Get-ADAccountAuthorizationGroup
  • Get-ADGroup
  • Get-ADGroupMember
  • Get-ADPrincipalGroupMembership
  • New-ADGroup
  • Remove-ADGroup
  • Remove-ADPrincipalGroupMembership
  • Set-ADGroup

Создадим новую группу в указанном контейнере (OU) Active Directory с помощью команды New-ADGroup :

New-ADGroup "TestADGroup" -path "OU=Groups,OU=Moscow,DC=corp,dc=winitpro,DC=ru" -GroupScope Global -PassThru –Verbose

С помощью атрибута Description можно задать описание группы, а с помощью DisplayName изменить отображаемое имя.

Параметром GroupScope можно задать один из следующих типов групп:

  • 0 = DomainLocal
  • 1 = Global
  • 2 = Universal

Создать группу распространения можно так:

New-ADGroup "TestADGroup-Distr" -path "OU=Groups,OU=Moscow,DC=corp,dc=winitpro,DC=ru" -GroupCategory Distribution -GroupScope Global -PassThru –Verbose

Add-AdGroupMember – добавить пользователей в группу AD

Добавить пользователей в группу Active Directory можно с помощью командлета Add-AdGroupMember . Добавим в новую группу двух пользователей:

Add-AdGroupMember -Identity TestADGroup -Members user1, user2

Если список пользователей, которых нужно добавить в группу довольно большой, можно сохранить список учетных записей в CSV файл, затем импортировать данный файл и добавить каждого пользователя в группу.

Формат CSV файла такой (список пользователей по одному в строке, имя столбца – users)

Import-CSV .\users.csv -Header users | ForEach-Object {Add-AdGroupMember -Identity ‘TestADGroup’ -members $_.users}

Чтобы получить всех членов одной группы (groupA) и добавить их в другую группу (groupB), воспользуйтесь такой командой:

Get-ADGroupMember “GroupA” | Get-ADUser | ForEach-Object {Add-ADGroupMember -Identity “Group-B” -Members $_}

В том случае, если нужно скопировать в новую группу и членов всех вложенных групп (рекурсивно), нужно воспользоваться такой командой:

Get-ADGroupMember -Identity “GroupA” -Recursive | Get-ADUser | ForEach-Object {Add-ADGroupMember -Identity “GroupB” -Members $_}

Remove-ADGroupMember – удалить пользователей из группы

Для удаления пользователей из группы AD нужно использовать командует Remove-ADGroupMember. Удалим из группы двух пользователей:

Remove-ADGroupMember -Identity TestADGroup -Members user1, user2

Подтвердите удаление пользователей из группы:

Если нужно удалить из группы пользователей по списку из CSV файла, воспользуйтесь такой командой:

Import-CSV .\users.csv -Header users | ForEach-Object {Remove-ADGroupMember -Identity ‘TestADGroup’ -members $_.users}

Get-ADGroup – получить информацию о группе AD

Получить информацию о группе поможет командлет Get-ADGroup :

Get-ADGroup "TestADGroup"

Даная команда выводит информацию об основных атрибутах группы (DN, тип группы, имя, SID). Чтобы вывести значение всех атрибутов группы домена AD, выполните такую команду:

Get-ADGroup "TestADGroup" -properties *

Как вы видите, теперь стали отображаться такие атрибуты, как время создания и модификации группы, описание и т.д.

С помощью командлета Get-ADGroup можно найти все интересующие вас группы по определенному шаблону. Например, нужно найти все группы AD, в имени которых содержится фраза admins :

Get-ADGroup -LDAPFilter “(name=*admins*)” | Format-Table

Get-ADGroupMember – вывести список пользователей группы AD

Вывести на экран список пользователей группы:

Get-ADGroupMember "TestADGroup"

Чтобы оставить в результатах только имена пользователей, выполните:

Get-ADGroupMember "TestADGroup"| ft name

Если в данную группу включены другие группы домена, чтобы вывести полный список членов, в том числе всех вложенных групп, воспользуйтесь параметром Recursive .

Get-ADGroupMember ‘server-admins" -recursive| ft name

Чтобы выгрузить список учетных записей, состоящих в определённой группе в CSV файл (для дальнейшего использования в Excel), выполните такую команду:

Get-ADGroupMember ‘server-admins" -recursive| ft samaccountname| Out-File c:\ps\admins.csv

Чтобы добавить в текстовый файл данные учетных записей пользователей в AD, воспользуемся командлетом . Например, помимо учетной записи нужно вывести должность и телефон пользователя группы:

Get-ADGroupMember -Identity ’server-admins’ -recursive| foreach { Get-ADUser $_ -properties title, OfficePhone|Select-Object title, OfficePhone }

(Get-ADGroupMember -Identity "domain admins").Count

Оказалось, что в группе «domain admins» у нас состоит 7 учетных записей администраторов.

Чтобы найти список пустых групп в определенном OU, воспользуйтесь такой командой:

Get-ADGroup -Filter * -Properties Members -searchbase “OU=Moscow,DC=corp,dc=winitpro,DC=ru” | where {-not $_.members} | select Name

Добрый день уважаемые читатели и подписчики, продолжаем с вами изучение возможностей 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=Местоположение,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

Сегодня мы попробуем выгрузить список все пользователей в отдельный файл из 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 пользователей.

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

При просмотре файла данные экспортируются в одну строку и тем самым не пригодны для чтения. Чтобы это изменить, нам необходимо выполнить следующие действия:



Статьи по теме