我有一个Server 2016实例,我刚刚注意到有些用户登录没有列出。例如,如果我执行此查询:
select count(*) FROM sys.database_principals a where type = 'U'我收到了一份1348计数。但是如果我执行这个查询:
execute as user = 'some_user';
select count(*) FROM sys.database_principals a where type = 'U';
revert;我收到了92的计数,这意味着有一些1256用户无法被上面的用户看到。如果我授予用户db_accessadmin数据库角色成员资格,那么他们就能够看到从上述查询返回的所有1348用户。但是,我不想将db_accessadmin授予所有用户,因为这提供了比我想授予的更多的访问权限。
我已经比较了92位用户中的一位的属性和没有显示的用户的属性,但是我没有注意到任何看起来允许列出用户的属性。
如何允许在database_principals查询中列出所有用户?
发布于 2019-11-22 12:33:11
查看用户需要用户原则上的视图定义权限。这是由ALTER权限暗示的。
使用ALTER,您可以方便地更改任何用户,这是正确的db_accessadmin获取。但是没有这样的东西只适用于视图定义。
GRANT ALTER ANY USER TO Foo --Works
GRANT VIEW DEFINITION ANY USER TO Foo --Syntax Error因此,要实现您想要的结果,最简单的方法可能是创建一个新的数据库角色,通过脚本视图给数据库中的所有用户一个定义权限。然后将用户分配给要授予这些权限的新角色。
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;上面的脚本可以保存/制作成一个过程,并在必要时重新运行,也可以在创建新用户时触发将视图定义授予数据库角色。
然后将用户添加到此数据库角色( Server 2012+)
ALTER ROLE OnlySeeAllUsers
ADD MEMBER Foo
EXEC sp_addrolemember 'OnlySeeAllUsers', 'Foo' --Method before SQL Server 2012发布于 2019-11-22 08:33:18
数据库中使用户“查看”所有用户的最小权限是VIEW DEFINITION。
此权限不允许用户alter任何内容,但它向用户打开数据库对象的每个定义:tables、procedures等。
https://dba.stackexchange.com/questions/253888
复制相似问题