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

如何编写PowerShell脚本批量禁用不在保留列表内的SQL Server登录名

调整后的脚本实现

核心逻辑变更说明:

  1. 将读取的保留登录名列表转为不区分大小写的哈希集合,大幅提升批量匹配效率,适配1000台设备的批量操作需求
  2. 改为遍历目标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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:54:02