Estos son los datos que extrae
DATABASE
USER NAME
LOGIN NAME
DEFAULT DB
CREATION DATE
MODIFIED
LOGIN TYPE
ROLES
Podéis copiar el script en Query analizer y recordad poner la salida a fichero. El nombre poned el que queráis con la extensión XLS (de excel. o *.HTML si lo queréis en este formato)
Este script es una modificación de otro similar que podéis encontrar en bastantes webs sobre SQL Server y que sinceramente no recuerdo dónde descargué.
-- SQL SERVER USERS AUDIT
-- Process
-- CREATETemp TABLE for Report
-- CREATETemp TABLE for Users
-- CREATETemp TABLE for Roles
-- Populate Db's
-- Populate Users
-- Populate Roles
-- Iterate though each user AND update their roles into a single column for each db
-- Return the users, their logins (reports orphaned if so) and their roles
SET NOCOUNT ON
DECLARE @db varchar (128)
DECLARE @defdb varchar(64)
DECLARE @createdate varchar (25)
DECLARE @lAStmodifieddate varchar(25)
DECLARE @logintype varchar(50)
DECLARE @loginname varchar(64)
CREATE TABLE #rpt
(
db varchar(64),
Name varchar(128),
Loginname varchar(64),
defdb varchar (64),
CreateDate varchar(25),
LAStModifiedDate varchar(25),
LoginType varchar(50),
Roles varchar(300)
)
CREATE TABLE #Temp_Users
(
Name varchar(128),
Defdb varchar(64),
CreateDate datetime,
LAStModifiedDate datetime,
LoginType varchar(50),
Roles varchar(1024),
sid varbinary(64)
)
CREATE TABLE #Temp_Roles
(
Name varchar(128),
Role varchar(128)
)
DECLARE databASes CURSOR
FOR SELECT name FROM master..sysdatabASes
OPEN databASes
FETCH NEXT FROM databases INTO @db
WHILE @@fetch_status = 0
BEGIN
DELETE #temp_users
INSERT INTO #Temp_Users
EXEC('SELECT m.[Name],null AS Defdb, m.CreateDate, m.UpdateDate,
LoginType = CASE
WHEN m.IsNTName = 1 THEN ''Windows Account''
WHEN m.IsNTGroup = 1 THEN ''Windows Group''
WHEN m.isSqlUser = 1 THEN ''SQL Server User''
WHEN m.isAliased =1 THEN ''Aliased''
WHEN m.isSQLRole = 1 THEN ''SQL Role''
WHEN m.isAppRole = 1 THEN ''Application Role''
ELSE ''Unknown''
END,
Roles = '''', sid
FROM ['+@db+']..sysusers m
WHERE m.SID IS NOT NULL AND name <> ''guest''
ORDER BY m.Name')
DELETE #temp_roles
INSERT INTO #Temp_Roles
EXEC('SELECT MemberName = u.name, DbRole = g.name
FROM ['+@db+']..sysusers u,['+@db+']..sysusers g,['+@db+']..sysmembers m
WHERE g.uid = m.groupuid
AND g.issqlrole = 1
AND u.uid = m.memberuid
ORDER BY 1, 2')
DECLARE @Name varchar(128)
DECLARE @Roles varchar(1024)
DECLARE @Role varchar(128)
DECLARE UserCursor CURSOR FOR
SELECT name FROM #Temp_Users
OPEN UserCursor
FETCH NEXT FROM UserCursor INTO @Name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Roles = ''
DECLARE RoleCursor CURSOR FOR
SELECT Role FROM #Temp_Roles WHERE Name = @Name
OPEN RoleCursor
FETCH NEXT FROM RoleCursor INTO @Role
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@Roles > '')
SET @Roles = @Roles + ', '+@Role
ELSE
SET @Roles = @Role
FETCH NEXT FROM RoleCursor INTO @Role
END
CLOSE RoleCursor
DEALLOCATE RoleCursor
SET @loginname = 'ALERT ORPHANED!!!'
SELECT @createdate = convert(varchar(25),createdate) FROM #temp_users WHERE Name = @Name
SELECT @Lastmodifieddate = convert(varchar(25),lastmodifieddate) FROM #temp_users WHERE Name = @Name
SELECT @logintype = logintype FROM #temp_users WHERE Name = @Name
SELECT @defdb = dbname FROM mASter..syslogins a, #temp_users b WHERE b.name = @name AND a.sid = b.sid
SELECT @loginname= loginname FROM mASter..syslogins a, #temp_users b WHERE b.name = @name AND a.sid = b.sid
INSERT INTO #rpt VALUES(rtrim(@db),rtrim(@name),isnull(rtrim(@loginname), 'orphaned'),rtrim(@defdb),@createdate,@lastmodifieddate,rtrim(@logintype),'public, '+rtrim(@roles))
FETCH NEXT FROM UserCursor INTO @Name
END
CLOSE UserCursor
DEALLOCATE UserCursor
FETCH NEXT FROM databASes INTO @db
END
CLOSE databASes
DEALLOCATE databASes
PRINT '<b>'
PRINT '<p ALIGN = "left"> Server Name: ' +convert(char(24), @@SERVERNAME)+'</P>'
PRINT '<p ALIGN = "left"> Created by: ' + convert(char(30),SESSION_USER)+'</P>'
PRINT '<p ALIGN = "left"> Created from: ' + convert(char(30),host_name())+'</P>'
PRINT '<p ALIGN = "left"> Date: '+CONVERT(VARCHAR(32), getdate())+'</P>'
PRINT '</b>'
print '<p ALIGN = "left"><A HREF="http://url de referencia donde se reflejan las políticas en cuanto a usuarios</p></A> '
select '<DIV ALIGN="center"><TABLE BORDER="1" CELLPADDING="8" CELLSPACING="0" BORDERCOLOUR="003366" WIDTH="100%">
<TR BGCOLOR="EEEEEE"><TD CLASS="Title" COLSPAN="8" ALIGN="center"><B><h4>USERS LOGINS AND ROLES</B></h4></TD></TR>'
union all
select '<TR BGCOLOR="EEEEEE">
<TD ALIGN="left" WIDTH="5%"><B>DATABASE</B> </TD>
<TD ALIGN="left" WIDTH="5%"><B>USER NAME</B> </TD>
<TD ALIGN="left" WIDTH="5%"><B>LOGIN NAME</B> </TD>
<TD ALIGN="left" WIDTH="5%"><B>DEFAULT DB</B> </TD>'
union all
select
'<TD ALIGN="left" WIDTH="5%"><B>CREATION DATE</B> </TD>
<TD ALIGN="left" WIDTH="5%"><B>MODIFIED</B> </TD>
<TD ALIGN="left" WIDTH="5%"><B>LOGIN TYPE</B> </TD>
<TD ALIGN="left" WIDTH="40%"><B>ROLES</B> </TD>
</TR>'
union all
SELECT '<TR>
<TD>'+rtrim(db)+'</TD>
<TD>'+rtrim(name)+'</TD>
<TD>'+rtrim(loginname)+'</TD>
<TD>'+rtrim(defdb)+'</TD>
<TD>'+createdate+'</TD>
<TD>'+lastmodifieddate+'</TD>
<TD>'+rtrim(logintype)+' </TD>
<TD>'+rtrim(roles)+'</TD>
</TR>'
FROM #rpt
UNION ALL
SELECT '</table>'
DROP TABLE #Temp_Users
DROP TABLE #Temp_Roles
DROP TABLE #rpt
SET NOCOUNT OFF
12 comentarios:
Excelente!!
Con solo un "copy paste" genera un hermoso reporte.
Gracias!!!!
UFFffffffffff Excelente Reports
Gracias!
Interesante y util lo proporcionado.
Manuel Ruiz
gracias a vosotros.
Muchas gracias por poner este script, un trabajo que debía hacer en un par de horas se resolvió en 5 segundos. Se agradece. Saludos desde Chile.
Atte.,
Nelson Valenzuela
¿podrán darme una mano? al ejecutar el código me da el error que transcribo. ¿les ha sucedido? ¿se le ocurre de un vistazo la posible causa?
MS-SQL 8.00.194 RTM Developer Edition
gracias de antemano
Servidor: mensaje 207, nivel 16, estado 3, línea 1
El nombre de columna 'Name' no es válido.
Servidor: mensaje 207, nivel 16, estado 1, línea 1
El nombre de columna 'CreateDate' no es válido.
Servidor: mensaje 207, nivel 16, estado 1, línea 1
El nombre de columna 'UpdateDate' no es válido..... continua
... (continuo de la entrada anterior) Al ejectuar llega hasta la última BD/usuario que tengo. ¿queda algo para mostrar? ¿tienen algún scrip para mostrar los permisos de cada rol?
Gracias de Antemano
Marcos Saperas
Excelente aporte, se agradece.
Muchas gracias, aquí una auditora agradecida!
Solo una pregunta, el reporte obtiene solo los usuarios activos o todos?
Hay alguna marca para identificar esto?
Muchas gracias nuevamente,
Es un excelente script.
Excelente!!!!!!!
Excelente reporte!!! Muchas gracias.
Publicar un comentario