AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 173938
Accepted
SomeGuy
SomeGuy
Asked: 2017-05-19 05:38:18 +0800 CST2017-05-19 05:38:18 +0800 CST 2017-05-19 05:38:18 +0800 CST

查看谁可以通过 AD 组成员访问数据库

  • 772

SharePoint 有一个“检查权限”按钮。在这里,您可以从 Active Directory 中选择一个用户,它会神奇地遍历组,并根据用户所在的组向您显示该用户在站点上的所有访问权限。

这是一个很长的镜头,因为我已经使用 SQL Server 很长一段时间了并且从未听说过这个,但以防万一我错过了什么......

SQL Server 中有类似的东西吗?现在,检查权限包括查看在实例上登录的 AD 组,并手动通过 AD 以查看谁在哪个组中,然后手动查看数据库权限。像 SharePoint 这样的“检查权限”可以节省大量时间。

sql-server permissions
  • 4 4 个回答
  • 7455 Views

4 个回答

  • Voted
  1. sepupic
    2017-05-19T06:38:36+08:002017-05-19T06:38:36+08:00

    只需查看用户所在的哪些组在实例上也有登录名就好了

    您可以使用以下代码完成此操作:

    exec xp_logininfo 'dom\acc', 'all';
    

    或者您可以模拟该登录名并像这样使用 sys.login_token :

    exec as login = 'dom\acc';
    select distinct name
    from sys.login_token
    where principal_id > 0
          and type = 'WINDOWS GROUP';
    revert;
    
    • 2
  2. Best Answer
    SomeGuy
    2017-05-19T07:53:01+08:002017-05-19T07:53:01+08:00

    我能够将这里的建议与我躺在身边的旧脚本结合起来,提出以下内容,它将显示用户所在的所有组,以及它们映射到的数据库角色。请注意,这没有经过彻底测试,但它给出了我需要的结果。

    -- SHOW PERMISSIONS FOR A USER BASED ON MEMBERSHIP IN AD GROUPS ONLY
    DECLARE @LoginName varchar(50)
    SET @LoginName = 'DOMAIN\USERNAME'
    
    
    
    CREATE TABLE #tmpResults
    (
    [account name] sysname,
    [type] char(8),
    privilege char(9),
    [mapped login name] sysname,
    [permission path] sysname NULL
    )
    
    INSERT INTO #tmpResults
    exec xp_logininfo @LoginName, 'all'
    
    -------------------
    DECLARE @DB_USers TABLE
    (DBName sysname, UserName sysname, LoginType sysname, AssociatedRole varchar(max),create_date datetime,modify_date datetime)
    
    INSERT @DB_USers
    EXEC sp_MSforeachdb
    
    '
    use [?]
    SELECT ''?'' AS DB_Name,
    case prin.name when ''dbo'' then prin.name + '' (''+ (select SUSER_SNAME(owner_sid) from master.sys.databases where name =''?'') + '')'' else prin.name end AS UserName,
    prin.type_desc AS LoginType,
    isnull(USER_NAME(mem.role_principal_id),'''') AS AssociatedRole ,create_date,modify_date
    FROM sys.database_principals prin
    LEFT OUTER JOIN sys.database_role_members mem ON prin.principal_id=mem.member_principal_id
    WHERE prin.sid IS NOT NULL and prin.sid NOT IN (0x00) and
    prin.is_fixed_role <> 1 AND prin.name NOT LIKE ''##%'''
    
    SELECT dbname,username, [mapped login name],logintype ,create_date ,modify_date ,
     STUFF(
     (
     SELECT ',' + CONVERT(VARCHAR(500),associatedrole)
     FROM @DB_USers user2
     WHERE user1.DBName=user2.DBName AND user1.UserName=user2.UserName
     FOR XML PATH('')
     )
     ,1,1,'') AS Permissions_user
     FROM @DB_USers user1 JOIN #tmpResults ON UserName = [Permission Path]
     GROUP BY [mapped login name], dbname,username ,logintype ,create_date ,modify_date
     ORDER BY DBName,username
    
    
     DROP TABLE #tmpResults
    
    • 1
  3. JustADBA
    2017-05-19T06:21:48+08:002017-05-19T06:21:48+08:00

    目前,我所知道的唯一方法是创建一个链接到您的 Active Directory 的服务器。一旦你这样做了,你就可以创建一个存储过程来通过 Openquery 查询 AD。

    Example: 
    Create your proc with parameters for specific groups 
    CREATE PROC usp_FindADMemembers 
    (
    @GroupName varchar(50), 
    @OrgUnit varchar(50) 
    )
    
    AS
    Declare @sqlcmd varchar(4000)
    
    SET @sqlcmd = 'SELECT LastName, FirstName, DomainName --whatever fields you want
                     FROM OPENQUERY((YOURSERVERNAME,'
            + '''SELECT GivenName,sAMAccountName  --whatever fields you require
    FROM ''''LDAP://DC=YOURDOMAIN,DC=YOURDOMAIN''''
    WHERE objectCategory = ''''Person'''' AND objectClass = ''''user''''
    AND memberOf=''''CN=' + @groupName + ',OU=Groups,OU=' + @OrganizationalUnit
            + ',DC=YOURDOMAIN,DC=YOURDOMAIN'''' ''' + ')'
    
    EXEC(@sqlcmd)
    

    希望这可以帮助

    • 0
  4. Remus Rusanu
    2017-05-19T08:01:30+08:002017-05-19T08:01:30+08:00

    是的,完全可以做到。您必须模拟用户,EXECUTE AS然后使用HAS_PERMS_BY_NAME或检查权限sys.fn_my_permissions。

    我强烈建议您不要尝试遍历 AD 和/或尝试从sys.dataabse_permissions.

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve