You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PowerShell获取所有AD用户的允许登录时段并导出到Excel

AD用户允许登录时段查询及导出Excel实现方案

运行前提:需要在已安装Active Directory 模块的设备上运行(域控制器默认安装,成员服务器/工作站需安装RSAT-AD-PowerShell功能)


核心逻辑说明

AD的LogonHours属性为21字节的二进制数组,共168位,每一位对应一周中的1个小时(从周日零点开始按顺序排列),位值为1代表该时段允许登录,为0代表禁止。我们需要先将二进制数组转换为可读时段字符串,再导出表格。


完整实现脚本

# 加载AD模块
Import-Module ActiveDirectory

# 定义二进制LogonHours转可读时段的函数
function Convert-LogonHoursToReadable {
    param(
        [byte[]]$LogonHours,
        [int]$TimeZoneOffset = 8 # 北京时间为UTC+8,根据实际时区调整
    )
    # 处理无登录限制的情况(所有字节都是0xFF)
    if ($null -eq $LogonHours -or ($LogonHours | Where-Object { $_ -ne 0xFF }).Count -eq 0) {
        return "无限制"
    }
    $weekDays = @("周日","周一","周二","周三","周四","周五","周六")
    $allowedHours = @()
    # 遍历168位对应7*24小时
    for ($day = 0; $day -lt 7; $day++) {
        $dayHours = @()
        for ($hour = 0; $hour -lt 24; $hour++) {
            $totalHour = $day * 24 + $hour
            $adjustedHour = ($totalHour + $TimeZoneOffset) % 168 # 时区修正
            $byteIndex = [math]::Floor($adjustedHour / 8)
            $bitIndex = $adjustedHour % 8
            $bit = ($LogonHours[$byteIndex] -shr $bitIndex) -band 1
            if ($bit -eq 1) {
                $dayHours += $hour
            }
        }
        # 合并当日连续时段
        if ($dayHours.Count -gt 0) {
            $start = $dayHours[0]
            $end = $dayHours[0]
            for ($i = 1; $i -lt $dayHours.Count; $i++) {
                if ($dayHours[$i] -eq $end + 1) {
                    $end = $dayHours[$i]
                } else {
                    $allowedHours += "$($weekDays[$day]) $($start):00-$($end+1):00"
                    $start = $dayHours[$i]
                    $end = $dayHours[$i]
                }
            }
            $allowedHours += "$($weekDays[$day]) $($start):00-$($end+1):00"
        }
    }
    return $allowedHours -join ";"
}

# 查询所有AD用户并转换登录时段
$userLogonInfo = Get-ADUser -Filter * -Properties LogonHours | ForEach-Object {
    [PSCustomObject]@{
        "姓名" = $_.Name
        "允许登录时段" = Convert-LogonHoursToReadable -LogonHours $_.LogonHours
    }
}

# 导出方案1:原生导出CSV,可直接用Excel打开
$userLogonInfo | Export-Csv -Path "C:\AD用户登录时段.csv" -Encoding UTF8 -NoTypeInformation

# 导出方案2:若安装了ImportExcel模块,可直接导出为xlsx格式(需先执行Install-Module ImportExcel安装)
# $userLogonInfo | Export-Excel -Path "C:\AD用户登录时段.xlsx" -WorksheetName "登录时段" -AutoSize

结果说明

  • 若用户没有配置登录时段限制,允许登录时段列会显示无限制
  • 导出的文件路径可自行修改脚本中的路径参数
  • 若需要调整时区,修改函数里的TimeZoneOffset参数值即可

内容的提问来源于stack exchange,提问作者HeNeedsSomeMilk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:45:04