我正在尝试使用IS_SRVROLEMEMBER
查询确定登录是否附加了特定角色,但我尝试确定他是否有角色的登录是附加到的AD组的一部分角色。
如果我进行查询
SELECT IS_SRVROLEMEMBER('sysadmin', 'Domain\User')
我回来了NULL
如果我在另一台服务器上执行相同的查询,该服务器只是将该登录名附加到该角色而不是整个组,我会按预期返回1
。
我是否会将该特定登录连接到SQL Server并执行
SELECT IS_SRVROLEMEMBER('sysadmin')
我在两台服务器上都找到了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