无需导入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
相关产品推荐
相关产品推荐

