使用PowerShell读取AD中AllowLogon属性显示信息不准确如何解决
问题根因
- 你当前脚本读取的是ADSI本地缓存的属性值,不是AD实际存储的属性,所以即使实际写入失败,也会返回你刚设置的
0值,误报修改成功 - 受保护用户组(域管理员、企业管理员等)的属性会被AD的SDProp进程定期重置,手动修改会被覆盖
- 你运行脚本的账号对部分用户所在OU没有
userParameters属性的写入权限,ADSI默认会静默忽略权限错误,不会抛出异常 - 部分用户的RDS登录权限继承自OU级别的组策略或用户配置模板,用户级的设置会被上级配置覆盖
修正后的脚本
# 读取用户SamAccountName列表 $ADUsers = Get-Content "C:\PSTOOLS\Passwordneverexpire\disable-enbale deny logon.txt" ForEach ($User in $ADUsers) { try { $adUser = Get-ADUser -Identity $User -Properties AllowLogon -ErrorAction Stop # 设置AllowLogon属性为0,即拒绝RDS登录 $adUser.AllowLogon = 0 Set-ADUser -Instance $adUser -ErrorAction Stop # 重新从AD查询属性,确认修改生效 $verifyUser = Get-ADUser -Identity $User -Properties AllowLogon if ($verifyUser.AllowLogon -eq 0) { Write-Host "$User 已成功设置为拒绝RDS登录" } else { Write-Host "$User 修改失败,当前AllowLogon属性值为:$($verifyUser.AllowLogon)" } } catch { Write-Host "$User 处理失败:$_" } }
额外排查步骤
- 如果是受保护组用户需要修改,需要先调整AD的AdminSDHolder配置,或者单独对这些用户设置排除
- 检查用户所在OU的组策略,确认没有强制配置RDS登录权限的策略
- 确认运行脚本的账号拥有所有目标用户对象的
写入所有用户属性权限,或者至少对userParameters属性有写入权限 - 修改完成后等待AD域控同步完成后再验证属性,避免跨域控查询的同步延迟问题
内容的提问来源于stack exchange,提问作者Evo
相关产品推荐
相关产品推荐

