如何修改PowerShell脚本导出从未在所有AD域控制器登录的账户
问题:筛选从未在任何域控制器登录过的AD用户
需要找出**所有域控制器中LastLogon属性均未设置日期(值为0或'1/01/1601 11:00:00 AM')**的AD用户账户,即该用户从未在任何一台DC上登录过。
示例场景
假设共有36台域控制器:
- User1在DC1、DC2有登录记录 → 不纳入结果
- User2仅在DC2有登录记录 → 不纳入结果
- User3仅在DC32有登录记录 → 不纳入结果
- User4在所有36台DC均无登录记录 → 需要导出到CSV
- User5在所有36台DC均无登录记录 → 需要导出到CSV
现有PowerShell脚本会错误返回仅在部分DC登录过的用户,需修改脚本使其仅导出符合要求的用户。
原脚本问题分析
原脚本的核心错误在于循环中错误引用了管道对象$_.lastLogon,而非当前从DC获取到的$adUser对象的LastLogon属性,导致登录记录的判断逻辑失效,进而错误返回不符合条件的用户。
修改后的脚本
Function Get-ADLastLogonNever { [CmdletBinding()] Param ( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [ValidateNotNullOrEmpty()] [String]$SAMAccountName ) Begin { # 获取所有域控制器 $allDCs = Get-ADDomainController -Filter * } Process { $neverLoggedOn = $true ForEach ($dc in $allDCs) { # 从当前DC获取用户的LastLogon属性 $adUser = Get-ADUser -Identity $SAMAccountName -Properties LastLogon, DisplayName -Server $dc.Name # 检查当前DC上的LastLogon值是否大于0(即存在登录记录) If ($adUser.LastLogon -gt 0) { $neverLoggedOn = $false Break # 只要有一台DC有记录,就无需继续检查其他DC } } If ($neverLoggedOn) { # 输出符合条件的用户信息 $adUser | Select-Object -Property ` SamAccountName, DisplayName, @{n = 'DC'; e = {'<All>'}}, @{n = 'LastLogon'; e = {'<Never>'}} } } } # 从指定组中筛选符合条件的用户并导出到CSV(添加UTF8编码避免中文乱码) 'IT Team', 'Finance Team', 'HR Team' | Get-ADGroupMember | Get-ADLastLogonNever | Export-Csv -Path C:\result.csv -NoTypeInformation -Encoding UTF8
关键修改点
- 修正属性引用:将
$_.lastLogon改为$adUser.LastLogon,确保正确判断当前DC返回的用户登录记录 - 优化导出编码:添加
-Encoding UTF8参数,避免导出CSV时出现中文乱码问题
内容的提问来源于stack exchange,提问作者Senior Systems Engineer
相关产品推荐
相关产品推荐

