查找和管理 Active Directory 中的已禁用用户帐户是维护安全性和合规性的关键管理任务。已禁用的帐户会随着时间积累,造成安全隐患并使目录混乱。PowerShell 中的 Get-ADUser disabled 帐户 cmdlet 提供了强大的功能,可高效识别、筛选和导出已禁用的用户帐户。无论您是在进行安全审计、清理不活跃帐户,还是使用 PowerShell 生成合规报告的已禁用用户列表,本指南涵盖了跨整个域或特定组织单位查询已禁用用户的方法。
当您需要使用 PowerShell 将已禁用用户导出为 CSV 以进行报告或审计时,带有 enabled false 参数的 Get-ADUser cmdlet 提供了灵活的筛选选项。本综合指南向您展示如何使用 Get-ADUser 筛选已禁用帐户并以多种格式导出。
方法 1:使用 PowerShell 中的 Get-ADUser cmdlet 获取已禁用用户报告的步骤:
import-module activedirectory
$OutFile = 'C:\Scripts\DisabledUsers.csv'
# your output file
$filter = {Enabled -eq $false}
Get-ADUser -Filter $filter
| foreach {Add-Content -path
$OutFile "$($_.SamAccountName),
$($_.distinguishedName)"}
方法 2:使用 Search-ADAccount cmdlet 获取已禁用用户的步骤
导入 Active Directory 模块的方法:
Import-Module ActiveDirectory
获取所有已禁用用户帐户的方法:
Search-ADAccount -AccountDisabled -UsersOnly |
Select-Object Name, SamAccountName, DistinguishedName, LastLogonDate |
Export-CSV "C:\Scripts\DisabledUsers_SearchADAccount.csv" -NoTypeInformation
在 ADManager Plus 中查找已禁用用户:
使用 Get-ADUser 已禁用筛选器检索整个 Active Directory 域的完整列表。
Get-ADUser -Filter {Enabled -eq $false} |
Select-Object Name, SamAccountName, DistinguishedName
使用带有额外属性的 Get-ADUser enabled false cmdlet 检索已禁用用户及其经理的电子邮件地址以便通知。
$disabledUsers = Get-ADUser -Filter {Enabled -eq $false} -Properties Manager, EmailAddress, Department
$report = foreach ($user in $disabledUsers) {
$managerDN = $user.Manager
if ($managerDN) {
$manager = Get-ADUser $managerDN -Properties EmailAddress
[PSCustomObject]@{
UserName = $user.Name
UserEmail = $user.EmailAddress
Department = $user.Department
ManagerName = $manager.Name
ManagerEmail = $manager.EmailAddress
}
}
}
$report | Export-CSV "C:\Reports\DisabledUsers_WithManagers.csv" -NoTypeInformation
确定在特定时间范围内被禁用的帐户以供审计。
$30DaysAgo = (Get-Date).AddDays(-30)
Get-ADUser -Filter {Enabled -eq $false} -Properties WhenChanged, LastLogonDate, Description |
Where-Object {$_.WhenChanged -gt $30DaysAgo} |
Select Name, SamAccountName, WhenChanged, LastLogonDate, Description |
Export-CSV "C:\Reports\RecentlyDisabled.csv" -NoTypeInformation
使用 Get-ADUser 已禁用查询时,针对特定组织单位。
# Get-ADUser enabled false from specific OU
Get-ADUser -Filter {Enabled -eq $false} -SearchBase "OU=Sales,DC=domain,DC=com" -Properties * |
Select-Object Name, Title, Department, LastLogonDate |
Export-CSV "C:\Reports\SalesDisabledUsers.csv" -NoTypeInformation
Active Directory 没有原生的“DisabledDate”属性,但您可以使用以下方法跟踪帐户被禁用的时间:
方法 1:使用 WhenChanged 属性
获取带有大致禁用日期的 get-ADUser 已禁用帐户:
Get-ADUser -Filter {Enabled -eq $false} -Properties WhenChanged |
Select-Object Name, SamAccountName,
@{Name='ApproxDisableDate';Expression={$_.WhenChanged}},
@{Name='DaysSinceDisabled';Expression={(New-TimeSpan -Start $_.WhenChanged -End (Get-Date)).Days}} |
Export-CSV "C:\Reports\DisabledUsers_WithDates.csv" -NoTypeInformation
方法 2:查找最近被禁用的用户(最近 7、30 或 90 天)
PowerShell 获取特定时间范围内的已禁用用户:
function Get-RecentlyDisabledUsers {
param([int]$DaysAgo = 30)
$cutoffDate = (Get-Date).AddDays(-$DaysAgo)
Get-ADUser -Filter {Enabled -eq $false} -Properties WhenChanged, LastLogonDate |
Where-Object {$_.WhenChanged -ge $cutoffDate} |
Select-Object Name, SamAccountName,
@{Name='ApproxDisableDate';Expression={$_.WhenChanged}},
@{Name='DaysAgo';Expression={(New-TimeSpan -Start $_.WhenChanged -End (Get-Date)).Days}},
LastLogonDate |
Sort-Object WhenChanged -Descending
}
获取最近 30 天内被禁用的用户:
Get-RecentlyDisabledUsers -DaysAgo 30 |
Export-CSV "C:\Reports\RecentlyDisabled.csv" -NoTypeInformation
导出禁用用户到 CSV 对于报告、审计和合规性至关重要。
Get-ADUser -Filter {Enabled -eq $false} -Properties DisplayName, EmailAddress, Department, LastLogonDate |
Select-Object Name, SamAccountName, DisplayName, EmailAddress, Department, LastLogonDate |
Export-CSV "C:\Reports\DisabledUsers.csv" -NoTypeInformation
Write-Host "Export complete. File saved to C:\Reports\DisabledUsers.csv" -ForegroundColor Green
| 参数 | 描述 |
|---|---|
| -Filter | 使用 PowerShell 表达式语言指定条件 |
| -SearchBase | 指定要搜索的 OU 或容器 |
| -SearchScope | 定义搜索深度(Base、OneLevel、Subtree) |
| -Properties | 指定要检索的其他属性 |
| -LDAPFilter | 使用 LDAP 查询语法进行过滤 |
| -Server | 指定要查询的域控制器 |
两个命令都检索禁用用户,但工作方式不同:
Get-ADUser 提供更灵活的自定义过滤和属性选择:
Get-ADUser -Filter {Enabled -eq $false -and Department -eq "IT"} -Properties *
Search-ADAccount 针对帐户状态查询进行了优化,具有内置选项:
Search-ADAccount -AccountDisabled -UsersOnly -AccountInactive -TimeSpan 90.00:00:00
Search-ADAccount 对于简单的禁用帐户查询通常更快,而 Get-ADUser 提供更细粒度的过滤和属性控制。
没有直接的 WhenDisabled 属性,但可以使用以下方法:
方法 1: 检查 WhenChanged 属性(包含任何修改)
Get-ADUser -Filter {Enabled -eq $false} -Properties WhenChanged |
Select Name, WhenChanged
方法 2:搜索安全事件日志中的账户禁用事件(事件 ID 4725)
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4725} |
Select TimeCreated, Message
方法 3:使用复制元数据以提高准确性
Get-ADReplicationAttributeMetadata -Object (Get-ADUser "username").DistinguishedName -Properties userAccountControl
常见问题及解决方案:
语法错误:确保您使用的是脚本块的花括号
正确的脚本:
Get-ADUser -Filter {Enabled -eq $false}
错误的脚本:
Get-ADUser -Filter "Enabled -eq $false"
模块未导入:请先导入 AD 模块
Import-Module ActiveDirectory
权限问题:确认您对目标 OU 具有读取权限。
域错误:请指定正确的域控制器:
Get-ADUser -Filter {Enabled -eq $false} -Server "DC01.domain.com"
使用嵌套查询检索经理信息:
$disabledUsers = Get-ADUser -Filter {Enabled -eq $false} -Properties Manager, EmailAddress
$report = foreach ($user in $disabledUsers) {
if ($user.Manager) {
$managerInfo = Get-ADUser $user.Manager -Properties EmailAddress
[PSCustomObject]@{
UserName = $user.Name
UserEmail = $user.EmailAddress
ManagerName = $managerInfo.Name
ManagerEmail = $managerInfo.EmailAddress
}
}
}
$report | Export-CSV "C:\DisabledUsersWithManagers.csv" -NoTypeInformation
不能,Get-ADUser 仅检索用户对象。对于禁用的计算机,请使用 Get-ADComputer:
针对禁用的计算机:
Get-ADComputer -Filter {Enabled -eq $false} -Properties LastLogonDate
针对用户和计算机:
Get-ADObject -Filter {(ObjectClass -eq "user" -or ObjectClass -eq "computer") -and Enabled -eq $false}
在筛选器中组合多个条件:
$90DaysAgo = (Get-Date).AddDays(-90)
方法 1:使用 Get-ADUser
Get-ADUser -Filter {Enabled -eq $false} -Properties LastLogonDate |
Where-Object {$_.LastLogonDate -lt $90DaysAgo -or $_.LastLogonDate -eq $null}
方法 2:使用 Search-ADAccount
Search-ADAccount -AccountDisabled -UsersOnly -AccountInactive -TimeSpan 90.00:00:00