需求说明:
公司发现AD域中,有不少以前没有处理的账号,还有一些因直接重装系统留下来的计算机账号,现要求IT部门将用户与计算机的最后登陆时间所有列出来,按期通知确认与清理无效账号。
实际操做:
1. 接到此须要,咱们首先要找到用户的最后登陆时间,咱们能够用Powershell来查询,咱们能够打开powershell(注意:不管你登陆的时候什么账号,请必定右键使用管理员身份执行),因咱们是针对AD进行操做,因此咱们首先要加载AD的模块,命令以下:
Import-Module ActiveDirectory
接下来咱们再观察一下单个用户的最后登陆时间是怎么体现出来的,咱们用到如下命令:
Get-ADUser -Identity Test13 -Properties * | Select Name,SamAccountName,last*
显示结果以下:
php
12.jpg (20.57 KB)
html
2015-9-8 11:28shell
其中咱们能够看到有两个值,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方便来循环执行操做,具体要看本身的需求。
以上,完成,ide