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 / 问题 / 341326
Accepted
Vladimir Baranov
Vladimir Baranov
Asked: 2024-07-31 18:05:55 +0800 CST2024-07-31 18:05:55 +0800 CST 2024-07-31 18:05:55 +0800 CST

用户无法访问数据库,因为他属于多个 AD 组

  • 772

我们有一个 SQL Server 2016,上面有 20 个不同的数据库,供公司内的不同应用程序和不同团队使用。Active Directory 中有用户组,这些用户组将负责某些项目的员工组合在一起。问题是一名员工可以同时成为多个团队的成员。同一个人可以属于多个不同的 AD 组。

一位用户抱怨他无法访问某个数据库。当他尝试刷新查询该数据库的 Power BI 报告时,他收到一条错误消息“我们无法使用提供的凭据进行身份验证”。

下面是一张简化的图片。一台服务器有两个数据库:DB1和。SQL Server 中DB2有两个 AD 组App_Excel_Reporter和以及两个相应的登录名:DB2_User

CREATE LOGIN [LegacyDomain\App_Excel_Reporter] FROM WINDOWS WITH DEFAULT_DATABASE=[master]

CREATE LOGIN [Domain\DB2_User] FROM WINDOWS WITH DEFAULT_DATABASE=[master]

不确定这是否重要,但该服务器是主公司收购的另一家公司的旧服务器。因此,这台 SQL Server 计算机位于域中LegacyDomain。

两个 AD 组LegacyDomain\App_Excel_Reporter都有Domain\DB2_User自己的用户集,但一个用户同时Jack.Universal属于这两个 AD 组。

属于 的用户App_Excel_Reporter应该有权访问DB1。 属于 的用户DB2_User应该有权访问DB2。

其中DB1有一个用户映射到相应的登录名:

USE [DB1]
GO
CREATE USER [LegacyDomain\App_Excel_Reporter] FOR LOGIN [LegacyDomain\App_Excel_Reporter] WITH DEFAULT_SCHEMA=[dbo]
GO

其中DB2有一个用户映射到相应的登录名:

USE [DB2]
GO
CREATE USER [Domain\DB2_User] FOR LOGIN [Domain\DB2_User] WITH DEFAULT_SCHEMA=[dbo]
GO

当用户Jack.Universal尝试刷新 Power BI 时,他会在笔记本电脑上登录 Windows,并且Domain\Jack.Universal我在 SQL Server 日志中看到具有相同时间戳的这些消息:

Login succeeded for user 'Domain\Jack.Universal'. Connection made using Windows authentication, [CLIENT: <ip address>]
Error: 18456, Severity: 14, State: 38.
Login failed for user 'Domain\Jack.Universal'. Reason: Failed to open the explicitly specified database 'DB2'. [CLIENT: <ip address>]

当我跑步时

xp_logininfo 'Domain\Jack.Universal', @option = 'all'

表明

+-----------------------+------+-----------+-----------------------+---------------------------------+
|     account name      | type | privilege |   mapped login name   |         permission path         |
+-----------------------+------+-----------+-----------------------+---------------------------------+
| Domain\Jack.Universal | user | user      | Domain\Jack.Universal | LegacyDomain\App_Excel_Reporter |
| Domain\Jack.Universal | user | user      | Domain\Jack.Universal | Domain\DB2_User                 |
| Domain\Jack.Universal | user | user      | Domain\Jack.Universal | Domain\DB3_User                 |
+-----------------------+------+-----------+-----------------------+---------------------------------+

(是的,有两个以上的数据库,并且该用户属于三个 AD 组)

如果我跑

xp_logininfo 'Domain\Jack.Universal'

如果没有选项“all”,则只返回第一行:

+-----------------------+------+-----------+-----------------------+---------------------------------+
|     account name      | type | privilege |   mapped login name   |         permission path         |
+-----------------------+------+-----------+-----------------------+---------------------------------+
| Domain\Jack.Universal | user | user      | Domain\Jack.Universal | LegacyDomain\App_Excel_Reporter |
+-----------------------+------+-----------+-----------------------+---------------------------------+

Domain\Jack.Universal因此,当 Windows 用户登录到 SQL Server 时,SQL Server似乎会选择登录LegacyDomain\App_Excel_Reporter来让该用户进入,但是当它尝试访问数据库时,DB2此尝试会失败,因为登录LegacyDomain\App_Excel_Reporter仅映射到中的用户DB1。

“明确指定的数据库”一定是由于 Power BI 的连接字符串明确指定了DB2。

我们如何配置,以便属于两个 AD 组的用户能够访问两个数据库?仅属于一个 AD 组的用户只能访问相应的数据库。

我不是域管理员,但我可以向他们询问任何需要的信息。公司没有 DBA,我只是一名对 SQL Server 略知一二的程序员。


我挖得更深了一点。当我跑

