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

如何用PowerShell批量移除多台SQL Server中的多个用户

批量移除多台SQL Server服务器指定登录名及数据库用户的PowerShell脚本

以下是优化后的脚本,实现了从文件读取目标登录名、批量处理多台服务器,并修复了多服务器执行时的报错问题:

# 加载SMO程序集(推荐使用SqlServer模块,未安装则先执行:Install-Module -Name SqlServer -Scope CurrentUser)
try {
    Import-Module SqlServer -ErrorAction Stop
}
catch {
    # 兼容旧环境的SMO加载方式
    [System.Reflection.Assembly]::Load("Microsoft.SqlServer.Smo, Version=16.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91") | Out-Null
    [System.Reflection.Assembly]::Load("Microsoft.SqlServer.Management.SmoExtended, Version=16.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91") | Out-Null
}

# 配置文件路径
$serverListPath = "c:\Test\Servers.txt"
$loginListPath = "c:\Test\Logins.txt"

# 读取服务器列表和登录名列表
$servers = Get-Content -Path $serverListPath -ErrorAction Stop
$logins = Get-Content -Path $loginListPath -ErrorAction Stop

# 遍历每台服务器执行操作
foreach ($server in $servers) {
    Write-Host "正在处理服务器: $server" -ForegroundColor Cyan
    try {
        # 建立SMO服务器连接
        $srv = New-Object Microsoft.SqlServer.Management.Smo.Server($server)
        # 显式验证连接状态
        if (-not $srv.ConnectionContext.IsOpen) {
            $srv.ConnectionContext.Connect()
        }

        # 遍历数据库移除对应用户(默认跳过系统数据库)
        foreach ($database in $srv.Databases) {
            if ($database.IsSystemObject) {
                continue
            }
            foreach ($login in $logins) {
                if ($database.Users.Contains($login)) {
                    Write-Host "  从数据库 [$($database.Name)] 移除用户: $login" -ForegroundColor Yellow
                    $database.Users[$login].Drop()
                }
            }
        }

        # 移除服务器级登录名
        foreach ($login in $logins) {
            if ($srv.Logins.Contains($login)) {
                Write-Host "  从服务器移除登录名: $login" -ForegroundColor Yellow
                $srv.Logins[$login].Drop()
            }
        }

        Write-Host "服务器 $server 处理完成`n" -ForegroundColor Green
    }
    catch {
        Write-Host "处理服务器 $server 失败: $_" -ForegroundColor Red
        continue
    }
}

关键修改说明

  • 登录名动态读取:将硬编码的登录名列表改为从c:\Test\Logins.txt读取,文件格式为每行一个登录名(如DOMAIN\ALEX),无需修改脚本即可更新目标用户。
  • SMO加载优化:优先使用官方SqlServerPowerShell模块,兼容旧环境的程序集加载方式,避免弃用API的警告和兼容性问题。
  • 多服务器错误隔离:添加try/catch块捕获单台服务器的连接或操作异常,确保一台服务器失败不会中断整个批量任务。
  • 连接有效性验证:显式检查并建立SMO连接,避免因连接失败导致后续操作报错。
  • 系统数据库保护:默认跳过master、model等系统数据库,可根据需求注释对应代码取消限制。
  • 可视化日志:添加彩色状态提示,清晰跟踪每台服务器的执行进度和结果。

注意事项

  1. 权限要求:执行脚本的用户需拥有目标SQL Server的ALTER ANY LOGIN权限,以及各业务数据库的ALTER ANY USER权限。
  2. 文件格式:Servers.txt和Logins.txt需使用UTF-8/ANSI编码,每行一个条目,避免空行或多余空格。
  3. 测试建议:先在测试环境验证脚本逻辑,确认用户移除符合预期后再部署到生产环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:52:18