Active Directory组成员角色检查

时间:2016-02-24 16:33:42

标签: sql-server

我正在尝试使用IS_SRVROLEMEMBER查询确定登录是否附加了特定角色,但我尝试确定他是否有角色的登录是附加到的AD组的一部分角色。

如果我进行查询

SELECT IS_SRVROLEMEMBER('sysadmin', 'Domain\User')

我回来了NULL

如果我在另一台服务器上执行相同的查询,该服务器只是将该登录名附加到该角色而不是整个组,我会按预期返回1

我是否会将该特定登录连接到SQL Server并执行

SELECT IS_SRVROLEMEMBER('sysadmin')

我在两台服务器上都找到了1

如果某个论坛所属的论坛已经附加到该角色而不是特定的登录位置,我该如何检查登录是否有权访问某个角色?

1 个答案:

答案 0 :(得分:0)

使用Bacon Bits建议的xp_logininfo我有一个似乎适合我需要的解决方案。我不确定是否有任何影响,但到目前为止的结果看起来不错。

编辑:如果添加了两个(或更多)相同的组,两个组都有用户,则脚本失败。所以重写了一点,导致现在完全忽略了IS_SRVROLEMEMBER并且只是自己进行检查。这适用于多个组。返回与IS_SRVROLEMEMBER函数相同的结果,无权检查角色时为NULL,如果角色检查成功则返回1或0。

declare @result int

create table #temp (
    [account name] nvarchar(40),
    [type] nvarchar(40),
    [privilege] nvarchar(40),
    [mapped login name] nvarchar(40),
    [permission path] nvarchar(40))
begin try
    insert into #temp exec xp_logininfo 'Domain\User', 'all' 
    if exists (select * from sys.server_role_members as RM
        inner join sys.server_principals as R on R.principal_id = RM.role_principal_id
        inner join sys.server_principals as L on L.principal_id = RM.member_principal_id
        inner join #temp as T on L.name = T.[permission path] or L.name = T.[mapped login name]
        where R.name = 'sysadmin')
        set @result = 1
    else
        set @result = 0;
end try     
begin catch
    set @result = -1 -- Current login is not a sysadmin, nothing to worry about
end catch               

select case @result when -1 then NULL when 0 then 0 when 1 then 1 end
drop table #temp