Как проверить, есть ли у входа в SQL Server роль «SysAdmin» - PullRequest
1 голос
/ 23 мая 2019

Я работаю над сценарием PowerShell, который проверяет указанный SQL Server, чтобы увидеть, успешно ли определенному имени входа (назовем его «ContractUser») роль SysAdmin.Я ищу способ написать простой if, а затем проверить, имеет ли этот логин роль SysAdmin.

Я нашел много примеров в Интернете, которые показывают, как получить весь список логинов SysAdmin, ноЕще не выяснили, как изменить эти скрипты, чтобы проверять сервер только на один логин.Например, следующий скрипт получает все логины с ролью SysAdmin, а затем делает что-то особенное для них.

$SQLSvr = "SQLServername\Instancename";
$MySQL = New-Object Microsoft.SqlServer.Management.Smo.Server $SQLSvr;
$SQLLogins = $MySQL.Logins;

$SysAdmins = $null;
$SysAdmins = foreach ($SQLUser in $SQLLogins) {
    foreach ($role in $SQLUser.ListMembers()) {
        if ($role -match 'sysadmin') {
            ...do stuff...
        };
    };
};

Я попытался немного изменить это и придумал следующий код, который не возвращает результаты какожидается (я знаю, что сервер, который я проверяю, имеет этот логин и тот логин в системном администраторе, но сценарий говорит иначе):

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

$serverConnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection
$serverConnection.ServerInstance=$SQLServer
$server = New-Object Microsoft.SqlServer.Management.SMO.Server($serverConnection)
$SQLLogins = $server.Logins
$loginIsSysadmin = "No"
foreach ($SQLLogin in $SQLLogins) {
    $SQLRoles = $SQLLogin.ListMembers()
    if ($SQLRoles -eq "SysAdmin" -and $SQLLogin.name -eq "ContractUser") {
        $loginIsSysadmin = "Yes"
        break
    }
}

Я ожидаю, что мой скрипт изменит переменную $loginIsSysadmin на "Да », который я мог бы затем сделать простую проверку для вывода и дальнейших действий.Тем не менее, эта переменная остается «Нет» после запуска скрипта.

Любой вклад в то, что я делаю неправильно, будет высоко оценен.

1 Ответ

0 голосов
/ 24 мая 2019

Здесь, как обычно, invoke-sqlcmd ваш друг. СМО нет.

Например

$login = 'sa'
$sql = @"
    select r.name role_name, m.name member_name
    from sys.server_principals r
    join sys.server_role_members rm
      on r.principal_id = rm.role_principal_id
    join sys.server_principals m
      on m.principal_id = rm.member_principal_id
    where m.name = '$login'
"@
$isSysadmin = ( @(invoke-sqlcmd $sql ).Count -eq 1 )
write-host "Is a sysadmin: $isSysadmin"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...