web-dev-qa-db-fra.com

L'utilisateur SQL Server ne peut pas voir toutes les connexions

J'ai une instance SQL Server 2016 et je viens de remarquer que certaines connexions utilisateur ne sont pas répertoriées pour certains utilisateurs. Par exemple, si j'exécute cette requête:

select count(*) FROM sys.database_principals a where type = 'U'

Je reçois un compte de 1348. Mais si j'exécute cette requête:

execute as user = 'some_user';
select count(*) FROM sys.database_principals a where type = 'U';
revert;

Je reçois un compte de 92, ce qui signifie qu'il y a 1256 utilisateurs qui ne peuvent pas être vus par l'utilisateur ci-dessus. Si j'accorde l'utilisateur db_accessadmin Celui de base de base de données, puis ils sont capables de voir tous les 1348 Les utilisateurs sont revenus de cette question ci-dessus. Cependant, je ne veux pas accorder db_accessadmin à tous les utilisateurs comme cela donne beaucoup plus d'accès que je ne veux accorder.

J'ai comparé les propriétés de l'un des 92 utilisateurs qui appartiennent aux propriétés des utilisateurs qui ne s'affichent pas, mais je n'ai pas remarqué de propriété qui semble permettre de répertorier l'utilisateur.

Comment puis-je continuer à permettre à tous les utilisateurs d'être répertoriés dans la requête à base de données_principales?

4
Alex

Voir les utilisateurs nécessite l'autorisation de définition d'affichage sur le principe de l'utilisateur. Ceci est impliqué par la permission de l'utilisateur alter.

Avec Alter utilisateur, vous pouvez faire une modification pratique de tout utilisateur, qui est le bon dB_AccessAdmin gets. Mais il n'y a rien de tel pour la définition de la vue seulement.

GRANT ALTER ANY USER TO Foo           --Works
GRANT VIEW DEFINITION ANY USER TO Foo --Syntax Error

Donc, pour accomplir ce que vous voulez, le moyen le plus simple serait probablement de créer un nouveau rôle de base de données, donnez-le à travers un droit de définition de vue script à tous les utilisateurs de la base de données. Puis attribuer aux utilisateurs à ce nouveau rôle que vous souhaitez donner ces droits.

IF DATABASE_PRINCIPAL_ID('OnlySeeAllUsers') IS NULL
BEGIN
    RAISERROR('OnlySeeAllUsers role is not defined yet, creating it', 1, 1) WITH NOWAIT
    CREATE ROLE OnlySeeAllUsers
END

DECLARE @QUERY NVARCHAR(MAX);
DECLARE @UserName NVARCHAR(256);
DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT, @ErrorState INT;

DECLARE userIterator CURSOR LOCAL FAST_FORWARD
FOR
    SELECT [DAT].[name] FROM sys.database_principals AS DAT
    WHERE ([DAT].[TYPE] = 'U' --Windows logins
    OR [DAT].[TYPE] = 'S') --SQL Logins
    AND [DAT].[SID] IS NOT NULL --Filters out sys/information schema, 
                                --which will cause errors otherwise
OPEN userIterator;
FETCH NEXT FROM userIterator INTO @UserName;    
WHILE @@FETCH_STATUS = 0
BEGIN
    BEGIN TRY
        SET @QUERY = N'GRANT VIEW DEFINITION ON USER::' + @UserName + ' TO OnlySeeAllUsers';
        EXEC (@QUERY);
        FETCH NEXT FROM userIterator INTO @UserName;
    END TRY
    BEGIN CATCH
        SELECT @ErrorMessage = ERROR_MESSAGE(), 
        @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); --Get ErrorInfo

        RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState) WITH NOWAIT;
        BREAK; --Abort while
    END CATCH
END    
CLOSE userIterator;
DEALLOCATE userIterator;

Le script ci-dessus peut être sauvegardé/transformé en une procédure et une répercussion si nécessaire, ou on peut effectuer une gâchette lors de la création de nouveaux utilisateurs pour accorder une définition de vue sur le rôle de base de données.

Ensuite, ajouter un utilisateur à ce rôle de base de données (SQL Server 2012+)

ALTER ROLE OnlySeeAllUsers 
ADD MEMBER Foo

EXEC sp_addrolemember 'OnlySeeAllUsers', 'Foo' --Method before SQL Server 2012
2
D Kramer

L'autorisation minimale dans la base de données pour faire un utilisateur "Voir" Tous les utilisateurs sont VIEW DEFINITION.

Cette permission ne permet pas à l'utilisateur de alter rien, mais il s'ouvre à l'utilisateur chaque définition des objets de base de données: tables, procedures, etc.

4
sepupic

Selon la Documentation pour sys.database_principals:

Tout utilisateur peut voir leur propre nom d'utilisateur, les utilisateurs du système et les rôles de base de données fixes. Pour voir d'autres utilisateurs, nécessite ALTER ANY USER, ou une permission de l'utilisateur. Pour voir des rôles définis par l'utilisateur, il faut ALTER ANY ROLE, ou membre dans le rôle.

Vous ne voulez peut-être pas accorder directement une telle permission puissante, alors examinez d'autres options telles que Signature du module .

1
user195591