通过 Powershell 从 SQL 服务器数据库中删除用户

Dropping Users from SQL Server Database via Powershell

我正在尝试使用以下代码通过 PowerShell 从 SQL 服务器数据库中删除用户:

$sql_server = "mysqlserver"
$dbname = "mydb"

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null

$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server")($sql_server)
$db = $server.Databases["$dbname"]
$logins = $db.users

if ($logins.count -gt 0) {
    foreach ($login in $logins) {
        if ($login -notmatch "\[dbo\]|\[guest\]|\[INFORMATION_SCHEMA\]|\[sys\]") {
            $user = $login -replace '[^a-zA-Z\.\]'
            write-host "Dropping $user"
            $db.Users[$user].Drop();
        }
    }
}

但是我收到一条错误消息:

Collection was modified; enumeration operation may not execute. + foreach ($login in $logins) { + ~~~~~~ + CategoryInfo : OperationStopped: (:) [], InvalidOperationException + FullyQualifiedErrorId : System.InvalidOperationException

我认为它说 $logins 正在被更改是因为我正在删除用户?我不确定如何解决这个问题?


编辑


以下应该有效。感谢@Neil Hibbert 的帮助。

$sql_server = "mysqlserver"
$dbname = "mydb"

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null

$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server")($sql_server)
$db = $server.Databases["$dbname"]
$logins = $db.users

if ($logins.count -gt 0) {
    for ($i=0; $i -lt $logins.count; $i++) {
        if ($logins[$i] -notmatch "\[dbo\]|\[guest\]|\[INFORMATION_SCHEMA\]|\[sys\]") {
            $user = $logins[$i] -replace '[^a-zA-Z\.\]'
            write-host "Dropping $user"
            $db.Users[$user].Drop()
        }
    }
}

我很确定您 are/were 看到的错误消息是因为您将 $logins 设置为 $db.users 的列表,然后试图在 foreach 循环中删除用户。

使用 $server.Logins(而不是 $db.users)初始化 $logins,然后在调用 $db.Users[$login] 之前检查 $db.Users.Contains($login)循环中的 .Drop() 将解决您的问题...