В современных организациях управление IT-ресурсами, такими как компьютеры и пользователи, становится все более важным для обеспечения безопасности и оптимизации работы. Один из ключевых аспектов управления — это удаление или перемещение неактивных компьютеров из Active Directory (AD). В этом контексте PowerShell предоставляет мощные инструменты для автоматизации таких задач. В данной статье мы рассмотрим скрипт, который помогает выявлять и перемещать неактивные компьютеры в определенную организационную единицу (OU) в Active Directory.
Задачи и цели скрипта
Основная задача нашего скрипта — найти компьютеры, которые не были активны в течение последних 90 дней, и переместить их в указанную организационную единицу. Это позволяет упростить управление ресурсами и повысить безопасность, исключая неиспользуемые компьютеры из основного списка.
Структура скрипта
Скрипт состоит из нескольких ключевых частей:
1. Определение переменных:
$ou = "OU=OLD PC,DC=yourdomain,DC=com"
$inactiveDays = 90
$timeSpan = New-TimeSpan -Days $inactiveDays
$logFilePath = "C:PathToYourLogFile.log"
Здесь мы задаем путь к OU, количество дней неактивности и путь к лог-файлу.
2. Создание лог-файла:
Скрипт проверяет, существует ли лог-файл, и создает его, если он отсутствует. Это важно для сохранения информации о выполненных действиях и возможных ошибках.
3. Функция записи логов:
function Write-Log {
param (
[string]$message
)
$timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
"$timestamp - $message" | Add-Content -Path $logFilePath
}
Эта функция упрощает процесс логирования, добавляя временную метку к каждому сообщению.
4. Поиск неактивных компьютеров:
Используя командлет Search-ADAccount, скрипт получает список компьютеров, которые были неактивны в течение заданного времени. Обработка ошибок позволяет избежать сбоев в случае проблем с доступом к AD.
5. Перемещение неактивных компьютеров:
Если находятся неактивные компьютеры, они перемещаются в указанную OU с помощью Move-ADObject. Каждое действие также логируется, что позволяет отслеживать процесс.
6. Обработка результатов:
Скрипт выводит сообщения о статусе выполнения операций как в консоль, так и в лог-файл, что делает его удобным для мониторинга.
Преимущества использования PowerShell для автоматизации
• Экономия времени: Автоматизация рутинных задач освобождает IT-специалистов для более важных дел.
• Снижение ошибок: Человеческий фактор часто приводит к ошибкам. Автоматизация помогает минимизировать этот риск.
• Улучшение безопасности: Удаление неактивных ресурсов снижает вероятность несанкционированного доступа.
Заключение
Скрипт на PowerShell для перемещения неактивных компьютеров в Active Directory — это отличный пример того, как автоматизация может помочь в управлении IT-ресурсами. Он обеспечивает простоту использования, надежность и возможность быстрого реагирования на изменения в инфраструктуре. Внедрение подобного подхода может значительно улучшить эффективность работы IT-подразделений и повысить уровень безопасности организации.
Сам скрипт
# Задаем переменные
$ou = "OU=OLD PC,DC=yourdomain,DC=com" # Замените на ваш путь к OU
$inactiveDays = 90 # Количество дней неактивности
$timeSpan = New-TimeSpan -Days $inactiveDays
$logFilePath = "C:\PathToYourLogFile.log" # Укажите путь к файлу для логирования
# Проверяем, существует ли лог-файл, и создаем его, если нет
if (-not (Test-Path $logFilePath)) {
New-Item -Path $logFilePath -ItemType File -Force | Out-Null
}
# Функция для записи логов
function Write-Log {
param (
[string]$message
)
$timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
"$timestamp - $message" | Add-Content -Path $logFilePath
}
# Получаем список неактивных компьютеров
try {
$inactiveComputers = Search-ADAccount -AccountInactive -ComputersOnly -TimeSpan $timeSpan
} catch {
Write-Log "Ошибка при получении списка неактивных компьютеров: $_"
exit
}
# Проверяем, есть ли неактивные компьютеры
if ($inactiveComputers.Count -eq 0) {
$message = "Нет неактивных компьютеров за последние $inactiveDays дней."
Write-Host $message
Write-Log $message
} else {
foreach ($computer in $inactiveComputers) {
try {
Move-ADObject -Identity $computer.DistinguishedName -TargetPath $ou -ErrorAction Stop
$message = "Успешно перемещен компьютер: $($computer.Name) в $ou"
Write-Host $message
Write-Log $message
} catch {
$errorMessage = "Ошибка при перемещении компьютера: $($computer.Name). Ошибка: $_"
Write-Host $errorMessage
Write-Log $errorMessage
}
}
}