it-swarm.cn

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

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

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

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

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

24
Garrett

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

26
John Gardeniers

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

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

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

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

6
marcusjv

您可以 启用审核 进行帐户登录事件。这些 事件 (包括工作站解锁)将存储在DC的安​​全日志中。

也有第三方工具可以使此操作更容易,例如 True Last Logon

6
Adam Brand

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

4
Maximus Minimus

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 '[email protected]: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()
3
Matvey Solodovnikov

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

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

2
Laura Thomas

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

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

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

1
Scott

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

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

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

1
SS64

ind在AD中登录

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

有许多不同的方法可以实现这一目标。

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

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

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

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

0
Lepide

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

查找不同事件的不同事件ID的方法 (事件日志百科全书

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

0
KAPes

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

0
Scott