Скрипт для работы с AD

Скрипт для работы с AD

Задачей было вывести список сотрудников, которым разрешен доступ к USB и DVD, но на компьютерах которых(у юзера может быть >1 компьютера в использовании) не установлен DeviceLock.


Владислав Дридгер


Добрый день, коллеги!

Меня зовут Влад, работаю специалистом по ИБ в организации с 3к+ сотрудников.

Пишу максимально подробно, что и как делаю, чтобы максимально избежать недопониманий.

В данном случае задачей было вывести список сотрудников, которым разрешен доступ к USB и DVD, но на компьютерах которых(у юзера может быть >1 компьютера в использовании) не установлен DeviceLock по некоторым причинам (в нашем случае, организация закупила недостаточное количество лицензий DeviceLock DLP).

#excel

$Excel = New-Object -Com Excel.Application

$Excel.visible = $True

$Excel = $Excel.Workbooks.Add()

#определяем параметры листа (заголовок)

$Sheet = $Excel.WorkSheets.Item(1)

$Sheet.Cells.Item(1,1) = “Имя пользователя”

$Sheet.Cells.Item(1,2) = “Описание ПК”

$Sheet.Cells.Item(1,3) = “Имя ПК”

$Sheet.Cells.Item(1,4) = "Отдел"

#определяем цвета (опционально)

$WorkBook = $Sheet.UsedRange

$WorkBook.Interior.ColorIndex = 8

$WorkBook.Font.ColorIndex = 11

$WorkBook.Font.Bold = $True

#переходим на вторую строку листа

$intRow = 2

#скрипты для вывода интересующих нас Properties с фильтрами where-object

$userObjs= (Get-ADUser -Filter * -Properties memberof, enabled, displayname,emailaddress, Department | Where-Object {$_.memberof -match "nt-DeviceLock-Enable" -and $_.Enabled -like "true" })

$TRcomps = (Get-ADComputer -filter * -Properties Description, name,memberof | Where-Object {-not ($_.memberof -match "nt-DeviceLock-Computers")})

#для каждого значения результата применяем следующее условие:

foreach ($userObj in $userObjs)

{

foreach ($TRcomp in $TRcomps)

{

$userObjDisplayName = $userObj.DisplayName

#сравниваем "описание" из OU для компьютеров со значением ДисплейНейм из OU для юзеров

if ($TRcomp.Description -like "*$userObjDisplayName*")

{

$Sheet.Cells.Item($intRow+$i,1) = $userObj.DisplayName

$Sheet.Cells.Item($intRow+$i,2) = $TRcomp.Description

$Sheet.Cells.Item($intRow+$i,3) = $TRcomp.Name

$Sheet.Cells.Item($intRow+$i,4) = $userObj.Department

$intRow ++

}

}

}

# автоширина листа Excel после окончания вывода информации

$WorkBook.EntireColumn.AutoFit()

Для облегчения работы с Active Directory подготовил скрипт Powershell, который позволит нам сравнивать значения пользователей и компьютеров для вывода нужной нам информации.

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

Попробовал другим способом: через Powershell выбрал определенного пользователя, определенную машину, и посмотрел, в каких значениях Properties *, они имеют что-либо общее.

Далее начинаем фильтровать, пользователей:

Командой get-ADuser мы получаем список пользователя, нужные нам значения для работы и устанавливаем на них нужны нам фильтры.

Get-ADUser -Filter * -Properties memberof, enabled, displayname,emailaddress, Department | Where-Object {$_.memberof -match "nt-DeviceLock-Enable" -and $_.Enabled -like "true" }

В данном случае мы вывели список пользователей, который состоят в группе nt-DeviceLock-Enable, и учётные записи которых активированы. Значения(Properties) были выбраны следующие: 1.memberOf(значение, в каких пользователях состоит юзер),

2.enabled(активирована ли УЗ),

3. displayname(самое важное!, о нём позже) ,

4. emailaddress (доп. информация о пользователях)

5. department(доп. информация о пользователях)

Далее мы вывели и отфильтровали компьютеры.

Командой get-ADComputer мы выводим список компьютеров, соответственно, нужные значения(properties), которые будут использованы, и соответственно, фильтры для них.

Get-ADComputer -filter * -Properties Description, name,memberof | Where-Object {-not ($_.memberof -match "nt-DeviceLock-Computers")}

Данной командой мы вывели список компьютеров, которые НЕ состоят в группе nt-DeviceLock-Computers. Прошу заметить, что группы компьютеров и пользователей ОТЛИЧАЮТСЯ и НЕ ПЕРЕСЕКАЮТСЯ… пока)

Ранее я определил, что из общего у них-только ФИО владельца.

Но в каких оно значениях употребляется?

Если посмотреть в properties у компьютеров, то ФИО владельца( в нашем случае) используется ТОЛЬКО в description (и то, под предлогом log on тогда-то*дата* и кто-то*ФИО* в одной строке)

Если посмотреть в properties у пользователей, то ФИО(И Фамилия, И Имя, И Отчество) используется в значении( в нашем, опять же, случае) DisplayName.

Далее мы задаем параметр foreach, чтобы обратиться к каждому выводимому объекту.

foreach ($userObj in $userObjs)

{

foreach ($TRcomp in $TRcomps)

{

$userObjDisplayName = $userObj.DisplayName

if ($TRcomp.Description -like "*$userObjDisplayName*")

Далее сравниваем значения Description у компьютеров и Displayname у Юзеров с выводом в столбцы Excel документа

if ($TRcomp.Description -like "*$userObjDisplayName*")

{

$Sheet.Cells.Item($intRow+$i,1) = $userObj.DisplayName

$Sheet.Cells.Item($intRow+$i,2) = $TRcomp.Description

$Sheet.Cells.Item($intRow+$i,3) = $TRcomp.Name

$Sheet.Cells.Item($intRow+$i,4) = $userObj.Department

$intRow ++

}

В результате мы вывели список из сотрудников, описания ПК, имя компьютера и отдел в документ excel.

Портал по информационной безопасности SecurityLab.ru проводит конкурс статей. Всех участников конкурса ждут ценные призы и подарки от компаний Лаборатория Касперского, Учебный центр «Информзащита», Keenetic, Positive Technologies, Инфосистемы Джет, Cybersecurity Help, HideMy.name а победителю конкурса будет вручен главный приз от компании Palo Alto Networks.


Ищем баги вместе! Но не те, что в продакшене...

Разбираем кейсы, делимся опытом, учимся на чужих ошибках

Зафиксируйте уязвимость своих знаний — подпишитесь!