AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 44862
Accepted
Garrett
Garrett
Asked: 2009-07-24 13:32:51 +0800 CST2009-07-24 13:32:51 +0800 CST 2009-07-24 13:32:51 +0800 CST

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

  • 772

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

想知道上次登录的 PC 的目的是通过网络提供远程支持 - 我们的用户很少四处走动,但我想知道那天早上我所咨询的任何内容都在更新(当他们登录时) ,大概)至少。

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

如果有一个使用登录脚本的优雅解决方案,一定要提到它——但如果它恰好用于解锁站点,那就更好了!

security active-directory remote-access user-management logon-scripts
  • 12 12 个回答
  • 320000 Views

12 个回答

  • Voted
  1. Best Answer
    John Gardeniers
    2009-07-24T14:24:03+08:002009-07-24T14:24:03+08:00

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

    • 27
  2. ThatGraemeGuy
    2009-07-25T03:03:56+08:002009-07-25T03:03:56+08:00

    我们通过登录脚本来更新计算机对象在 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
    
    • 11
  3. marcusjv
    2012-03-01T16:38:00+08:002012-03-01T16:38:00+08:00

    出于类似的原因,我必须达到相同的结果;以某种方式确定特定用户从哪台机器登录。我想知道“事前”,并且不能像上面讨论的那样更改用户登录脚本。
    我在用户进行身份验证的 DC 上使用了 powershell 来解析安全事件日志:

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

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

    • 7
  4. Adam Brand
    2009-07-24T13:49:39+08:002009-07-24T13:49:39+08:00

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

    还有第三方工具可以让这更容易,例如True Last Logon。

    • 6
  5. Maximus Minimus
    2009-07-25T01:06:11+08:002009-07-25T01:06:11+08:00

    我只是使用登录脚本将用户名(以及其他信息,如日期和时间、某些程序版本等)写入计算机描述。这样,我可以快速轻松地从 AD 用户和计算机中提取所有信息,并且作为奖励,有一个很好的方法可以识别哪些 PC 仍然处于 AD 中已经有一段时间没有使用(因此很可能是死机)。

    • 4
  6. Matvey Solodovnikov
    2016-11-24T23:58:08+08:002016-11-24T23:58:08+08:00

    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()
    
    • 4
  7. Laura Thomas
    2009-07-24T14:09:24+08:002009-07-24T14:09:24+08:00

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

    一些,甚至可能是大多数第三方工具足够智能,可以查询所有域控制器。但是,如果您正在考虑编写一个脚本来自己解析它,那么对于集中您的日志,我的争论就不够有力了。

    • 2
  8. Scott
    2009-07-31T07:58:31+08:002009-07-31T07:58:31+08:00

    理想情况下,您应该为您的 CSIRT 团队获取以下信息以协助调查。

    使用工作站名称登录的用户 ID MAC 地址 IP 地址 日期/时间戳登录类型(rdp、interfactive 等)

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

    • 1
  9. SS64
    2019-10-14T04:59:09+08:002019-10-14T04:59:09+08:00

    我打算将此添加为对上述marcusjv答案的评论,但我没有声誉,因此必须单独回答:

    在该表达式中 -AND "Source Network Address" 将始终评估为 TRUE

    我认为您需要的是:get-eventlog "Security" | 其中 {$ .Message -like "*username*" -AND $ .Message.contains("Source Network Address")}

    • 1
  10. KAPes
    2009-07-25T23:48:48+08:002009-07-25T23:48:48+08:00

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

    通过事件日志百科全书查找不同事件的不同事件 ID

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

    • 0

相关问题

  • 从多个位置保护远程服务器/工具访问的最佳方法是什么?

  • 在 SOHO 环境中实施的最佳 VPN 技术是什么?[关闭]

  • 最好的 Windows 远程支持/屏幕共享工具?

  • 您如何优化新用户设置?

  • 保护新的 Ubuntu 服务器 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve