首先,新手问题。提前抱歉;)
我正在尝试在 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
中执行线性搜索,但这在实践中可能并不重要。
关于sql-server - 创建 Powershell 脚本以禁用大多数 SQL Server 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69328985/