如何查找禁用特定日期的用户
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
有人可以帮我在特定时间范围内从 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