登录 过去 1 个月内未使用

2 security sql-server audit logins

我需要创建一个查询,该查询可以获取上个月未使用的登录详细信息。我尝试了几种方法,如扩展事件和审计跟踪。但是我无法获得上个月未使用的登录列表,请帮我解决这个问题。

Aar*_*and 6

由于您已经将成功登录审计添加到实例中,您可以将错误日志数据转储到#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)