• 首页
  • PowerShell
  • 如何使用 PowerShell 查找 Active Directory 中的已禁用用户

如何使用 PowerShell 查找 Active Directory 中的已禁用用户

查找和管理 Active Directory 中的已禁用用户帐户是维护安全性和合规性的关键管理任务。已禁用的帐户会随着时间积累,造成安全隐患并使目录混乱。PowerShell 中的 Get-ADUser disabled 帐户 cmdlet 提供了强大的功能,可高效识别、筛选和导出已禁用的用户帐户。无论您是在进行安全审计、清理不活跃帐户,还是使用 PowerShell 生成合规报告的已禁用用户列表,本指南涵盖了跨整个域或特定组织单位查询已禁用用户的方法。

当您需要使用 PowerShell 将已禁用用户导出为 CSV 以进行报告或审计时,带有 enabled false 参数的 Get-ADUser cmdlet 提供了灵活的筛选选项。本综合指南向您展示如何使用 Get-ADUser 筛选已禁用帐户并以多种格式导出。

Windows PowerShell

方法 1:使用 PowerShell 中的 Get-ADUser cmdlet 获取已禁用用户报告的步骤:

  1. 确定要从中检索报告的域。
  2. 确定 PowerShell 获取已禁用用户查询所需的 LDAP 属性。
  3. 确定用于检索报告的主 DC。
  4. 编写 Get-ADUser enabled false 筛选脚本。
  5. 在 Windows PowerShell 中执行脚本。
  6. 报告将以请求的格式导出。
  7. 若要以不同格式获取报告,请根据用户需求相应修改脚本。
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 获取已禁用用户的步骤

  1. 以管理员身份打开 PowerShell。
  2. 导入 Active Directory 模块。
  3. 运行带有 -AccountDisabled 参数的 Search-ADAccount。
  4. 仅筛选用户(排除计算机帐户)。
  5. 如有需要,添加不活动期限等额外筛选条件。
  6. 将结果导出为您偏好的格式。

导入 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

在 ADManager Plus 中查找已禁用用户:

  1. 导航至 Reports > Account Status Reports > Disabled Users.
  2. 选择所需的域和 OU 以筛选用户。
  3. 点击 Generate
  4. 报告生成后,点击 Export As 以 HTML、CSV、XLS 或 PDF 格式下载。
  5. 您还可以从报告中即时执行删除或启用用户等操作。

示例用例和脚本

示例 1:获取域中所有已禁用用户

使用 Get-ADUser 已禁用筛选器检索整个 Active Directory 域的完整列表。

Get-ADUser -Filter {Enabled -eq $false} |
Select-Object Name, SamAccountName, DistinguishedName

示例 2:查找带有经理电子邮件地址的已禁用用户

使用带有额外属性的 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

示例 3:导出最近 30 天内被禁用的用户

确定在特定时间范围内被禁用的帐户以供审计。

$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

示例 4:使用 PowerShell 从特定 OU 导出已禁用用户到 CSV

使用 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

示例 5:查找用户帐户被禁用的时间(禁用日期)

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

示例 6:将禁用用户列表导出为 CSV 文件

导出禁用用户到 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 指定要查询的域控制器

管理 Active Directory 中禁用用户的最佳实践

  1. 员工离职后立即禁用帐户: 防止未经授权的访问,确保员工离职或被解雇后立即禁用帐户。
  2. 从所有安全组中移除: 禁用用户如果保留组成员身份,意外重新启用时会带来安全风险。
  3. 重置禁用帐户密码: 更改密码以防止帐户被错误重新激活时遭到泄露。
  4. 移动到专用的禁用用户 OU: 将禁用帐户隔离以便更好地应用安全策略。
  5. 导出定期合规报告: 生成每月禁用用户报告供管理层审阅。

使用 PowerShell 导出禁用 AD 用户的限制

  • 脚本复杂性: 创建全面报告需要高级 PowerShell 知识和多个 cmdlet 组合。
  • 性能问题: 大型域中数千个禁用帐户可能导致脚本运行缓慢或超时。
  • 错误处理挑战: 遇到权限问题或格式错误数据时,脚本可能无声失败,缺乏适当错误处理。
  • 过滤 UI 限制: 复杂的过滤组合需要仔细构造语法并进行测试。
  • 导出格式限制: 更改输出格式或添加视觉格式需要额外的 PowerShell 模块。

使用 ADManager Plus 导出禁用 AD 用户的亮点

  • 即时报告生成 通过单击即可访问预构建的禁用用户报告,无需编写脚本。
  • 可视化仪表板: 交互式图表显示按部门、OU 或不活跃时间的禁用用户。
  • 自动调度 设置定期报告并自动通过电子邮件发送给相关人员。
  • 批量操作 直接从报告结果启用、禁用或删除多个帐户。
  • 合规模板: 预配置的 SOX、HIPAA 和 GDPR 合规性报告。

使用 ADManager Plus 获取全面的禁用用户报告

常见问题解答

两个命令都检索禁用用户,但工作方式不同:

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
Active Directory管理与报告的一站式解决方案
电子邮件下载链接 Email the ADManager Plus download link