Answers:
作为登录脚本的一部分,我将该信息(以及更多信息)登录到服务器上的隐藏共享中,每个用户一个日志文件。注销脚本将用户注销的时间添加到同一日志文件中。易于设置,无成本,并且信息以易于阅读的格式存在。
我们通过登录脚本执行此操作,该脚本更新了AD中计算机对象的描述。
您需要执行自定义的控件委派,以允许“授权用户”在域中编写计算机对象的描述属性。
完成后,您只需要一个脚本即可生成所需的任何信息,并将属性写入计算机对象。然后,通过链接到域的组策略对象将该脚本分配为登录脚本。
我们在说明字段中输入了时间戳,用户名和IP。时间戳是第一位的,因为它使通过对描述字段进行排序可以轻松快速地查看“旧”计算机对象。
如果您想将其用作起点,这是我为此编写的脚本:
On Error Resume Next
Set objSysInfo = CreateObject("ADSystemInfo") 'Bind to AD
Set objNet = CreateObject("WScript.Network")
strCompDN = objSysInfo.ComputerName 'DN for computer, e.g. "CN=VISTAWORKSTATION,OU=Child OU Name,OU=Parent OU Name,DC=domain,DC=com"
Set objComp = GetObject("LDAP://" & strCompDN) 'IADsComputer object
strUserDN = objSysInfo.UserName 'DN for user, e.g. "CN=John Smith,OU=Child OU Name,OU=Parent OU Name,DC=domain,DC=com"
Set objUser = GetObject("LDAP://" & strUserDN) 'IADsUser object
strUsrLogin = LCase(objNet.UserName)
strNow = Now
strDateStamp = DatePart("yyyy",strNow) & _
Right("0" & DatePart("m",strNow), 2) & _
Right("0" & DatePart("d",strNow), 2) & _
"@" & _
Right("0" & DatePart("h",strNow), 2) & _
Right("0" & DatePart("n",strNow), 2)
'RegExp object used to perform a simple match on IP address
Set objRE = New RegExp
objRE.IgnoreCase = True
'Note this regexp pattern isn't "correct" for matching an IPv4 address properly, but since WMI will return an
'array of IP addresses, this is sufficient to distinguish IPv4 vs IPv6
objRE.Pattern = "^\d+\.\d+\.\d+\.\d+$"
strIP = ""
'Connect to WMI and retreive all network adapters
Set objWMI = GetObject("winmgmts:")
Set colNICs = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration")
'Get the IP(s) assigned to whichever network adapter has our default gateway
If colNICs.Count > 0 Then
For Each objNIC in colNICs
If IsArray(objNIC.DefaultIPGateway) Then
arrIP = objNIC.IPAddress
For i = 0 To UBound(arrip)
If objRE.Test(arrIP(i)) Then strIP = strIP & " " & arrIP(i)
Next
strMAC = objNIC.MACAddress
End If
Next
End If
strIP = Trim(strIP)
objComp.Description = strDateStamp & " " & strUsrLogin & " " & strIP
objComp.Put "extensionAttribute1", strUsrLogin
objComp.Put "extensionAttribute2", strIP
objComp.Put "extensionAttribute3", strMAC
objComp.SetInfo
由于类似的原因,我必须达到相同的结果。以某种方式确定特定用户从哪台计算机登录。我想“先于事实”,并且无法如上所述更改用户登录脚本。
我在用户进行身份验证的DC上使用了Powershell来解析安全事件日志:
get-eventlog "Security" | where {$_.Message -like "*Username*" -AND "Source Network Address"} | export-csv C:\Temp\test.csv
使用excel或fav编辑器打开.csv,并在同一事件中查找显示帐户名(用户名)和源网络地址的最新条目。
这可能不是100%可靠的解决方案(取决于DHCP租用时间等),但对我有用。
我只是使用登录脚本将用户名(以及其他信息,如日期和时间,某些程序版本等)写到计算机描述中。这样,我可以快速,轻松地从“ AD用户和计算机”中提取所有信息,此外,它还具有一种很好的方式来识别哪些仍处于AD状态的PC一段时间未使用(因此很可能是死机)。
ThatGraemeGuy,感谢您出色的脚本!我不得不在PowerShell中重写它,但是它仍然可以工作。
$CompDN = "(&(objectCategory=computer)(objectClass=computer)(cn=$env:COMPUTERNAME))"
$strCompDN = [string]([adsisearcher]$CompDN).FindOne().Properties.distinguishedname
$objComp = [ADSI]("LDAP://"+$strCompDN)
# quit if computer is a server or DC
if (($strCompDN -like '*Controller*') -or ($strCompDN -like '*SERVER*')) { exit }
$strUsrLogin = $env:username
$strDateStamp = Get-Date -f 'yyyy-MM-dd@HH:mm'
$IPPattern = "^\d+\.\d+\.\d+\.\d+$"
$colNICs = gwmi Win32_NetworkAdapterConfiguration
if ($colNICs.Count -gt 0) {
foreach ($objNIC in $colNICs){
if ($objNIC.DefaultIPGateway) {
$arrIP = $objNIC.IPAddress
for ($i=0; $i -lt $colNICs.Count; $i++) {
if ($arrIP[$i] -match $IPPattern) { $strIP = $arrIP[$i]; $strMAC = $objNIC.MACAddress }
}
}
}
}
$objComp.Description = $strDateStamp + " - " + $strUsrLogin + " - " + $strIP
$objComp.extensionAttribute1 = $strUsrLogin
$objComp.extensionAttribute2 = $strIP
$objComp.extensionAttribute3 = $strMAC
$objComp.SetInfo()
除了来自Adam的建议之外,确定用户最后登录的位置的诀窍是日志聚合。如果您有多个域控制器,则要么全部检查它们,要么集中日志记录,然后检查单个日志。
一些,甚至大多数第三方工具都足够聪明,可以查询所有域控制器。但是,如果您正在考虑编写脚本自己解析脚本,那么我就无法为集中日志进行充分的争论。
理想情况下,您将为CSIRT团队捕获以下内容,以协助进行调查。
使用工作站名称MAC地址IP地址日期/时间戳登录类型(rdp,交互等)登录的userid
然后将其转储到sql命令中,然后转储到他们可以查询的数据库中。点点滴滴都记录下来了,但是记录下来可以节省从DHCP / WINS服务器等提取数据的时间。
如果您想找历史参考,可以尝试使用第三方工具,例如Motivate Systems的Logon Central。它记录所有Active Directory用户登录并提供用于数据挖掘的Web界面。它还包括一些相当不错的图形,可将登录统计信息转换为使用率百分比。