web-dev-qa-db-ja.com

ログイン許可の付与ビューをスクリプト化する方法は?

私は次のログインを作成しますが、権限はありません

USE [master]
GO

    IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'Radhe')
    CREATE LOGIN [Radhe] WITH PASSWORD=N'HareKrishna108, 
    DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
    GO

特定のログインとして次のクエリを実行すると、次の結果が得られます。

execute as login='Radhe'

select * from sys.syslogins

enter image description here

次に、[Radhe]にいくつかの権限を付与して、同じサーバー上の既存のログインの一部を彼女が確認できるようにします。

GRANT VIEW DEFINITION ON LOGIN::[site_helpdesk] TO [Radhe]
GRANT VIEW DEFINITION ON LOGIN::[camper] TO [Radhe]
GRANT VIEW DEFINITION ON LOGIN::[productuser] TO [Radhe]

次のコードを実行すると:

execute as login='Radhe'

select * from sys.syslogins

許可したログイン[Radhe]に関連する権限を表示します。

enter image description here

このまったく同じログインを作成し、これらのまったく同じ権限を複数のサーバーに付与する必要があります。

上記で許可したこれらの権限をスクリプト化するにはどうすればよいですか?

私は このニースサイトの次のスクリプト を見つけましたが、特に上記のアクセス許可では機能していないようです。

--https://www.datavail.com/blog/scripting-out-the-logins-server-role-assignments-and-server-permissions/
/********************************************************************************************************************/
-- Scripting Out the Logins, Server Role Assignments, and Server Permissions
/********************************************************************************************************************/
SET NOCOUNT ON
-- Scripting Out the Logins To Be Created
SELECT 'IF (SUSER_ID('+QUOTENAME(SP.name,'''')+') IS NULL) BEGIN CREATE LOGIN ' +QUOTENAME(SP.name)+
               CASE 
                    WHEN SP.type_desc = 'SQL_LOGIN' THEN ' WITH PASSWORD = ' +CONVERT(NVARCHAR(MAX),SL.password_hash,1)+ ' HASHED, CHECK_EXPIRATION = ' 
                        + CASE WHEN SL.is_expiration_checked = 1 THEN 'ON' ELSE 'OFF' END +', CHECK_POLICY = ' +CASE WHEN SL.is_policy_checked = 1 THEN 'ON,' ELSE 'OFF,' END
                    ELSE ' FROM WINDOWS WITH'
                END 
       +' DEFAULT_DATABASE=[' +SP.default_database_name+ '], DEFAULT_LANGUAGE=[' +SP.default_language_name+ '] END;' COLLATE SQL_Latin1_General_CP1_CI_AS AS [-- Logins To Be Created --]
FROM sys.server_principals AS SP LEFT JOIN sys.sql_logins AS SL
        ON SP.principal_id = SL.principal_id
WHERE SP.type IN ('S','G','U')
        AND SP.name NOT LIKE '##%##'
        AND SP.name NOT LIKE 'NT AUTHORITY%'
        AND SP.name NOT LIKE 'NT SERVICE%'
        AND SP.name <> ('sa');

-- Scripting Out the Role Membership to Be Added
SELECT 
'EXEC master..sp_addsrvrolemember @loginame = N''' + SL.name + ''', @rolename = N''' + SR.name + '''
' AS [-- Server Roles the Logins Need to be Added --]
FROM master.sys.server_role_members SRM
    JOIN master.sys.server_principals SR ON SR.principal_id = SRM.role_principal_id
    JOIN master.sys.server_principals SL ON SL.principal_id = SRM.member_principal_id
WHERE SL.type IN ('S','G','U')
        AND SL.name NOT LIKE '##%##'
        AND SL.name NOT LIKE 'NT AUTHORITY%'
        AND SL.name NOT LIKE 'NT SERVICE%'
        AND SL.name <> ('sa');


-- Scripting out the Permissions to Be Granted
SELECT 
    CASE WHEN SrvPerm.state_desc <> 'GRANT_WITH_GRANT_OPTION' 
        THEN SrvPerm.state_desc 
        ELSE 'GRANT' 
    END
    + ' ' + SrvPerm.permission_name + ' TO [' + SP.name + ']' + 
    CASE WHEN SrvPerm.state_desc <> 'GRANT_WITH_GRANT_OPTION' 
        THEN '' 
        ELSE ' WITH GRANT OPTION' 
    END collate database_default AS [-- Server Level Permissions to Be Granted --] 
FROM sys.server_permissions AS SrvPerm 
    JOIN sys.server_principals AS SP ON SrvPerm.grantee_principal_id = SP.principal_id 
WHERE   SP.type IN ( 'S', 'U', 'G' ) 
        AND SP.name NOT LIKE '##%##'
        AND SP.name NOT LIKE 'NT AUTHORITY%'
        AND SP.name NOT LIKE 'NT SERVICE%'
        AND SP.name <> ('sa');

SET NOCOUNT OFF
2

ログインに対する権限を付与するためのサーバー権限には、class_descにSERVER_PRINCIPALが含まれています。したがって、その場合は、ON LOGIN::ビットを含め、sys.server_principalsに対して(再度)結合できます。また、13年前に廃止されたsys.sysloginsではなく、そのビューを使用するようにradheや他の人に伝えてください...

SELECT 
    CASE WHEN SrvPerm.state_desc <> 'GRANT_WITH_GRANT_OPTION' 
        THEN SrvPerm.state_desc 
        ELSE 'GRANT' 
    END
    + ' ' + SrvPerm.permission_name 
    + CASE SrvPerm.class_desc WHEN 'SERVER_PRINCIPAL' THEN 
      ' ON LOGIN::' + QUOTENAME(t.name) ELSE '' END
    + ' TO [' + SP.name + ']' + 
    CASE WHEN SrvPerm.state_desc <> 'GRANT_WITH_GRANT_OPTION' 
        THEN '' 
        ELSE ' WITH GRANT OPTION' 
    END collate database_default AS [-- Server Level Permissions to Be Granted --] 
FROM sys.server_permissions AS SrvPerm 
    INNER JOIN sys.server_principals AS SP 
    ON SrvPerm.grantee_principal_id = SP.principal_id 
    LEFT OUTER JOIN sys.server_principals AS t
    ON SrvPerm.major_id = t.principal_id
WHERE   SP.type IN ( 'S', 'U', 'G' ) 
        AND SP.name NOT LIKE '##%##'
        AND SP.name NOT LIKE 'NT AUTHORITY%'
        AND SP.name NOT LIKE 'NT SERVICE%'
        AND SP.name <> ('sa');

結果:

GRANT CONNECT SQL TO [Radhe]
GRANT VIEW DEFINITION ON LOGIN::[site_helpdesk] TO [Radhe]
GRANT VIEW DEFINITION ON LOGIN::[camper] TO [Radhe]
GRANT VIEW DEFINITION ON LOGIN::[productuser] TO [Radhe]
3
Aaron Bertrand