Logging SQL Server Logins
Source:
--DROP TABLE #LogInfoDECLARE @searchstring1 nvarchar(500) = ''DECLARE @searchstring2 nvarchar(500) = ''DECLARE @Limit int = 10000------------------------------------------------------------------------ This part of the code was found here: DECLARE @FileList AS TABLE ( subdirectory NVARCHAR(4000) NOT NULL ,DEPTH BIGINT NOT NULL ,[FILE] BIGINT NOT NULL); DECLARE @ErrorLog NVARCHAR(4000), @ErrorLogPath NVARCHAR(4000);SELECT @ErrorLog = CAST(SERVERPROPERTY(N'errorlogfilename') AS NVARCHAR(4000));SELECT @ErrorLogPath = SUBSTRING(@ErrorLog, 1, LEN(@ErrorLog) - CHARINDEX(N'\', REVERSE(@ErrorLog))) + N'\'; INSERT INTO @FileListEXEC xp_dirtree @ErrorLogPath, 0, 1; DECLARE @NumberOfLogfiles INT;SET @NumberOfLogfiles = (SELECT COUNT(*) FROM @FileList WHERE [@FileList].subdirectory LIKE N'ERRORLOG%');-- SELECT @NumberOfLogfiles;If @Limit IS NOT NULL AND @NumberOfLogfiles > @Limit SET @NumberOfLogfiles = @Limit---------------------------------------------------------------------- CREATE TABLE #LogInfo ( LogDate datetime, ProcessInfo nvarchar(500), ErrorText nvarchar(max)) DECLARE @p1 INT = 0 WHILE @p1 < @NumberOfLogfilesBEGIN -- P1 is the file number starting at 0 DECLARE @p2 INT = 1, -- P2 1 for SQL logs, 2 for SQL Agent logs @p3 NVARCHAR(255) = @searchstring1, -- P3 is a value to search on @p4 NVARCHAR(255) = @searchstring2 -- P4 is another search value BEGIN TRY INSERT INTO #LogInfo EXEC sys.xp_readerrorlog @p1,@p2,@p3,@p4 END TRYBEGIN CATCH PRINT 'Error occurred processing file ' + cast(@p1 as varchar(10))END CATCH SET @p1 = @p1 + 1END SELECT * FROM #LogInfo WHERE ProcessInfo NOT IN ('Backup','Logon')ORDER BY LogDate DESC------------------------------------------------------------------------------------------------SELECT UserList.UserName,
MAX(CASE WHEN #LogInfo.ErrorText LIKE '%succeeded%' THEN LogDate ELSE NULL END) AS LatestSuccess,
MAX(CASE WHEN #LogInfo.ErrorText LIKE '%failed%' THEN LogDate ELSE NULL END) AS LatestFailure
FROM #LogInfo
CROSS APPLY (SELECT REPLACE(REPLACE(ErrorText,'Login succeeded for user ''',''),'Login failed for user ''','')) RemoveFront(ErrorText)
CROSS APPLY (SELECT SUBSTRING(RemoveFront.ErrorText,1,CHARINDEX('''', RemoveFront.ErrorText)-1)) AS UserList(UserName)
WHERE #LogInfo.ProcessInfo = 'Logon'
and #LogInfo.ErrorText like 'Login%'
GROUP BY UserList.UserName;