事情实际上有点棘手。有效权限是内部数据库权限(如上面 doza 显示的 Denny 查询)和windows 组成员资格的组合。不幸的是,稍后存储在 SQL 之外,在 AD 模式中,因此您无法真正查询它。
因此,如果您的目标是显示“域\someuser 和域\somegroup 对表 X 的访问权,而域\someothergroup 拒绝访问表 X”,那么您可以使用目录元数据并查询它,如 doza 的帖子所示。
但是,如果您的目标是回答“用户域\某些用户是否有权访问表 X?” 您无法从上面的查询中得到答案。没错,尽管您看到一条记录说域\某些用户被授予访问权限,但您无法回答它是否具有有效访问权限。请记住,单个拒绝胜过所有授权,如果 domain\user 是 domain\someothergroup 组的成员,则 domain\someuser 被有效地拒绝访问。
要回答后面的问题,您必须使用不同的机制,即您必须在 SQL 级别模拟用户并通过HAS_PERM_BY_NAME检查权限:
EXECUTE AS USER = 'domain\someuser';
SELECT HAS_PERMS_BY_NAME('X','TABLE','SELECT');
REVERT;
值得注意的是,任何对安全目录具有查看权限的人都可以回答第一个问题,而后者则需要模拟权限,这是一个更强大的权限。