windows-nt/Source/XPSP1/NT/ds/security/gina/msgina/sqlscripts/stats2.sql
2020-09-26 16:20:57 +08:00

237 lines
14 KiB
Transact-SQL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

USE Winlogon
DECLARE @bSendmail bit
SET @bSendmail = 1
DECLARE @SCARD_W_WRONG_CHV bigint
SET @SCARD_W_WRONG_CHV = -2146434965
DECLARE @stMessageBody AS nvarchar(4000), @stMessageBody1 nvarchar(4000)
SET @stMessageBody = ""
SET @stMessageBody1 = ""
DECLARE @crlf nvarchar(2)
SET @crlf = CHAR(13) + CHAR(10)
DECLARE @Buffer nvarchar(256), @Number nvarchar(5), @Percent nvarchar(3)
DECLARE @Checkdate datetime
SET @Checkdate = DATEADD(day, -8, GETDATE())
--SET @Checkdate = DATEADD(day, -2, GETDATE())
SELECT CARD
FROM AuthMonitor
WHERE TIMESTAMP > @Checkdate
AND CARD <> ""
DECLARE @NumCardAuth int
SET @NumCardAuth = @@ROWCOUNT
--
-- Get number of reader / card operations
--
CREATE TABLE #CardReaderAuth
(
CARD nvarchar(64),
READER nvarchar(64),
FAILURE int,
NUMBER int
)
DECLARE @iCardHandle int, @stCard nvarchar(64)
SET @iCardHandle = 0
EXEC #GetCard @stCard OUTPUT, @iCardHandle OUTPUT
WHILE @stCard <> ""
BEGIN
DECLARE @iReaderHandle int, @stReader nvarchar(64)
SET @iReaderHandle = 0
EXEC #GetReader @stReader OUTPUT, @iReaderHandle OUTPUT
WHILE @stReader <> ""
BEGIN
-- Get number of total operations
SELECT CARD, READER
FROM AuthMonitor
WHERE TIMESTAMP > @Checkdate
AND CARD = @stCard
AND READER LIKE @stReader + "%"
INSERT INTO #CardReaderAuth VALUES (@stCard, @stReader, 0, @@ROWCOUNT)
-- Get number of failures
SELECT CARD, READER
FROM AuthMonitor
WHERE TIMESTAMP > @Checkdate
AND CARD = @stCard
AND READER LIKE @stReader + "%"
AND STATUS <> 0
AND STATUS <> @SCARD_W_WRONG_CHV
INSERT INTO #CardReaderAuth VALUES (@stCard, @stReader, 1, @@ROWCOUNT)
EXEC #GetReader @stReader OUTPUT, @iReaderHandle OUTPUT
END
EXEC #GetCard @stCard OUTPUT, @iCardHandle OUTPUT
END
--
-- Create the message for Card / Reader authentications and failures
--
DECLARE CardReaderCursor CURSOR FOR
SELECT CARD, READER, FAILURE, NUMBER
FROM #CardReaderAuth
ORDER BY READER ASC, CARD ASC
DECLARE @iNumPerCardReaderAuth int, @NumPerCardReaderFailures int
SET @iNumPerCardReaderAuth = -1
SET @NumPerCardReaderFailures = -1
DECLARE @LastReader nvarchar(64)
SET @LastReader = ""
DECLARE @NumAuth int, @Failure int
OPEN CardReaderCursor
FETCH NEXT FROM CardReaderCursor
INTO @stCard, @stReader, @Failure, @NumAuth
WHILE @@FETCH_STATUS = 0
BEGIN
IF @Failure = 0
SET @iNumPerCardReaderAuth = @NumAuth
ELSE
SET @NumPerCardReaderFailures = @NumAuth
IF @iNumPerCardReaderAuth <> -1 AND @NumPerCardReaderFailures <> -1
BEGIN
DECLARE TimerCursor CURSOR FOR
SELECT STOPWATCH, STATUS
FROM AuthMonitor
WHERE TIMESTAMP > @Checkdate
AND CARD = @stCard
AND READER LIKE @stReader + "%"
AND STATUS <> @SCARD_W_WRONG_CHV
DECLARE @iStopwatch int, @iStatus int
OPEN TimerCursor
FETCH NEXT FROM TimerCursor
INTO @iStopwatch, @iStatus
DECLARE @iAverageSuccess int, @iNumSuccess int
DECLARE @iAverageFailure int, @iNumFailure int
SET @iAverageSuccess = 0
SET @iNumSuccess = 0
SET @iAverageFailure = 0
SET @iNumFailure = 0
WHILE @@FETCH_STATUS = 0
BEGIN
IF @iStatus = 0
BEGIN
SET @iAverageSuccess = @iAverageSuccess + @iStopwatch
SET @iNumSuccess = @iNumSuccess + 1
END
ELSE
BEGIN
SET @iAverageFailure = @iAverageFailure + @iStopwatch
SET @iNumFailure = @iNumFailure + 1
END
FETCH NEXT FROM TimerCursor
INTO @iStopwatch, @iStatus
END
CLOSE TimerCursor
DEALLOCATE TimerCursor
IF @iNumPerCardReaderAuth <> 0
BEGIN
IF @stReader <> @LastReader
BEGIN
IF LEN(@stMessageBody) > 3000
BEGIN
SET @stMessageBody1 = @stMessageBody
SET @stMessageBody = ""
SET @LastReader = ""
END
IF @LastReader <> ""
SET @stMessageBody = @stMessageBody + @crlf
EXEC master.dbo.xp_sprintf @Buffer OUTPUT, "%-34s Total | Failures | Times", @stReader
SET @stMessageBody = @stMessageBody + @Buffer + @crlf +
REPLICATE("-", 70) + @crlf
END
SET @LastReader = @stReader
-- Card / reader total
SET @Number = CAST(@iNumPerCardReaderAuth AS nvarchar(5))
SET @Percent = CAST(@iNumPerCardReaderAuth * 100 / @NumCardAuth AS nvarchar(3))
EXEC master.dbo.xp_sprintf @Buffer OUTPUT, "  %-34s%5s%4s%%", @stCard, @Number, @Percent
SET @stMessageBody = @stMessageBody + @Buffer
-- Card / reader failures
SET @Number = CAST(@NumPerCardReaderFailures AS nvarchar(5))
SET @Percent = CAST(@NumPerCardReaderFailures * 100 / @iNumPerCardReaderAuth AS nvarchar(3))
EXEC master.dbo.xp_sprintf @Buffer OUTPUT, " | %5s%4s%%", @Number, @Percent
SET @stMessageBody = @stMessageBody + @Buffer
-- Times
DECLARE @stAverageSuccess nvarchar(5), @stAverageFailure nvarchar(5)
IF @iNumSuccess <> 0
SET @stAverageSuccess = CAST(@iAverageSuccess / @iNumSuccess / 1000 AS nvarchar(5))
ELSE
SET @stAverageSuccess = "-"
IF @iNumFailure <> 0
SET @stAverageFailure = CAST(@iAverageFailure / @iNumFailure / 1000 AS nvarchar(5))
ELSE
SET @stAverageFailure = "-"
EXEC master.dbo.xp_sprintf @Buffer OUTPUT, " | %3s/%3s", @stAverageSuccess, @stAverageFailure
SET @stMessageBody = @stMessageBody + @Buffer + @crlf
END
SET @iNumPerCardReaderAuth = -1
SET @NumPerCardReaderFailures = -1
END
FETCH NEXT FROM CardReaderCursor
INTO @stCard, @stReader, @Failure, @NumAuth
END
CLOSE CardReaderCursor
DEALLOCATE CardReaderCursor
IF @stMessageBody1 = ""
BEGIN
SET @stMessageBody1 = @stMessageBody
SET @stMessageBody = ""
END
IF @bSendmail <> 0
BEGIN
EXEC master.dbo.xp_sendmail
@recipients = 'smcaft',
@message = @stMessageBody1,
@subject = 'Smart card self host report - reader/card matrix'
IF @stMessageBody <> ""
EXEC master.dbo.xp_sendmail
@recipients = 'smcaft',
@message = @stMessageBody,
@subject = 'Smart card self host report - reader/card matrix II'
END
ELSE
BEGIN
PRINT @stMessageBody1 + @crlf
PRINT @stMessageBody
END