如何编写PowerShell脚本批量禁用不在保留列表内的SQL Server登录名
调整后的脚本实现
核心逻辑变更说明:
- 将读取的保留登录名列表转为不区分大小写的哈希集合,大幅提升批量匹配效率,适配1000台设备的批量操作需求
- 改为遍历目标SQL实例上的所有现有登录,筛选「不在保留列表内、且当前处于启用状态」的登录执行禁用操作
# 禁用所有不在保留列表内的启用状态SQL登录 [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null $Error.Clear() cls # 读取服务器列表、保留登录名列表 $servers = Get-Content C:\example\servers.txt # 转为不区分大小写的哈希集合,避免大小写差异导致的匹配错误 $allowedLogins = [System.Collections.Generic.HashSet[string]](Get-Content C:\example\users.txt, [System.StringComparer]::OrdinalIgnoreCase) foreach($server in $servers) { try { $srv = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $server # 遍历当前实例上的所有登录账号 foreach($login in $srv.Logins) { # 匹配规则:不在保留列表内 + 当前处于启用状态 if (-not $allowedLogins.Contains($login.Name) -and $login.IsEnabled) { $login.Disable() Write-Host "已禁用服务器 $server 上的登录: $($login.Name)" } } } catch { Write-Warning "连接服务器 $server 失败,错误信息: $_" } }
注意事项
- 保留登录名列表
users.txt里的登录名要和SQL实例中显示的完全一致,包括Windows身份验证的域名/主机名前缀,比如DOMAIN\admin、NT SERVICE\MSSQL$SQLEXPRESS这类内置服务账户如果需要保留也要写入列表 - 如果你需要保留SA账户,记得把
sa加入users.txt,避免被误禁用 - 脚本新增了异常捕获逻辑,单台服务器连接失败会输出警告,不会中断整体批量执行
- 如果需要先做模拟运行(仅输出要禁用的登录不实际执行),可以把
$login.Disable()这一行注释掉,确认匹配逻辑符合预期后再取消注释执行
内容的提问来源于stack exchange,提问作者Luís Ribeiro
相关产品推荐
相关产品推荐

