2 security sql-server audit logins
我需要创建一个查询,该查询可以获取上个月未使用的登录详细信息。我尝试了几种方法,如扩展事件和审计跟踪。但是我无法获得上个月未使用的登录列表,请帮我解决这个问题。
由于您已经将成功登录审计添加到实例中,您可以将错误日志数据转储到#temp 表中,然后解析各个登录名,然后查找 sys.server_principals 中不存在的所有行过滤后的数据。
CREATE TABLE #x
(
LogDate datetime,
ProcessInfo nvarchar(max),
[Text] nvarchar(max)
);
DECLARE @dt datetime = DATEADD(MONTH, -1, GETDATE());
INSERT #x(LogDate, ProcessInfo, [Text])
EXEC master.sys.xp_readerrorlog 0, 1, N'Login succeeded', NULL,
@dt;
;WITH p(pattern) AS
(
SELECT SUBSTRING([text], CHARINDEX(CHAR(39), [text]) + 1, 500) FROM #x
),
x(name) AS
(
SELECT SUBSTRING(pattern, 1, CHARINDEX(CHAR(39), pattern)-1) FROM p
)
SELECT p.name, p.create_date, p.is_disabled
FROM sys.server_principals AS p
WHERE p.principal_id > 255 -- no system logins
AND p.name NOT LIKE N'##%##' -- e.g. ##MS_AgentSigningCertificate
AND p.name NOT LIKE N'NT %\%' -- e.g. NT AUTHORITY\SYSTEM
AND p.name NOT IN (SELECT name FROM x);
Run Code Online (Sandbox Code Playgroud)
假设您当前的错误日志文件可能还不到一个月,您可以查看以下文章,了解一次搜索多个错误日志的想法:
以后,我宁愿创建一个审计规范或扩展事件会话,以避免污染错误日志。
CREATE SERVER AUDIT GoodLogins
TO FILE (FILEPATH = 'C:\temp\GoodLogins\');
GO
CREATE SERVER AUDIT SPECIFICATION GoodLoginsSpec
FOR SERVER AUDIT GoodLogins
ADD (SUCCESSFUL_LOGIN_GROUP);
GO
ALTER SERVER AUDIT GoodLogins WITH (STATE = ON);
GO
Run Code Online (Sandbox Code Playgroud)
然后你可以查询所有的审计数据:
DECLARE @dt datetime = DATEADD(MONTH, -1, GETDATE());
;WITH x(name) AS
(
SELECT server_principal_name
FROM sys.fn_get_audit_file('C:\temp\GoodLogins\*', NULL, NULL)
WHERE event_time >= @dt
GROUP BY server_principal_name
)
SELECT p.name
FROM sys.server_principals AS p
WHERE p.principal_id > 255 -- no system logins
AND p.name NOT LIKE N'##%##' -- e.g. ##MS_AgentSigningCertificate
AND p.name NOT LIKE N'NT %\%' -- e.g. NT AUTHORITY\SYSTEM
AND p.name NOT IN (SELECT name FROM x);
Run Code Online (Sandbox Code Playgroud)