需求说明:

公司发现AD域中,有很多之前没有处理的帐号,还有一些因直接重装系统留下来的计算机帐号,现要求IT部门将用户与计算机的最后登录时间全部列出来,定期通知确认与清理无效帐号。


实际操作:

1. 接到此需要,我们首先要找到用户的最后登录时间,我们可以用Powershell来查询,我们可以打开powershell( 注意:无论你登录的时候什么帐号,请一定右键使用管理员身份执行 ),因我们是针对AD进行操作,所以我们首先要加载AD的模块,命令如下:

Import-Module ActiveDirectory

接下来我们再观察一下单个用户的最后登录时间是怎么体现出来的,我们用到以下命令:

Get-ADUser -Identity Test13 -Properties * | Select Name,SamAccountName,last*
显示结果如下:
 使用PowerShell来查看计算机与用户的最后登录时间_清理  使用PowerShell来查看计算机与用户的最后登录时间_计算机_02

 使用PowerShell来查看计算机与用户的最后登录时间_管理员_03 12.jpg (20.57 KB)

2015-9-8 11:28



其中我们可以看到有两个值,Lastlogon与LastLogonTimeStamp,那么,这两个值有什么区别呢?

LastLogon:属性实时更新用户登录时间,但它不会从一个DC复制到另一个DC。假设一个用户登录到了DC A上,那么DC A上lastLogon既是用户的最近登录时间,但如果你在DC B上查询用户的最近登录时间,得到的结果将会是该用户没有登录过,尽管此时用户正登录在域上。

LastLonTimeStamp:属性会从一个DC复制到另一个DC。因此,不论你查询域中任何一个DC,都会得到相同的结果。但是为了减少复制流量,此值14天才复制一次,所以可能会造成偏差。

那么问题来了,当然不是问你挖掘机技术哪家强,我们的问题是,到时是取哪个值呢?

这个都看我们的需求了,我们的目的是找了长期没有登录域内的用户与计算机,那么这个LastLogonTimeStamp的14天的偏差,是我们可以接受的;而且我们在任何一台DC上执行都能得到最完整,而我们在LastLongon虽然最精确,但我们不得不在每台DC上都要执行,还要取最近的时期,所以,我们的实际环境选取LastLogonTimeStamp这个值就可以了。

新的问题:这个值不是一个日期,也是一个数字,是代表从1601年1月1日0点到用户最后登录中间有多少个纳秒,所以我们需要将此值转换为能读懂的日期,先上命令,后面再解释。

Get-ADUser -Filter * Properties * | Select Name,SamAccountName,@{Name="Stamp";Expression={[system.datetime]::fromfiletime($_.lastlogontimestamp)}} | Export-Csv e:\UsersLastLogon.csv -NoTypeInformation -encoding UTF8

以下对上面命令说一点简短的说明:
1. 如果想查询计算机,请将命令中的Get-ADUser改成Get-ADComputer。
2. 如果改成计算机,建立后面的Select去掉SamAccountName。
3. 如需要排序,可用 Sort -Descending来降序,也可以用不加参数,直接使用Sort来进行升序排序
4. 结果可以用管道做进一步操作,如移动到指定OU,或者禁用之类的,我这里主要是为了导出数据分析,故导出到csv中,进行条件筛选好,方便使用Import-Csv方便来循环执行操作,具体要看自己的需求。

以上,完成,

出处: http://bbs.51cto.com/thread-1167407-1.html