查找用户上次登录的计算机的最佳方法?


23

我希望在Active Directory的某处写入/存储“从[计算机]上次登录”,或者有可以解析的日志?

想要了解最后一台登录的PC的目的是为了通过网络提供远程支持-我们的用户很少移动,但是我想知道当天早上我正在咨询的内容正在更新(当他们登录时) ,大概)。

我还在考虑将用户名和计算机名写到我可以参考的已知位置的登录脚本,但是我们的某些用户不希望一次注销15天。

如果有一个使用登录脚本的优雅解决方案,请务必提及它-但是,如果碰巧它仅用于解锁工作站,那会更好!

Answers:


26

作为登录脚本的一部分,我将该信息(以及更多信息)登录到服务器上的隐藏共享中,每个用户一个日志文件。注销脚本将用户注销的时间添加到同一日志文件中。易于设置,无成本,并且信息以易于阅读的格式存在。


另外,通过添加到日志中,您可以获得历史记录,有时可能非常方便。
约翰·

1
现在实现此功能,将来可能会迁移到具有更多功能的vbs :)到目前为止,使用非常简单的批处理登录脚本:echo%date%,%time%,%username%,logon,%computername%>> \\ server \ logon $ \ logons.csv使用Excel打开,就可以设置了!
加勒特2010年

登录脚本是否以用户身份运行,在这种情况下,用户也可以进入并修改日志?
James Yale

@James,这就是为什么我使用隐藏的隐藏共享存储日志的原因。当然,这取决于用户的熟练程度,因为只需阅读脚本即可获得位置。我目前的用户组没有这个问题。:)
John Gardeniers

1
我做了类似的事情,除了登录脚本调用了更新数据库的Web服务。该数据库具有Web前端以查看当前状态。但是,这对于移动用户来说是有问题的。
Nic

10

我们通过登录脚本执行此操作,该脚本更新了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

如何委托经过身份验证的用户将权限明确授予AD中的描述字段对象?
NULL.Dude

6

由于类似的原因,我必须达到相同的结果。以某种方式确定特定用户从哪台计算机登录。我想“先于事实”,并且无法如上所述更改用户登录脚本。
我在用户进行身份验证的DC上使用了Powershell来解析安全事件日志:

get-eventlog "Security" | where {$_.Message -like "*Username*" -AND "Source Network Address"} | export-csv C:\Temp\test.csv

使用excel或fav编辑器打开.csv,并在同一事件中查找显示帐户名(用户名)和源网络地址的最新条目。
这可能不是100%可靠的解决方案(取决于DHCP租用时间等),但对我有用。



4

我只是使用登录脚本将用户名(以及其他信息,如日期和时间,某些程序版本等)写到计算机描述中。这样,我可以快速,轻松地从“ AD用户和计算机”中提取所有信息,此外,它还具有一种很好的方式来识别哪些仍处于AD状态的PC一段时间未使用(因此很可能是死机)。


3

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()

2

除了来自Adam的建议之外,确定用户最后登录的位置的诀窍是日志聚合。如果您有多个域控制器,则要么全部检查它们,要么集中日志记录,然后检查单个日志。

一些,甚至大多数第三方工具都足够聪明,可以查询所有域控制器。但是,如果您正在考虑编写脚本自己解析脚本,那么我就无法为集中日志进行充分的争论。


1

理想情况下,您将为CSIRT团队捕获以下内容,以协助进行调查。

使用工作站名称MAC地址IP地址日期/时间戳登录类型(rdp,交互等)登录的userid

然后将其转储到sql命令中,然后转储到他们可以查询的数据库中。点点滴滴都记录下来了,但是记录下来可以节省从DHCP / WINS服务器等提取数据的时间。


1
我认为这对于“嘿,Donny的计算机名称是什么?”有点矫kill过正。但也许有一天我们会处于这样的水平:P
加勒特

0

获取最新信息的唯一方法是通过日志搜寻。使用Microsoft Operations Manager之类的工具或诸如snare之类的免费工具,将服务器中有趣的事件日志聚合到中央位置(普通文本文件或SQL数据库),然后使用logparser或SQL查询之类的工具生成所需的报告。

有关查找不同事件的不同事件ID的信息,请参阅 事件日志百科全书

让我知道,如果您想遵循此路线,我可以帮助您为logparser创建适当的查询。


0

如果您想找历史参考,可以尝试使用第三方工具,例如Motivate Systems的Logon Central。它记录所有Active Directory用户登录并提供用于数据挖掘的Web界面。它还包括一些相当不错的图形,可将登录统计信息转换为使用率百分比。


0

ind在AD中登录

很多时候,我们需要知道特定的登录信息是否属于广告用户组。有时,我们需要了解一个广告组,并想知道谁是所有登录名的一部分。

有许多不同的方法可以实现此目的。

我按照此步骤在桌面上创建快捷方式,可以在其中轻松找到登录名。请按照以下步骤进行操作:

开始->运行-> rundll32 dsquery,OpenQueryWindow

您可以使用它找到属于您的所有广告。

开始->设置->控制面板->管理员工具-> Active Directory用户和计算机选择要查找登录名的域,右键单击该域,然后选择“查找”选项。


0

我打算将其添加为上述marcusjv答案的注释,但是我没有声誉,因此必须做一个单独的答案:

在该表达式中-AND“源网络地址”将始终为TRUE

我认为您需要的是:get-eventlog“ Security” | 其中{$ .Message -like“ * username *” -AND $ .Message.contains(“源网络地址”)}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.