如何使用 PowerShell 查找 Active Directory 中不活动的计算机和用户?
Active Directory 管理员的一项常见任务是列出禁用或不活动的用户和/或计算机帐户。您可以使用 ADUC 控制台中保存的 LDAP 查询和 PowerShell cmdlet 来获取 Active Directory 域中非活动对象的列表。在本文中,我们将向您展示如何使用 PowerShell 查找不活动的用户和计算机帐户。
Active Directory 管理员需要定期禁用和删除未使用的计算机和用户帐户。这将减少 AD 数据库(ntds.dit 文件)的大小,并降低攻击者或前员工使用旧帐户访问域的风险。
为了使用下面讨论的所有 PowerShell cmdlet,计算机上必须至少安装 PowerShell 3.0 版和远程服务器管理工具包 (RSAT)。从 RSAT 启用 Windows PowerShell 的 Active Directory 模块(控制面板 -> 程序 -> 打开和关闭 Windows 功能 -> 远程服务器管理工具 -> 角色管理工具 -> AD DS 和 AD LDS 工具)。
在最新的 Windows 10 版本中安装 RSAT 功能的详细信息。
还可以使用以下命令启用此 PowerShell 模块:
Add-WindowsFeature RSAT-AD-PowerShell启动 PowerShell 控制台并导入 Active Directory for PowerShell 模块:
Import-Module ActiveDirectory如何查找 Active Directory 域中不活动(旧)的计算机?
您可以使用 Get-ADComputer cmdlet 查找域中不活动的计算机对象。 LastLogonTimeStamp 属性可用作搜索条件。请注意,此属性不能用于检索有关计算机上次登录域的实时信息。但是,由于此属性每 9-14 天在 DC 之间复制一次,因此您可以从任何域控制器获取有关上次计算机登录时间的信息(与 LastLogonDate 属性不同,后者仅在计算机登录的 DC 上更新)。
您可以在 ADUC 控制台的“属性编辑器”选项卡上的计算机属性中检查 LastLogonTimeStamp 属性的当前值。
使用以下命令查找特定 OU 中超过 180 天未登录的所有计算机:
$LastLogonDate= (Get-Date).AddDays(-180)
Get-ADComputer -Properties LastLogonTimeStamp -Filter {LastLogonTimeStamp -lt $LastLogonDate } -SearchBase ‘OU=Computers,OU=Mun,DC=a-d,dc=com’| Sort LastLogonTimeStamp| FT Name, @{N='lastlogontimestamp'; E={[DateTime]::FromFileTime($_.lastlogontimestamp)}} -AutoSize | Export-CSV c:\ps\inactive_computers.csv此命令将生成一个 CSV 文件,其中包含超过六个月未在域中注册的不活动计算机的列表。
您可以禁用找到的计算机帐户:
Get-ADComputer -Properties LastLogonTimeStamp -Filter {LastLogonTimeStamp -lt $LastLogonDate } -SearchBase ‘OU=Computers,OU=Mun,dc=a-d,dc=com’| Disable-ADAccount将这些计算机对象移至单独的 OU:
Get-ADComputer ... | Move-ADObject -TargetPath “OU=Disabled Computers,DC=a-d,DC=com”
或者删除不活动的计算机:
Get-ADComputer ... | Remove-ADComputer在 Active Directory 中查找不活动的用户帐户
您还可以使用lastLogonTimeStamp属性来查找不活动的用户帐户。要构建非活动用户列表,您需要使用此属性,而不是lastLogon(lastLogon 属性不会在域控制器之间复制)。
以下脚本允许使用 Get-ADUser cmdlet 选择超过六个月(180 天)未登录域的已启用用户帐户:
$LastLogonDate= (Get-Date).AddDays(-180)
Get-ADUser -Properties LastLogonTimeStamp -Filter {LastLogonTimeStamp -lt $LastLogonDate } -SearchBase ‘OU=Users,OU=Mun,dc=a-d,dc=com’| ?{$_.Enabled -eq $True} | Sort LastLogonTimeStamp| FT Name, @{N='lastlogontimestamp'; E={[DateTime]::FromFileTime($_.lastlogontimestamp)}} -AutoSize | Export-CSV c:\ps\inactive_users.csv您可以禁用不活动的用户:
Get-ADUser -Properties LastLogonTimeStamp -Filter {LastLogonTimeStamp -lt $LastLogonDate } -SearchBase ‘OU=Users,OU=Mun,dc=a-d,dc=com’| Disable-ADAccount如果您需要从 AD 中删除不活动的用户帐户,请使用以下管道:
Remove-ADUser。
使用 Search-ADAccount 查找非活动 AD 对象
您可以使用 Get-ADUser、Get-ADComputer 或 Get-ADObject cmdlet 查找 AD 中的非活动对象。然而,为这些命令创建正确的过滤器可能很棘手。 ActiveDirectory PowerShell 模块有一个更方便的 cmdlet 来执行这些任务 - Search-ADAccount。此 cmdlet 用于查找任何类型的对象(用户和计算机)。让我们看一下使用 Search-ADAccount cmdlet 执行在 AD 中搜索禁用、非活动和锁定对象的典型任务的示例。
以下是 Search-ADAccount cmdlet 的最重要键的列表:
- -AccountDisabled
搜索禁用帐户
- -AccountExpired
-
搜索过期账户
- -AccountExpiring [-DateTime DateTime] [-TimeSpan TimeSpan]
搜索在特定时间段(-TimeSpan)或特定日期(-DateTime)内到期的帐户
- -AccountInactive [-DateTime DateTime] [-TimeSpan TimeSpan]
搜索自特定日期(-DateTime)或特定时间段(-TimeSpan)以来未登录的帐户
- -LockedOut
查询域密码策略锁定的账户
- -PasswordExpired
搜索密码过期的帐户
- -PasswordNeverExpires
设置了 PasswordNeverExpires 属性的帐户(UserAccountControl 属性)
注意。默认情况下,Search-ADAccount cmdlet 同时搜索用户和计算机帐户。要仅搜索用户或计算机,您需要使用以下键之一:ComputersOnly或UsersOnly。
例如,让我们显示域中禁用的用户帐户的列表:
Search-ADAccount -UsersOnly -AccountDisabled您可以将搜索范围限制为特定的 Active Directory 容器 (OU):
Search-ADAccount -UsersOnly -AccountDisabled -searchbase "OU=Admins,OU=Accounts,DC=a-d,DC=com"使用以下命令可以以更方便的表格形式呈现相同的数据:
Search-ADAccount -UsersOnly -AccountDisabled -searchbase "OU=Admins,OU=Accounts,DC=a-d,DC=com"|ft -AutoSize如果您需要获取包含某些用户属性的禁用用户列表并将其呈现为要排序的图表,请运行以下命令:
Search-ADAccount -UsersOnly AccountDisabled |sort LastLogonDate | Select Name,LastLogonDate,DistinguishedName |out-gridview -title "Disabled Users"锁定的用户帐户列表:
Search-ADAccount -UsersOnly -LockedOut过去 60 天内不活动的用户帐户列表:
$timespan = New-Timespan -Days 60
Search-ADAccount -UsersOnly -AccountInactive -TimeSpan $timespan | ?{$_.Enabled -eq $True}要计算这些用户帐户的数量:
Search-ADAccount -UsersOnly -AccountInactive -TimeSpan $timespan | ?{$_.Enabled -eq $True} | Measure过去 90 天内未在域网络中注册的计算机列表:
Search-ADAccount -AccountInactive -ComputersOnly -TimeSpan 90或者从某个日期开始:
Search-ADAccount -AccountInactive -ComputersOnly -DateTime ‘1/1/2021’|Select Name,LastLogonDate| ft要将对象列表导出到 CSV,请使用以下命令:
Search-ADAccount -AccountDisabled -UsersOnly| Export-Csv "c:\ps\disabled_users.csv"





