Вопрос или проблема
Я пытаюсь получить список последних вошедших пользователей, используя PowerShell.
Я попробовал следующее, но это не показывает пользователя:
$ou = "OU=MyOU,DC=test,DC=com"
# Получить компьютеры из указанного OU
$computers = Get-ADComputer -Filter * -SearchBase $ou -Properties Name, DistinguishedName
foreach ($computer in $computers) {
$lastLoggedOnUser = $null
try {
$lastLoggedOnUser = (Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName $computer.Name -ErrorAction Stop).UserName
} catch {
$lastLoggedOnUser = "Не удалось получить"
}
[PSCustomObject]@{
ComputerName = $computer.Name
OU = ($computer.DistinguishedName -split ',',2)[1]
LastLoggedOnUser = $lastLoggedOnUser
}
}
Ответ или решение
Для получения списка последних вошедших пользователей из конкретного организационного подразделения (OU) в Active Directory (AD) с использованием PowerShell, необходимо учесть некоторые аспекты, чтобы обеспечить корректность и полноту информации. Ваш текущий скрипт позволяет извлечь имя пользователя, но он может не полностью соответствовать вашим требованиям. Мы рассмотрим улучшенную версию кода и добавим дополнительные объяснения.
Задача
- Получить список компьютеров из указанного OU.
- Для каждого компьютера извлечь данные о последнем вошедшем пользователе.
- Вернуть результаты в удобочитаемом формате.
Усовершенствованный скрипт PowerShell
# Определяем OU
$ou = "OU=MyOU,DC=test,DC=com"
# Получаем компьютеры из указанного OU
$computers = Get-ADComputer -Filter * -SearchBase $ou -Properties Name, DistinguishedName
# Создаем список для хранения результатов
$results = @()
foreach ($computer in $computers) {
$lastLoggedOnUser = $null
$lastLogonTime = $null
try {
# Получаем информацию о системе
$cimInstance = Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName $computer.Name -ErrorAction Stop
$lastLoggedOnUser = $cimInstance.UserName
# Получаем последний вход пользователя
$lastLogonTime = Get-ADUser -Identity $lastLoggedOnUser -Properties LastLogonTimestamp | Select-Object -ExpandProperty LastLogonTimestamp
if ($lastLogonTime) {
# Преобразуем значение времени в читаемый формат
$lastLogonTime = [DateTime]::FromFileTime($lastLogonTime).ToLocalTime()
} else {
$lastLogonTime = "Информация отсутствует"
}
} catch {
$lastLoggedOnUser = "Не удалось получить"
$lastLogonTime = "Не удалось получить"
}
# Добавляем результаты в массив
$results += [PSCustomObject]@{
ComputerName = $computer.Name
OU = ($computer.DistinguishedName -split ',',2)[1]
LastLoggedOnUser = $lastLoggedOnUser
LastLogonTime = $lastLogonTime
}
}
# Выводим результаты
$results | Format-Table -AutoSize
Описание кода
- Определение OU: Переменная
$ou
указывает на интересующее вас организационное подразделение. - Получение компьютеров: Используется
Get-ADComputer
для извлечения компьютеров, находящихся в указанном OU. - Цикл обработки: Для каждого компьютера:
Get-CimInstance
извлекает данные о системе, включая имя последнего вошедшего пользователя.Get-ADUser
используется для полученияLastLogonTimestamp
, который и показывает время последнего входа пользователя в систему.- Обработка ошибок через блок
try/catch
, чтобы избежать остановки скрипта при возникновении проблем с соединением или недостаточными правами.
- Форматирование вывода: Результаты собираются в объект
PSCustomObject
, который затем выводится в виде таблицы.
Заключение
Данный подход обеспечивает вам необходимую информацию о последних входах пользователей по каждому компьютеру в определенном OU. Убедитесь, что у вас есть соответствующие права доступа для выполнения этих команд, так как доступ к данным пользователей может быть ограничен. Использование PowerShell для автоматизации такой задачи значительно упростит управление Active Directory в вашей организации.