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

移除已禁用AD登录的PowerShell脚本无效,求排查问题

问题排查与脚本修正

你的脚本执行后未成功删除禁用AD用户对应的SQL登录,核心问题在于将登录列表转为逗号分隔字符串传递给Remove-DbaLogin,该 cmdlet 的-Login参数原生支持字符串数组,转成单字符串后无法正确识别多个登录项;同时脚本缺少AD用户不存在的错误处理,可能导致部分逻辑失效。

修正后的脚本

cls

# 获取目标SQL Server上的Windows用户登录,过滤CONTOSO-AD域且非计算机账户的登录
$sqlLogins = Get-DbaLogin -SqlInstance SQL-DWH-DEV -Type Windows | 
    Where-Object { 
        $_.LoginType -eq 'WindowsUser' -and 
        $_.Name -like 'CONTOSO-AD\*' -and 
        $_.Name -notlike '*$*'
    }

# 收集所有对应AD用户已禁用的SQL登录
$disabledLogins = foreach ($login in $sqlLogins) {
    $samAccountName = $login.Name -split '\\' | Select-Object -Last 1
    # 查询AD用户,忽略不存在的用户避免报错
    $adUser = Get-ADUser -Identity $samAccountName -ErrorAction SilentlyContinue
    if ($adUser -and -not $adUser.Enabled) {
        $login.Name  # 直接返回完整登录名,无需重新拼接
    }
}

# 移除禁用AD用户对应的SQL登录
if ($disabledLogins) {
    Remove-DbaLogin -SqlInstance SQL-DWH-DEV -Login $disabledLogins -Verbose
    # 如果不需要确认提示,添加 -Confirm:$false 参数
    # Remove-DbaLogin -SqlInstance SQL-DWH-DEV -Login $disabledLogins -Confirm:$false -Verbose
} else {
    Write-Host "未发现需要移除的禁用AD用户登录"
}

关键修改说明

  1. 参数传递优化:直接将$disabledLogins数组传给Remove-DbaLogin的-Login参数,避免字符串拼接导致的识别问题
  2. 错误处理增强:给Get-ADUser添加-ErrorAction SilentlyContinue,防止因SQL登录对应的AD用户已被删除而中断脚本执行
  3. 逻辑简化:直接使用$login.Name作为返回值,无需重新拼接域名和SamAccountName,减少出错概率
  4. 执行反馈:添加-Verbose参数可以查看每个登录的删除过程,方便排查;添加空值判断,避免无目标时执行删除命令

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:43:27