Windows AD 用戶信息兩例

如何計算用戶登錄到計算機的次數?(2009/08/25 Handle)

Powershell導出活動目錄用戶信息表

 

 

如何計算用戶登錄到計算機的次數?
問:
您好,腳本專家!如何計算用戶登錄到計算機的次數?

答:
您好,DE。您是如何計算用戶登錄到計算機的次數?問得好,但最終的回答可能是:沒辦法計算。不過,我們至少可以對一些可能的解決方法進行研究,看其中的某些方法是否有助於解決問題。

首先,我們要弄清楚登錄到計算機和登錄到域之間的區別。如果運行了 Active Directory,就可以確定用戶登錄到域的次數;因爲該用戶帳戶對象包含一個“LogonCount”屬性,它可對這一情況進行跟蹤。

但它有一個侷限性,就是不能在域控制器間複製 LogonCount 屬性。這重要嗎?如果只有一個域控制器,這根本無關緊要。不過,如果有多個域控制器,就需要綁定到其中的每個計算機,檢索登錄次數,然後將這些數字相加,才能得出用戶登錄到域的次數。換句話說,Ken Myer 可能由域控制器 A 驗證了 5 次,由域控制器 B 驗證了 3 次。您需要將這兩個數字(5 和 3)相加,才能確定 Ken 登錄到域的次數爲 8 次。

順便提一句,以下腳本綁定到域控制器 atl-dc-01 並回顯用戶 Ken Myer 的 LogonCount 值:

Set objUser = GetObject _
    ("LDAP://atl-dc-01/cn=ken myer, ou=Finance, dc=fabrikam, dc=com")
Wscript.Echo objUser.LogonCount

同樣,您需要分別爲每個域控制器運行一次這個腳本,才能得出 Ken Myer 的準確登錄次數。

當然啦,您提出的問題是計算用戶登錄到計算機的次數。這就有一點棘手了,遺憾的是,WinNT 提供程序(用於管理本地用戶帳戶和 Windows NT 4.0 域帳戶)不支持 LogonCount 屬性。因此,據我們所知,計算用戶登錄次數的唯一方法就是查詢安全事件日誌。如果啓用了用戶登錄審覈,每次用戶成功登錄到計算機時,都會在安全事件日誌中記錄一個事件(使用事件代碼 528)。要了解 Ken Myer 登錄到計算機的次數,只需在安全事件日誌中查詢所有“EventCode”等於 528 且“User”爲 fabrikam//kmyer 的事件(是的,查詢中必須使用兩個 /):

strComputer = "."
Set objWMIService = GetObject("winmgmts:{(Security)}//" & _
        strComputer & "/root/cimv2")

Set colEvents = objWMIService.ExecQuery _
    ("SELECT * FROM Win32_NTLogEvent WHERE LogFile = 'Security' AND " & _
        "EventCode = 528 AND User = 'fabrikam//kmyer'")

Wscript.Echo colEvents.Count

以上腳本可以達到預期效果,但有一些需要注意的地方。首先,如果沒有啓用審覈功能,則不會將這些記錄寫入到安全事件日誌中。其次,每次清除事件日誌時,都會清除所有事件。結果,相當於將所有用戶的所有登錄次數都重置爲 0。如果想保留用戶登錄的連續記錄,只有兩個辦法:永遠都不要清除事件日誌(不建議這樣做),或者每次在真的要清除事件日誌時做記錄。這項任務並非難到真的無法完成,但也並非像您多半以爲的那樣簡單。不過,這幾乎是我們可以選擇的唯一方法了。

++++++++++++++++++++++++++

Powershell導出活動目錄用戶信息表

#用途:列舉當前域控中所有用戶信息,並保存至CSV文件中。
#作者:Rootcat
#日期:2009-0-29

#過濾字符串
$strFilter = "(&(objectCategory=User)(logonCount>=1)(!userAccountControl:1.2.840.113556.1.4.803:=2))"

#域對象
$objDomain = New-Object System.DirectoryServices.DirectoryEntry

#域搜索對象
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher

#設置搜索對象根路徑
$objSearcher.SearchRoot = $objDomain

#設置頁面數
$objSearcher.PageSize = 1000

#設置搜索過濾字符串
$objSearcher.Filter = $strFilter

#獲取搜索結果集
$colResults = $objSearcher.FindAll();

#用戶列表對象
$userlist = @()

#循環獲取用戶信息
foreach ($objResult in $colResults)
{
$objItem = $objResult.Properties;
    $selected_user = New-Object psobject
    $selected_user | Add-Member NoteProperty -Name "Name" -Value $objItem.name[0]

#處理空數據
If($objItem.mail -eq $null)
{
$selected_user | Add-Member NoteProperty -Name "Email" -Value "NULL"
}else{
    $selected_user | Add-Member NoteProperty -Name "Email" -Value $objItem.mail[0]
}
#將數據對象加入用戶數組
$userlist+=$selected_user
}

#直接輸出信息並輸出到CSV文件
$userlist | Select Name, Email |export-csv -Encoding "Unicode" F:/powershell/AdUserInfo.csv

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章