2016-09-15 72 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看看它是否适合你。您将从当前查询中的login_name的“名称”列中进行连接。我不确定您是否删除登录或禁用它们,但该系统视图可以告诉您是否有任何条件为真。

我知道的一个重要警告是,如果用户通过Active Directory组访问服务器,您可以在当前查询中找到用户的login_name,但它不会匹配系统中的任何内容因为相关条目将存在于AD组中。有一些方法可以解决这个问题,但是不知道这在你的系统中是否有用,我在这里不会详细讨论。

+0

我想我的问题是与AD组即可。这在我所看到的中是有道理的。这让我怀疑我是否可以将用户登录绑定到所用的组。 – bwilliamson

+0

您可以使用t-sql查询Active Directory ...您可以通过Google查询更多信息或询问后续问题是否需要特定帮助。您需要遍历组来获得成员资格,然后交叉引用。我个人会通过应用层做这种事情,但是你可以在SQL批处理中完成所有这些工作。 – btberry