Аудит пользователей и компьютеров в Active Directory

У меня продолжается автоматизация процессов. Частично на это подтолкнуло создание блога, ведь теперь созданные скрипты не потеряются.

У меня на работе существует проблема с отделом кадров. Он далеко не всегда сообщает об увольнении сотрудников. Поэтому я написал скрипт, который формирует отчёт о сотрудниках, не входивших в систему 30\90\180 дней. Скрипт теперь запускается раз в неделю и автоматически присылает мне отчёт на почту. Мне остаётся только нажать пару кнопок клавиатуры и избавить себя от мусора в AD. Можно автоматизировать процесс удаления пользователей после 180 дней, но в моём окружении это не имеет смысла, маленький масштаб предприятия. Если нужна помощь с последним пунктом – пишите, протестирую и опубликую в свободное время.

Кроме работы с пользователями, данный скрипт делает отчёт по компьютерам в AD. В отчёт попадают компьютеры, которые не соединялись с контроллером домена 30/60 дней.

Сам скрипт:

# ==============================================================================================
# 
# Microsoft PowerShell Source File -- Created with SAPIEN Technologies PrimalScript 2011
# 
# NAME: AD_Users_report.ps1
# 
# AUTHOR: Shpak Andrey , [email protected]
# DATE  : 04.07.2012
# 
# COMMENT: Создаёт отчёт по состоянию различных пользователей и компьютеров в АД и кидает его на почту.
# 
# ==============================================================================================

# Включаем поддержку Active Directory в PowerShell

Import-Module ActiveDirectory

# Задаём временные промежутки, используемые в скриптах.

$today = Get-Date -Format "dd-MM-yyyy"
$30days = Get-Date (Get-Date).adddays(-30)
$60days = Get-Date (Get-Date).adddays(-60)
$90days = Get-Date (Get-Date).adddays(-90)
$180days = Get-Date (Get-Date).adddays(-180)
$Logfile = "$env:windir\logs\AD_Cleanup\$today.txt"

# Создаём пустой лог.

New-Item $Logfile -type File -Force

#Задаём параметры почтового сервера, адрес получателя, адрес отправителя.

$EmailFrom = "<e-mail>"
$EmailTo = "<e-mail>" 
$EmailSubject = "Active Directory not logged users report."
$smtpServer = "<mail-server>"
$smtpUsername = "<smtp username."
$smtpPassword = "<smtp password>" 

#Конвертируем открытый пароль в тот, который скушает PS

$secstr = New-Object -TypeName System.Security.SecureString
$smtpPassword.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$EmailCred = New-Object -typename System.Management.Automation.PSCredential -argumentlist $smtpUsername, $secstr

# Отсееваем пользователей с последним логином 30 дней с текущего момента и добавляем в отчёт. Не добавляем заблокированных.

Add-Content $Logfile -Value "`nНе входили 30 дней. Поинтересоваться?`n" 
Get-ADUser -Filter 'lastLogon -lt $30days -and Enabled -eq "True"'| Format-Table Enabled,UserPrincipalName,GivenName,Surname,Name,SamAccountName |
Out-File -Append -FilePath $Logfile -Encoding Default

# Отсееваем пользователей с последним логином 90 дней с текущего момента и добавляем в отчёт. Не добавляем заблокированных.

Add-Content $Logfile -Value "`nНе входили 90 дней! Пора блокировать!`n"
Get-ADUser -Filter 'lastLogon -lt $90days -and Enabled -eq "True"'| Format-Table Enabled,UserPrincipalName,GivenName,Surname,Name,SamAccountName |
Out-File -Append -FilePath $Logfile  -Encoding Default

# Отсееваем пользователей с последним логином 180 дней с текущего момента и добавляем в отчёт. Показываем всех.

Add-Content $Logfile -Value "`nНе входили 180 дней! Пора удалять!`n"
Get-ADUser -Filter 'lastLogon -lt $180days'| Format-Table Enabled,UserPrincipalName,GivenName,Surname,Name,SamAccountName |
Out-File -Append -FilePath $Logfile  -Encoding Default

# Отслеживаем мёртвые компьютеры.
Add-Content $Logfile -Value "`n===================================================================================================================`r`n"
Add-Content $Logfile -Value "`nОтслеживаем мёртвые компьютеры.`r`n"
Add-Content $Logfile -Value "`nКомпьютера нет 30 дней! Пора искать!`n"
Get-ADComputer -Filter 'modifyTimeStamp -lt $30days -and Enabled -eq "True"' -Properties CanonicalName,Description,ManagedBy | 
Format-Table DNSHostname,Name,Enabled,CanonicalName,Description,ManagedBy |
Out-File -Append -FilePath $Logfile -Encoding Default

Add-Content $Logfile -Value "`nКомпьютера нет 60 дней! Пора удалять!`n"
$Computers60 = Get-ADComputer -Filter 'modifyTimeStamp -lt $60days' -Properties CanonicalName,Description,ManagedBy | 
Format-Table DNSHostname,Name,Enabled,CanonicalName,Description,ManagedBy |
Out-File -Append -FilePath $Logfile -Encoding Default

# Формируем и отсылаем красивое письмо письмо.

$Logs = Get-Content $Logfile
[string]$finalreport =""

		# Меняем тип объекта на строчку:

foreach ($Log in $Logs) {
	$finalreport = $finalreport + $Log + "`r`n" }

Send-MailMessage -Encoding ([System.Text.Encoding]::UTF8) -To $EmailTo -From $EmailFrom -Subject $EmailSubject -Priority High -SmtpServer $smtpServer -Credential $EmailCred -Body $finalreport -Attachments $Logfile

One thought on “Аудит пользователей и компьютеров в Active Directory

  1. приветствую.
    подскажи кусок кода, если не на почту присылать, а сразу выгружать в csv файлик?

    спасибо

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *