需求說明:
公司發現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