sql-server - 创建 Powershell 脚本以禁用大多数 SQL Server 登录

标签 sql-server powershell

首先,新手问题。提前抱歉;)

我正在尝试在 powershell 中创建一个两步脚本来更改不同服务器上的所有 sql server 登录名。

我的目标是能够在几秒钟内运行它,而无需访问管理工作室来执行此操作。这必须在大约 1000 台运行不同版本 SQL Express 的计算机上完成。

  • 第一步:更改 SA 密码。

    • 我测试过这个,没问题。我使用一个 txt 文件,其中包含服务器名称列表以及两个字符串作为密码和用户名。效果完美。
  • 第二步:禁用不在文本文件中的所有 SQL 登录(包括 Windows 身份验证),并保留要保留的登录列表。

这就是我被困住的地方。

我可以使用用户列表并禁用它们,但我想做相反的事情。我想禁用不在列表中但在 sql server 上启用的登录名。

我需要它以这种方式工作,因为如果不访问我们的客户端计算机/服务器,我就没有机会知道主机名和用户名,并且我需要它在没有手动过程的情况下快速完成。

这就是我所做的,以便能够禁用列表中的那些。它工作正常,但是......我需要相反的。

非常感谢您,如果这是一个愚蠢的问题,我们深表歉意。

问候, 路易斯

#DISABLE LOGINS ON THE LIST

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null
$Error.Clear()
cls
 
$servers = Get-Content C:\example\servers.txt
$logins = Get-Content C:\example\users.txt 
foreach($server in $servers)
{
    $srv = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $server
     
         
    
    foreach($login in $logins)
    {
        if ($srv.Logins.Contains($login)) 
        { 
            $srv.Logins[$login].disable(); 
        }
    }
}

最佳答案

$srv.Logins |
  Where-Object Name -notin $logins |
    ForEach-Object Disable

请注意,查找效率不高,因为每次登录都会在数组 $logins 中执行线性搜索,但这在实践中可能并不重要。

Where-ObjectForEach-Object来电使用simplified syntax .

关于sql-server - 创建 Powershell 脚本以禁用大多数 SQL Server 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69328985/

相关文章:

sql-server - Nodejs API 批量发布,正文中包含 JSON 数据

c# - 尝试将字节数组插入数据库时​​从 varchar 隐式转换为 varbinary 错误

powershell - Powershell 的 get-counters cmdlet 中返回的 "cooked value"是什么?

powershell - Powershell选择不同的异常(exception)

sql - Raiserror 中的断线

sql-server - 无法加载文件或程序集 'Microsoft.AnalysisServices.AppLocal.Core'

sql-server - 提取第 n 个单词以后

powershell - 如何修复 Windows 10 中 powershell 中的下载文件错误

powershell - 使用扩展字符串作为 Powershell 函数参数

PowerShell 工作流线程限制