Sql server 是否有SQL Server实用程序生成所有服务器登录名的大列表及其访问概述?
我想知道是否有一个实用程序可以列出特定服务器上的服务器登录及其访问权限 这将是我从右键单击每个用户->属性->用户映射中获得的信息 但它没有为每个用户手动执行该过程,而是列出了信息 例如:Sql server 是否有SQL Server实用程序生成所有服务器登录名的大列表及其访问概述?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我想知道是否有一个实用程序可以列出特定服务器上的服务器登录及其访问权限 这将是我从右键单击每个用户->属性->用户映射中获得的信息 但它没有为每个用户手动执行该过程,而是列出了信息 例如: MyDomain\John - Server Roles - sysadmin - MyDatabase1 - Roles db_reader public - MyDatabase2 - Roles db_reader public MyDom
MyDomain\John
- Server Roles
- sysadmin
- MyDatabase1
- Roles
db_reader
public
- MyDatabase2
- Roles
db_reader
public
MyDomain\Steve
- MyDatabase1
- Roles
db_reader
public
我对sp_helplogins系统存储过程进行了黑客攻击,以返回接近您所要查找的内容 我无法正确粘贴脚本,因此这里是脚本的一个示例
DECLARE @LoginNamePattern sysname = NULL
set nocount on
declare
@exec_stmt nvarchar(3550)
declare
@CountSkipPossUsers int
,@Int1 int
declare
@c10DBName sysname
,@c10DBStatus int
,@c10DBSID varbinary(85)
declare
@charMaxLenLoginName varchar(11)
,@charMaxLenDBName varchar(11)
,@charMaxLenUserName varchar(11)
declare
@DBOptLoading int --0x0020 32 "DoNotRecover"
,@DBOptPreRecovery int --0x0040 64
,@DBOptRecovering int --0x0080 128
,@DBOptSuspect int --0x0100 256 ("not recovered")
,@DBOptOffline int --0x0200 512
,@DBOptDBOUseOnly int --0x0800 2048
,@DBOptSingleUser int --0x1000 4096
------------- create work holding tables ----------------
-- Create temp tables before any DML to ensure dynamic
CREATE TABLE #tb1_UA
(
LoginName sysname collate database_default NOT Null
,DBName sysname collate database_default NOT Null
,UserName sysname collate database_default NOT Null
)
--------------- Cursor, for DBNames -------------------
declare ms_crs_10_DB
Cursor local static For
select
name ,status ,sid
from
master.dbo.sysdatabases
OPEN ms_crs_10_DB
----------------- LOOP 10: thru Databases ------------------
WHILE (10 = 10)
begin --LOOP 10: thru Databases
FETCH
next
from
ms_crs_10_DB
into
@c10DBName
,@c10DBStatus
,@c10DBSID
IF (@@fetch_status <> 0)
begin
deallocate ms_crs_10_DB
BREAK
end
-------------------- Okay if we peek inside this DB now?
IF ( @c10DBStatus & @DBOptDBOUseOnly > 0
AND @c10DBSID <> suser_sid()
)
begin
select @CountSkipPossUsers = @CountSkipPossUsers + 1
CONTINUE
end
IF (@c10DBStatus & @DBOptSingleUser > 0)
begin
select @Int1 = count(*)
from sys.dm_exec_requests
where session_id <> @@spid
and database_id = db_id(@c10DBName)
IF (@Int1 > 0)
begin
select @CountSkipPossUsers = @CountSkipPossUsers + 1
CONTINUE
end
end
IF (@c10DBStatus &
(
@DBOptLoading
| @DBOptRecovering
| @DBOptSuspect
| @DBOptPreRecovery
)
> 0
)
begin
select @CountSkipPossUsers = @CountSkipPossUsers + 1
CONTINUE
end
IF (@c10DBStatus &
(
@DBOptOffline
)
> 0
)
begin
--select @CountSkipPossUsers = @CountSkipPossUsers + 1
CONTINUE
end
IF (has_dbaccess(@c10DBName) <> 1)
begin
raiserror(15622,-1,-1, @c10DBName)
CONTINUE
end
--------------------- Add the User info to holding table.
select @exec_stmt = '
INSERT #tb1_UA
(
DBName
,LoginName
,UserName
)
select
N' + quotename(@c10DBName, '''') + '
,l.name
,u2.name
from
' + quotename(@c10DBName, '[')+ '.sys.database_role_members m
,' + quotename(@c10DBName, '[')+ '.sys.database_principals u1
,' + quotename(@c10DBName, '[')+ '.sys.database_principals u2
,sys.server_principals l
where
u1.sid = l.sid
and m.member_principal_id = u1.principal_id
and m.role_principal_id = u2.principal_id' +
case
when @LoginNamePattern is null
then ''
else ' and ( l.name = N' + quotename(@LoginNamePattern , '''') + '
or l.name = N' + quotename(@LoginNamePattern , '''') + ')'
end
EXECUTE(@exec_stmt)
end --loop 10
------------ Optimize UA report column display widths -----------
select
@charMaxLenLoginName =
convert ( varchar
,isnull ( max(datalength(LoginName)) ,9)
)
,@charMaxLenDBName =
convert ( varchar
,isnull ( max(datalength(DBName)) ,6)
)
,@charMaxLenUserName =
convert ( varchar
,isnull ( max(datalength(UserName)) ,8)
)
from
#tb1_UA
------------ Print out the UserOrAlias report ------------
EXEC(
'
set nocount off
select
''LoginName'' = substring (LoginName ,1 ,'
+ @charMaxLenLoginName + ')
,''DBName'' = substring (DBName ,1 ,'
+ @charMaxLenDBName + ')
,''MemberOf'' = substring (UserName ,1 ,'
+ @charMaxLenUserName + ')
from
#tb1_UA
order by
1 ,2 ,3
Set nocount on
'
)
DROP Table #tb1_UA
DECLARE@LoginNamePattern sysname=NULL
不计较
声明
@执行董事(3550)
声明
@CountSkipPossUsers int
,@Int1 int
声明
@c10DBName系统名
,@c10DBStatus int
,@c10DBSID varbinary(85)
声明
@charMaxLenLoginName varchar(11)
,@charMaxLenDBName varchar(11)
,@charMaxLenUserName varchar(11)
声明
@DBOptLoading int--0x0020 32“DoNotRecover”
,@DBOptPreRecovery int--0x0040 64
,@DBOptRecovering int--0x0080 128
,@dboptsspect int--0x0100 256(“未恢复”)
,@DBOptOffline int--0x0200512
,@DBOptDBOUseOnly int--0x0800 2048
,@DBOptSingleUser int--0x1000 4096
-------------创建工作保留表----------------
--在任何DML之前创建临时表,以确保动态
创建表#tb1_UA
(
LoginName sysname collate数据库\u默认值不为Null
,DBName sysname collate数据库\u默认值不为空
,用户名sysname collate数据库\u默认值不为空
)
---------------游标,用于数据库名-------------------
声明ms_crs_10_DB
游标本地静态
选择
名称、状态、sid
从…起
master.dbo.sysdatabases
打开ms_crs_10_DB
-----------------循环10:thru数据库------------------
而(10=10)
开始--循环10:thru数据库
取来
下一个
从…起
ms_crs_10_DB
进入
@c10DBName
,@c10DBStatus
,@c10DBSID
如果(@@fetch\u状态0)
开始
解除分配ms_crs_10_DB
打破
结束
--------------------好吧,如果我们现在看看数据库里面?
如果(@c10DBStatus&@DBOptDBOUseOnly>0
和@c10DBSID suser_sid()
)
开始
选择@CountSkipPossUsers=@CountSkipPossUsers+1
继续
结束
IF(@c10DBStatus&@dboptingleuser>0)
开始
选择@Int1=count(*)
从sys.dm_exec_请求
何处会话\u id@@spid
和数据库_id=db_id(@c10DBName)
如果(@Int1>0)
开始
选择@CountSkipPossUsers=@CountSkipPossUsers+1
继续
结束
结束
如果(@c10DBStatus&
(
@DBOptLoading
|@dboptre
|@dboptspect
|@DBOptPreRecovery
)
> 0
)
开始
选择@CountSkipPossUsers=@CountSkipPossUsers+1
继续
结束
如果(@c10DBStatus&
(
@DBOptOffline
)
> 0
)
开始
--选择@CountSkipPossUsers=@CountSkipPossUsers+1
继续
结束
IF(具有_dbaccess(@c10DBName)1)
开始
raiserror(15622,-1,-1,@c10DBName)
继续
结束
---------------------将用户信息添加到保留表中。
选择@exec\u stmt=
插入#tb1_UA
(
数据库名称
,登录名
,用户名
)
选择
N'+quotename(@c10DBName,'')+'
,l.name
,u2.name
从…起
“+quotename(@c10DBName,[')+”.sys.database_role_members\m
,'+quotename(@c10DBName,[')+'.sys.database_1
,'+quotename(@c10DBName,[')+'.sys.database_2
,sys.server\u principals
哪里
u1.sid=l.sid
m.member\u principal\u id=u1.principal\u id
m.role\u principal\u id=u2.principal\u id'+
案例
当@LoginNamePattern为空时
然后“
else'和(l.name=N'+quotename(@LoginNamePattern,'')+'
或l.name=N'+quotename(@LoginNamePattern,'')'
结束
执行(@exec\u stmt)
结束--循环10
------------优化UA报告列显示宽度-----------
选择
@CharmaxloginName=
转换(varchar)
,isnull(最大数据长度(LoginName)),9)
)
,@charMaxLenDBName=
转换(varchar)
,isnull(最大数据长度(DBName)),6)
)
,@charMaxLenUserName=
转换(varchar)
,isnull(最大数据长度(用户名)),8)
)
从…起
#tb1_UA
------------打印出UserOrAlias报告------------
执行官(
'
抵消
选择
''LoginName''=子字符串(LoginName,1,'
+@charmaxloginName+”)
,“DBName”=子字符串(DBName,1,”
+@charMaxLenDBName+”)
,“MemberOf”=子字符串(用户名,1,'
+@charMaxLenUserName+”)
从…起
#tb1_UA
订购人
1 ,2 ,3
不计较
'
)
升降台#tb1_UA