Я пытаюсь выполнить поиск в AD с помощью PowerShell, чтобы найти только компьютеры (не серверы или другие), на которые был выполнен вход в течение последних 30 дней. У меня есть большая часть сценария, за исключением 30-дневной части. Любая помощь будет принята с благодарностью.
Get-ADComputer -Filter * -Properties * | FT Name, OperatingSystem, LastLogonDate -Autosize | Исходящий файл C: \ Temp \ ComputerLastLogonDate.csv
Get-ADComputer -Filter * -Properties *
Получите только те свойства, которые собираетесь использовать ... это более эффективно. Получение всех свойств всех компьютеров в домене, когда вам действительно не нужны все свойства, излишне требует от вашего контроллера домена. Это расточительно.
Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate
лучше, так как вам не нужно все свойства. (Свойство «Имя» всегда включено.)
| Имя FT, операционная система, LastLogonDate -Autosize
Не форматируйте вывод до самого конца. Другими словами, Format-Table и Format-List должны быть последними командлетами во всей цепочке командлетов, которым передаются данные.
Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate |
Where { $_.LastLogonDate -GT (Get-Date).AddDays(-30) }
Это немного лучше, но все еще есть некоторая неэффективность, так как вы все еще получаете набор данных все компьютеры ... вы можете позволить контроллеру домена выполнять фильтрацию за вас.
$LastMonth = $(((Get-Date).AddDays(-30)).ToFileTime())
Get-ADComputer -LDAPFilter "(lastLogonTimeStamp>=$LastMonth)" -Properties OperatingSystem,LastLogonDate
Причина, по которой я использовал там lastLogonTimeStamp (который является «временем файла», а не .NET DateTime), заключается в том, что «LastLogonDate» не является настоящим атрибутом LDAP. LastLogonDate - это просто полезный способ PowerShell для автоматического преобразования атрибута lastLogonTimestamp за вас. lastLogonTimestamp - это «настоящий» атрибут LDAP.
Разрешение контроллеру домена возвращать вам отфильтрованный набор вместо полного набора ВСЕХ компьютеров означает, что меньше данных передается по сети и меньше данных для обработки PowerShell.
Также обратите внимание, что вам придется иметь дело с компьютерами, которые:
Ваша команда вообще не фильтрует только рабочие станции.
Вам необходимо использовать поле LastLogonTimeStamp, чтобы вы могли легко фильтровать его, а затем преобразовывать его в DateTime для экспорта.
Эта информация также доступна в Интернете. Как и в этом примере, который я немного изменил, чтобы отображать только рабочие станции. Обратите внимание, что они запрашивают только необходимые свойства. Это более эффективно. Кроме того, я понятия не имею, почему в этом скрипте есть переменная $ domain. Это кажется совершенно бесполезным.
# Gets time stamps for all computers in the domain that have NOT logged in since after specified date
# Mod by Tilo 2013-08-27
import-module activedirectory
$domain = "domain.mydom.com"
$DaysInactive = 90
$time = (Get-Date).Adddays(-($DaysInactive))
# Get all AD computers with lastLogonTimestamp less than our time
Get-ADComputer -Filter {LastLogonTimeStamp -lt $time -and OperatingSystem -notlike "*server*"} -Properties LastLogonTimeStamp,OperatingSystem |
# Output hostname and lastLogonTimestamp into CSV
select-object Name,@{Name="Stamp"; Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp)}} | export-csv OLD_Computer.csv -notypeinformation
Ссылка отсюда: https://gallery.technet.microsoft.com/scriptcenter/Get-Inactive-Computer-in-54feafde
Также см. Следующие ссылки по этому поводу:
Это должно помочь вам начать движение в том направлении, в котором вы хотите двигаться.
Get-ADComputer -Properties * -Filter {
Enabled -eq $True -and
OperatingSystem -like 'Windows*' -and
OperatingSystem -notlike "Windows Server*" -and
OperatingSystem -notlike "Windows 7*"
} -SearchBase "DC=hhmtx,DC=org" | FT Name, OperatingSystem, LastLogonDate -Autosize | Out-File C:\Temp\ComputerLastLogonDate.csv
Имейте в виду, что LastLogonDate - это преобразованная версия LastLogonTimeStamp. LastLogonTimeStamp не является самым точным представлением фактического времени последнего входа в систему компьютера. По умолчанию он может быть отключен на 14 дней. Больше информации - https://social.technet.microsoft.com/wiki/contents/articles/22461.understanding-the-ad-account-attributes-lastlogon-lastlogontimestamp-and-lastlogondate.aspx
Если вы хотите получить более точное время последнего входа в систему, вам нужно использовать атрибут lastLogon, но он не реплицируется на все контроллеры домена, поэтому вам нужно выполнить итерацию всех контроллеров домена, чтобы получить последнее значение. Вы должны рассчитать время последнего входа в систему, и только тогда вы можете ограничить его «последними 30/60/90 днями».
Здесь вы можете найти пример реализации этого алгоритма для получения времени последнего входа пользователя в систему:
Import-Module ActiveDirectory
function Get-ADUserLastLogon([string]$userName)
{
$dcs = Get-ADDomainController -Filter {Name -like "*"}
$time = 0
foreach($dc in $dcs)
{
$hostname = $dc.HostName
$user = Get-ADUser $userName | Get-ADObject -Properties lastLogon
if($user.LastLogon -gt $time)
{
$time = $user.LastLogon
}
}
$dt = [DateTime]::FromFileTime($time)
Write-Host $username "last logged on at:" $dt }
Get-ADUserLastLogon -UserName username
Есть альтернативные способы получить тот же результат проще и быстрее. Вы можете попробовать инструмент отчетности Active Directory - AD FastReporter Бесплатно. Он сделает за вас точный расчет последнего входа в систему. Просто установите его, перейдите на вкладку «Компьютеры» и выберите - «Компьютеры, которые входили в систему последние 30 дней», нажмите «Создать». В результате появятся и серверы постоянного тока, но их можно легко удалить после экспорта в файлы .csv, .xlsx. P.S. Я владелец и разработчик этого инструмента.