如何查找禁用特定日期的用户

How to find users who were disabled specific dates

有人可以帮我在特定时间范围内从 AD 中找到已禁用的帐户吗?

例如,我可以 运行 显示过去 30 天、60 天、90 天的脚本

Search-ADAccount -SearchBase "DC=A,DC=B,DC=C,DC=X" -AccountDisabled -UsersOnly | Get-ADUser -Properties whenChanged | Where whenChanged -gt (Get-Date).AddDays(-60) | Export-CSV “C:\Disabledusers60.CSV” –NoTypeInformation

问题是这样我也会看到现在的 2022 年 1 月的,我的想法是能够 运行 一个特定的日期,所以在 2 月底有一个列表12 月 1 日至 12 月 31 日之间的禁用用户。然后在 3 月获得 1 月 1 日至 1 月 31 日的列表,依此类推。

这种方式不会退出最近 60 天的 AD,包括当月禁用的帐户。

抱歉大线程的解释,希望有人能在这里带来一些启发。

这应该给你一个 AD 用户列表,这些用户是 Disabled 并且他们的 WhenChanged 属性是 between 本月的第一天和最后一天。

$today = [datetime]::Today
$firstDay = [datetime]::new($today.Year, $today.Month, 1, 0, 0, 0).ToString('yyyyMMddHHmmss.0Z')
$lastDay = [datetime]::new($today.Year, $today.Month + 1, 1, 0, 0, 0).AddSeconds(-1).ToString('yyyyMMddHHmmss.0Z')

$params = @{
    SearchBase = "OU=Finance,OU=UserAccounts,DC=FABRIKAM,DC=COM"
    Properties = "whenChanged"
    LDAPFilter = "(&(userAccountControl:1.2.840.113556.1.4.803:=2)(whenChanged>=$firstDay)(whenChanged<=$lastDay))"
}

Get-ADUser @params | Export-Csv ...

如果您需要查询不同的时间范围,则需要更新变量 $firstDay$lastDay,例如 2021 年 9 月

$firstDay = [datetime]::new(2021, 9, 1, 0, 0, 0).ToString('yyyyMMddHHmmss.0Z')
# 10 => Being the next Month and .AddSeconds(-1) for the last second of the Previous Month (9)
# If this was for the Month of December:
# [datetime]::new(2022, 1, 1, 0, 0, 0).AddSeconds(-1)
$lastDay = [datetime]::new(2021, 10, 1, 0, 0, 0).AddSeconds(-1).ToString('yyyyMMddHHmmss.0Z')

如评论所述,whenChanged 属性不一定是用户被禁用的日期和时间,因为之后可能会对用户帐户进行其他修改。

如何探测事件 4725 的 windows 事件日志(==> 用户帐户已被禁用)?

感谢 ,他评论说事件不会跨域控制器复制,您需要遍历所有域控制器才能获得结果

# example timeframe December 2021
$startTime = [datetime]'12/1/2021'
$endTime   = $startTime.AddMonths(1).AddDays(-1)
$filter    = @{LogName='Security';ProviderName='Microsoft-Windows-Security-Auditing';ID=4725;StartTime=$startTime;EndTime=$endTime }
$DCs       = (Get-ADDomainController -filter *).Name  # or HostName for fqdn

$result = foreach ($dc in $DCs) {
    # you may need to use the -Credential parameter on Get-WinEvent
    # to supply the credentials of a domain administrator
    Get-WinEvent -FilterHashtable $filter -ComputerName $dc | ForEach-Object {
        # convert the event to XML and grab the Event node
        $eventXml   = ([xml]$_.ToXml()).Event
        $userName   = ($eventXml.EventData.Data | Where-Object { $_.Name -eq 'TargetUserName' }).'#text'
        $userSID    = ($eventXml.EventData.Data | Where-Object { $_.Name -eq 'TargetSid' }).'#text'
        $userDomain = ($eventXml.EventData.Data | Where-Object { $_.Name -eq 'TargetDomainName' }).'#text'
        # output the properties you need
        [PSCustomObject]@{
            UserName   = $userName
            UserSID    = $userSID
            UserDomain = $userDomain
            Disabled   = [DateTime]$eventXml.System.TimeCreated.SystemTime
        }
    }
}

# output on screen
$result | Format-Table -AutoSize  # or use Out-GridView if you prefer

# output to CSV file
$outFile = 'X:\DisabledUsers_{0:MMM-yyyy}.csv' -f $startTime
$result | Export-Csv -Path $outFile -NoTypeInformation