如何使用PowerShell列出logonHours配置为登录被拒绝的AD用户
问题原因
AD的LogonHours属性本身是**字节数组(Byte[])**类型,你直接将其强制转换为[string]时,得到的是字节对应的ASCII字符拼接结果,而非空格分隔的数字字符串,和你提前定义的"0 0 0 ..."字符串格式完全不匹配,所以会出现匹配失败的情况。
解决方案
直接将基准匹配值定义为全0的21字节数组,再将两个字节数组统一转为空格分隔的数字串对比即可,同时可以优化查询逻辑避免重复请求AD。
修正后代码
# 定义全0的21字节基准值,对应所有时间段禁止登录 $disabledLogonHours = [byte[]]::CreateInstance([byte], 21) # 如需查询所有用户用下面这行 Get-ADUser -Filter * -Properties LogonHours | ForEach-Object { # 如需仅查询特定用户hugo,替换上面一行为:Get-ADUser -Identity hugo -Properties LogonHours | ForEach-Object { # 跳过未配置LogonHours的用户(默认允许全时段登录),如果需要包含这类可以去掉这个判断 if ($null -eq $_.LogonHours) { return } # 对比字节数组转成的空格分隔字符串 if (($_.LogonHours -join ' ') -eq ($disabledLogonHours -join ' ')) { Write-Host $_.SamAccountName "- Login disabled" } }
注意事项
- 21字节的全0数组刚好对应一周7天、每天24小时共168位的登录时间控制,每一位为0代表对应小时禁止登录,全0即完全禁止登录。
- 如果需要包含未配置过
LogonHours的用户(属性为$null),将代码中的$null判断去掉,同时调整匹配逻辑为$null -eq $_.LogonHours -or (...)即可。
内容的提问来源于stack exchange,提问作者Ale_noob
相关产品推荐
相关产品推荐