EXEC xp_logininfo 'Domain\DB2_User', @option = 'members'

我获得了该组中的用户列表:

+-----------------------+------+-----------+-----------------------+-----------------+
|     account name      | type | privilege |   mapped login name   | permission path |
+-----------------------+------+-----------+-----------------------+-----------------+
| Domain\user1          | user | user      | Domain\user1          | Domain\DB2_User |
| Domain\user2          | user | user      | Domain\user2          | Domain\DB2_User |
| Domain\Jack.Universal | user | user      | Domain\Jack.Universal | Domain\DB2_User |
+-----------------------+------+-----------+-----------------------+-----------------+

并且用户也Domain正如预期的那样。

当我跑步时

EXEC xp_logininfo 'LegacyDomain\App_Excel_Reporter', @option = 'members'

我明白了:

+-----------------------------+------+-----------+-----------------------------+---------------------------------+
|        account name         | type | privilege |      mapped login name      |         permission path         |
+-----------------------------+------+-----------+-----------------------------+---------------------------------+
| LegacyDomain\user3          | user | user      | LegacyDomain\user3          | LegacyDomain\App_Excel_Reporter |
| LegacyDomain\user4          | user | user      | LegacyDomain\user4          | LegacyDomain\App_Excel_Reporter |
| LegacyDomain\Jack.Universal | user | user      | LegacyDomain\Jack.Universal | LegacyDomain\App_Excel_Reporter |
+-----------------------------+------+-----------+-----------------------------+---------------------------------+

这里权限路径在LegacyDomain,账户名也在LegacyDomain,但是上面的结果中xp_logininfo 'Domain\Jack.Universal'账户名在Domain,但是权限路径在LegacyDomain。

再次:

EXEC xp_logininfo 'Domain\Jack.Universal', @option = 'all'

+-----------------------+------+-----------+-----------------------+---------------------------------+
|     account name      | type | privilege |   mapped login name   |         permission path         |
+-----------------------+------+-----------+-----------------------+---------------------------------+
| Domain\Jack.Universal | user | user      | Domain\Jack.Universal | LegacyDomain\App_Excel_Reporter |
| Domain\Jack.Universal | user | user      | Domain\Jack.Universal | Domain\DB2_User                 |
| Domain\Jack.Universal | user | user      | Domain\Jack.Universal | Domain\DB3_User                 |
+-----------------------+------+-----------+-----------------------+---------------------------------+
EXEC xp_logininfo 'LegacyDomain\Jack.Universal', @option = 'all'

+-----------------------------+------+-----------+-----------------------------+---------------------------------+
|        account name         | type | privilege |      mapped login name      |         permission path         |
+-----------------------------+------+-----------+-----------------------------+---------------------------------+
| LegacyDomain\Jack.Universal | user | user      | LegacyDomain\Jack.Universal | LegacyDomain\App_Excel_Reporter |
+-----------------------------+------+-----------+-----------------------------+---------------------------------+

Active Directory 中一定存在一些神奇的功能,可以将用户从旧域映射到主域。

sql-server
  • 2 2 个回答
  • 65 Views

2 个回答

  • Voted
  1. Best Answer
    Charlieface
    2024-08-03T02:27:21+08:002024-08-03T02:27:21+08:00

    如果您将 AD 用户添加或删除到 AD 组,并且想要在不让用户注销的情况下立即强制执行这些更改,则用户需要在cmd或 Powershell 窗口中执行以下命令

    klist purge
    

    如果这是你添加/删除的机器,那么你需要

    klist -li 0x3e7 purge
    

    这样做的目的是清除 Kerberos 票证缓存,因此下次需要 Kerberos 票证时,将联系域控制器获取新的 TGT 票证,新票证包含更新后的组列表。否则,缓存将保留票证,直到到期(通常为 10 小时)或注销。

    要确认更改,请执行

    whoami /groups
    
    • 3
  2. MBuschi
    2024-08-01T16:25:49+08:002024-08-01T16:25:49+08:00

    据我所知,如果您尝试使用 Active Directory 中的通用组访问 SQL Server,您会注意到这些组的成员用户无法访问 SQL Server 实例。造成这种情况的原因与 Active Directory 的关系比与 SQL Server 的关系更大。

    Active Directory 中的普通组会被缓存,因此身份验证请求可以返回用户所属的组作为 Windows 令牌的一部分。但是,通用组不包含在 Windows 令牌中,因为用户所属的通用组可能不在处理请求的同一域中。

    因为当 SQL Server 去查看用户是否具有访问权限时,通用组不在身份验证令牌中,所以令牌显示用户没有访问权限。修复这个问题非常简单,使用与通用组不同的 Windows 域组类型。

    我不知道启用通用组缓存是否可以解决问题: https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/plan/planning-global-catalog-server-placement#enabling-universal-group-membership-caching

    • 1

相关问题

  • 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