如何计算用户登录到计算机的次数?(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