移除已禁用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用户登录" }
关键修改说明
- 参数传递优化:直接将
$disabledLogins数组传给Remove-DbaLogin的-Login参数,避免字符串拼接导致的识别问题 - 错误处理增强:给
Get-ADUser添加-ErrorAction SilentlyContinue,防止因SQL登录对应的AD用户已被删除而中断脚本执行 - 逻辑简化:直接使用
$login.Name作为返回值,无需重新拼接域名和SamAccountName,减少出错概率 - 执行反馈:添加
-Verbose参数可以查看每个登录的删除过程,方便排查;添加空值判断,避免无目标时执行删除命令
内容的提问来源于stack exchange,提问作者Alex Gelshtein
相关产品推荐
相关产品推荐

