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

无需导入AD模块 多域环境PowerShell获取密码过期日期方案问询

无AD模块依赖、非管理员权限下多域环境查询域账号密码过期方案

方案适配性说明

  • 规避net use /domain默认仅请求主域控制器的限制,可适配多域部署场景
  • 全程调用Windows原生内置组件,无需导入/加载AD模块,不需要提前安装RSAT管理工具
  • 所有操作仅需普通域用户默认权限即可完成,无需管理员权限,脚本转exe后可直接在普通账号环境运行
  • 实现逻辑与此前使用的VBA脚本同源,均基于ADSI LDAP查询,稳定性经过实际场景验证

核心实现原理

直接调用.NET内置的System.DirectoryServices ADSI接口完成查询,该接口自Windows XP/Server 2003版本起就随系统默认预装,无额外依赖。普通域用户默认拥有AD用户对象基础属性(密码最后设置时间、域密码最长有效期、账号控制标记)的读取权限,无需额外赋权。
多域场景下无需依赖系统自动发现的主域,直接逐域手动指定LDAP根路径发起查询即可,匹配到当前登录账号后计算密码过期时间。

PowerShell核心实现代码

# 替换为公司实际3个域的LDAP根路径
$domainList = @(
    "LDAP://DC=first-domain,DC=corp",
    "LDAP://DC=second-domain,DC=corp",
    "LDAP://DC=third-domain,DC=corp"
)
# 获取当前登录账号的samAccountName
$loginName = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.Split('\')[-1]
$passwordExpiryResult = $null

foreach ($ldapPath in $domainList) {
    try {
        # 初始化目录搜索器,仅查询需要的属性减少开销
        $searcher = New-Object System.DirectoryServices.DirectorySearcher(
            [System.DirectoryServices.DirectoryEntry]$ldapPath,
            "(&(objectCategory=person)(objectClass=user)(sAMAccountName=$loginName))",
            @("pwdLastSet", "maxPwdAge", "userAccountControl")
        )
        $searcher.PageSize = 1
        $searcher.CacheResults = $false
        $userResult = $searcher.FindOne()

        if ($userResult) {
            $userEntry = $userResult.GetDirectoryEntry()
            # 跳过设置了密码永不过期的账号
            if (-not ($userEntry.userAccountControl.Value -band 0x10000)) {
                $lastSetTime = [DateTime]::FromFileTime($userEntry.pwdLastSet.Value)
                $maxPasswordAge = [TimeSpan]::FromTicks(-$userEntry.maxPwdAge.Value)
                $expireTime = $lastSetTime.Add($maxPasswordAge)
                $passwordExpiryResult = [PSCustomObject]@{
                    BelongDomain = $ldapPath
                    LastSetTime  = $lastSetTime
                    ExpireTime   = $expireTime
                    RemainDays   = [math]::Round(($expireTime - Get-Date).TotalDays,0)
                }
            }
            break
        }
    }
    catch {
        # 单个域连接/查询失败自动跳过,继续查询下一个域
        continue
    }
}

if ($passwordExpiryResult) {
    Write-Host "账号密码过期时间:$($passwordExpiryResult.ExpireTime),剩余有效天数:$($passwordExpiryResult.RemainDays)"
}
else {
    Write-Host "未查询到当前账号的域密码信息,请检查域网络连通性"
}

转exe部署注意事项

  • 使用ps2exe等工具将脚本打包为exe时,不要勾选"要求管理员权限运行"选项,脚本所有逻辑均在普通用户权限下可执行
  • 脚本中不要加入任何Import-Module ActiveDirectory相关语句,完全规避AD模块依赖
  • 若域控做了LDAP签名强制要求,可在DirectoryEntry初始化时传入认证参数,普通账号默认凭据即可完成认证

该方案不存在第三方依赖,所有调用均为系统原生接口,不会触发杀毒软件的异常脚本拦截,适合企业内部批量部署。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:39:14