Powershell获取过去6个月内被禁用的AD用户的困惑?[重复]

问题描述 投票:1回答:2

我想知道哪些命令或脚本,可以使用或自定义搜索过去6个月内被禁用的AD用户账户?

脚本1:不知道如何定制下面这个脚本,因为它相当复杂。

# When an account is disabled, the userAccountControl attribute is set to 514. 
# Therefore, with Get-ADReplicationAttributeMetadata to find out when that attribute was the last set

$disabledUsers = Get-ADObject -Filter "ObjectClass -eq 'User' -and userAccountControl -eq '514'"

foreach ($disabledUser in $disabledUsers)
{
    Get-ADReplicationAttributeMetadata $disabledUser -Server localhost |
    Where-Object { $_.AttributeName -eq 'UserAccountControl' } | Select Object, LastOriginatingChangeTime |
    Where-Object { $_.LastOriginatingChangeTime -gt (Get-Date).AddDays(-180) }
}

脚本2:我不知道如何定制下面这个脚本,因为它相当复杂。我可以使用这个脚本,并得到我所需要的所有列和过滤,但是,它... ... 不显示在过去6个月内被禁用的AD账户。?

Import-Module ActiveDirectory
$domainDN = (Get-ADDomain).DistinguishedName

$excludeOUs = @(
    'OU=Shared Mailbox'
    'OU=Company Leaver'
) | ForEach-Object { $_ + ',' + $domainDN }

$Past = -180
$Days = (Get-Date).AddDays($Past)
$ResultPath = "C:\TEMP\ADLastLogonPast_$($Past)_Days.csv"
$properties = @('Name', 'mail', 'physicalDeliveryOfficeName', 'DisplayName', 'title', 'SamAccountName', 'CanonicalName', 'lastlogondate')
$filter = { (LastLogonDate -notlike '*' -or LastLogonDate -le $Days) -and (passwordLastSet -le $Days) -and (enabled -eq $True) -and (PasswordNeverExpires -eq $false) -and (whenCreated -le $Days) }

Get-ADUser -properties $properties -Filter $filter -SearchBase $domainDN |
Select-Object DisplayName,
              Title,
              PhysicalDeliveryOfficeName,
              UserPrincipalName,
              LastLogonDate,
              @{ n = 'LastLogonDaysAgo'; e = { [int]((Get-Date) - $_.LastLogonDate).TotalDays } },
              @{ n = 'CN'; e = { Split-Path $_.CanonicalName -Parent } },
              @{ n = 'ParentContainer'; e = { $_.DistinguishedName -replace '^CN=.*?(?=CN|OU)' } } | Where-Object {
                  ($_.SamAccountName -notmatch '^(Calendar|Room|Account|Fax|Team|Office|Test|User|SM_|HealthMailbox|SVC)$') -and
                  ($excludeOUs -notcontains $_.ParentContainer)
              } |
Export-Csv -NoTypeInformation -Path $ResultPath
powershell active-directory azure-powershell powershell-remoting windows-scripting
2个回答
3
投票

我会这样做。

# Midnight 180 days ago
$CutoffDate = [DateTime]::Today.AddDays(-180)

$UsersDisabledAfterCutoff = Search-ADAccount -AccountDisabled -UsersOnly |
    Get-ADReplicationAttributeMetadata -Server $DomainController -Properties UserAccountControl |
    Where-Object LastOriginatingChangeTime -ge $CutoffDate |
    Select-Object -Property Object, LastOriginatingChangeTime

脚本二: 脚本三: 脚本四: 脚本五: 脚本六: 脚本七: 脚本八: 脚本九: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: 脚本十: Search-ADAccount 命令可以很容易地找到账户的类别,而不需要在位面面具上做手脚。你一定会想看看 文献,以备后用因为它处理了大量这类事情的工作。

Get-ADReplicationAttributeMetadata 命令可以让你指定你要找的属性,从而减少每个人的工作量。有一个 -Filter 参数,但我发现它的性能有时很糟糕。


1
投票

假设你想查找在过去6个月内从启用到禁用的账户,那么你的第二个脚本不会告诉你这些。你只是在找那些被禁用的、超过6个月没有使用过的账户。或者最好的情况是,你可以修改一下,给你提供那些被禁用的、最近6个月内更新的账户。但有些账户可能在6个月前就已经被禁用了。

第一个脚本会得到你想要的,因为使用 Get-ADReplicationAttributeMetadata 允许您查找特定属性被修改的时间。因此,你可以找到当 userAccountControl 属性进行了修改。但确实需要修改一下。

首先,这个。

# When an account is disabled, the userAccountControl attribute is set to 514.

这不一定是真的 这个 userAccountControl 属性是一个位标志,这意味着二进制值中的每一个位都是一个标志,代表着不同的含义(1 =上。0 =关闭)。) 所以小数点的值并没有任何意义。要找出一个账户是否被禁用,你要看第二位。要做到这一点,你可以使用 位元运算符 -band.

该脚本也指向 localhost这意味着你必须在域控制器上运行它。但你可以很容易地修改,以找到一个域控制器指向。

我还在 Get-ADObject 只查找在过去6个月内修改过的账户,因为如果账户在6个月前被禁用,那肯定意味着它在6个月前被修改过。这就减少了您需要调用的账户数量。Get-ADReplicationAttributeMetadata 开启,降低了这个脚本的运行时间。注意过滤器周围的单引号,这很重要,因为PowerShell如何处理日期。

$sixMonthsAgo = (Get-Date).AddDays(-180)

$disabledUsers = Get-ADObject -Filter 'ObjectClass -eq "User" -and whenChanged -ge $sixMonthsAgo -and UserAccountControl -band 2'

$server = Get-ADDomainController

foreach ($disabledUser in $disabledUsers)
{
    Get-ADReplicationAttributeMetadata $disabledUser -Server $server -Properties UserAccountControl |
    Where-Object { $_.AttributeName -eq 'UserAccountControl' } | Select Object, LastOriginatingChangeTime |
    Where-Object { $_.LastOriginatingChangeTime -gt $sixMonthsAgo }
}

(由于某些原因,我发现 Get-ADReplicationAttributeMetadata 当我在PowerShell ISE中运行这个脚本时,并没有给我任何数据,但当我复制粘贴到普通的PowerShell窗口中时,它却能正常工作。不知道为什么,但值得一提。)

从技术上讲,这仍然可能无法准确地找到账户被禁用的时间,因为它是在寻找 任何 变化 userAccountControl. 例如,有可能有人在禁用账户后,将账户设置为 "密码不过期",这也会改变账户的 userAccountControl 属性,而这个脚本会查看 "不要过期密码 "更改的日期,而不是禁用的日期。但在大多数情况下,这种事情是不会发生的。

© www.soinside.com 2019 - 2024. All rights reserved.