首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server用户无法查看所有登录

Server用户无法查看所有登录
EN

Database Administration用户
提问于 2019-11-22 04:00:18
回答 3查看 4.9K关注 0票数 5

我有一个Server 2016实例,我刚刚注意到有些用户登录没有列出。例如,如果我执行此查询:

代码语言:javascript
复制
select count(*) FROM sys.database_principals a where type = 'U'

我收到了一份1348计数。但是如果我执行这个查询:

代码语言:javascript
复制
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查询中列出所有用户?

EN

回答 3

Database Administration用户

回答已采纳

发布于 2019-11-22 12:33:11

查看用户需要用户原则上的视图定义权限。这是由ALTER权限暗示的。

使用ALTER,您可以方便地更改任何用户,这是正确的db_accessadmin获取。但是没有这样的东西只适用于视图定义。

代码语言:javascript
复制
GRANT ALTER ANY USER TO Foo           --Works
GRANT VIEW DEFINITION ANY USER TO Foo --Syntax Error

因此,要实现您想要的结果,最简单的方法可能是创建一个新的数据库角色,通过脚本视图给数据库中的所有用户一个定义权限。然后将用户分配给要授予这些权限的新角色。

代码语言:javascript
复制
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+)

代码语言:javascript
复制
ALTER ROLE OnlySeeAllUsers 
ADD MEMBER Foo

EXEC sp_addrolemember 'OnlySeeAllUsers', 'Foo' --Method before SQL Server 2012
票数 2
EN

Database Administration用户

发布于 2019-11-22 08:33:18

数据库中使用户“查看”所有用户的最小权限是VIEW DEFINITION

此权限不允许用户alter任何内容,但它向用户打开数据库对象的每个定义:tablesprocedures等。

票数 4
EN

Database Administration用户

发布于 2019-11-22 06:23:31

根据文档 for sys.database_principals

任何用户都可以看到自己的用户名、系统用户和固定的数据库角色。要查看其他用户,需要ALTER ANY USER或用户的权限。要查看用户定义的角色,需要ALTER ANY ROLE或角色的成员资格。

您可能不希望直接授予如此强大的权限,因此请查看其他选项,如模块签名

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/253888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档