2016-09-15 1 views
0

Нужна помощь по этому вопросу.Данные для входа пользователя не вытягивают активных пользователей

У меня есть работа, которая вытаскивает логины пользователя один раз в день и вставляет в таблицу. Цель этого - собрать информацию о пользователе, чтобы узнать, какие учетные записи могут быть удалены через некоторое время.

Insert into [User_Login_Audit] 
    Select 
     login_name, max (login_time) as last_login_time,  
     last_successful_logon, (select @@servername) as server_instance, getdate() 
    from 
     sys.dm_exec_sessions 
    group by 
     login_name, last_successful_logon; 

Я использую следующий запрос, чтобы собрать информацию о пользователе с помощью зарегистрированных серверов.

SELECT 
    [Login_name], 
    MAX([last_login_time]) AS Last_login_date, 
    [server_instance], 
    DATEDIFF(day, getdate(), max([last_login_time])) Days 
FROM 
    [Benefitfocus_DBA].[dbo].[User_Login_Audit] 
WHERE 
    Login_name NOT IN ('NT AUTHORITY\SYSTEM', 'sa','') 
    AND last_successful_logon IS NOT NULL 
GROUP BY 
    Login_name, server_instance 

Я заметил, что верхний запрос тянет всю информацию из sys.dm_exec_sessions. Некоторые из записей, которые он записывает, были удалены из безопасности в этом экземпляре. Мне нужны только те пользователи, которые активны и/или присутствуют в экземпляре. Может ли кто-нибудь предложить способ изменить запрос «Вставить», чтобы вытащить только тех пользователей, которые в настоящее время находятся в безопасности на экземпляре или во втором запросе, чтобы сортировать, какие пользователи активны в экземпляре?

Буду признателен за понимание.

ответ

0

Перепробовав несколько вещей, которые я обнаружил, что добавление следующего в первом сценарии коллекции ограничивается его текущими пользователями:

where login_name in (SELECT name FROM sys.database_principals where type<>'R') 
0

Посмотрите на sys.server_principals и посмотрите, будет ли он работать для вас. Вы должны сделать соединение в столбце «name» в этой таблице с именем login_name, которое у вас есть в вашем запросе. Я не уверен, что вы удаляете логины или отключите их, но это системное представление может сказать вам, было ли какое-либо условие истинным.

Большое предостережение, о котором я знаю, заключается в том, что если пользователь имеет доступ к серверу через группу Active Directory, вы найдете имя пользователя login в своем текущем запросе, но оно не будет соответствовать ничьей в системе потому что соответствующая запись будет для группы AD. Есть несколько способов справиться с этим, но не зная, насколько это актуально в вашей системе, я не буду вдаваться в подробности здесь.

+0

Я думаю, что моя проблема с группой AD тогда. Это будет иметь смысл в том, что я вижу. Меня заставляет задуматься, могу ли я связать логин пользователя с группой, которая была использована. – bwilliamson

+0

Вы можете запросить Active Directory с помощью t-sql ... вы можете использовать Google для получения дополнительной информации или задать следующий вопрос, если вам нужна конкретная помощь. Вам нужно будет перебирать группы, чтобы получить членство, а затем перекрестно ссылаться на это. Я лично сделал бы это с помощью уровня приложения, но вы могли бы сделать все это из пакета SQL. – btberry