当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用 PowerShell 解析 Netlogon 日志文件

作者:精品下载站 日期:2024-12-14 13:15:27 浏览:15 分类:玩电脑

如何使用 PowerShell 解析 Netlogon 日志文件


netlogon 日志文件存在于所有 Active Directory 域控制器上,并且包含大量信息。但是,它记录信息的方式却是一团糟。

在这篇文章中,您将通过解决实际问题来学习如何使用 PowerShell 读取和解析 netlogon 日志文件;追踪漫游客户。

只要 AD 存在,就会有漫游客户端。漫游客户端是那些未分配到 AD 站点的已加入域的计算机。这些计算机没有为站点定义 Active Directory 子网。他们无法知道自己所在的网站。

这些计算机存在问题,因为它们随机选择域控制器进行身份验证。如果客户端决定选择全球范围内的域控制器 (DC),身份验证请求可能需要比预期更长的时间。

识别这些漫游客户端并尽可能修复它们非常重要。

搜索 netlogon 日志文件

寻找这些客户的过程非常简单。您需要查询 AD 林中每个域控制器上的日志文件。此日志文件包含带有字符串 NO_CLIENT_SITE 的行。如果您看到此行的实例,则可以确定您有一个正在漫游的客户端。

您可以自己在 DC 上检查此日志文件,但这不太有趣。让我们使用 PowerShell 自动执行此任务!

您正在每个 DC 上查找名为 netlogon.log 的日志文件。如果任何客户端开始漫游,它们进行身份验证的 DC 将在此文件中记录该活动。此文件位于每个域控制器的C:\Windows\Debug 文件夹中。我们将在该文件中查找 NO_CLIENT_SITE 参考。

枚举森林中的所有 DC

要考虑域中的所有客户端,您需要找到林中的所有 DC。为此,请使用 Get-ADForestGet-AdDomainController PowerShell cmdlet。

Get-AdForest 返回一个名为 Domains 的属性,该属性将显示林中的所有域。拥有林中的所有域后,您可以使用 Get-ADDomainController 查找每个域中的所有域控制器。

$dcs = ((Get-ADForest).Domains | foreach {(Get-ADDomainController-Server $_ -Filter *) }).HostName

在上面的示例中,我仅输出 HostName,它是每个域控制器的 FQDN。

在 DC 上自动搜索文本文件

现在您已经拥有森林中的所有 DC,您需要开发一些代码来查询每个 DC。作为良好的实践,我总是先准备代码。一旦有了这个,就可以轻松扩展到所有域控制器。

使用 PowerShell 查找搜索文本文件的一种方法是使用 Select-String cmdlet。 Select-String 是一个 cmdlet,允许您指定正则表达式作为要搜索的模式。 Select-String 可以使用 Path 参数搜索字符串或文件内的模式。

在下面的示例中,我在 netlogon 日志 (netlogon.log) 文件中搜索包含字符串 NO_CLIENT_SITE 的所有行,如下所示:

12/25 19:36:41 子项:NO_CLIENT_SITE:MYCLIENT 192.168.0.10

如果存在匹配项,请从该行中取出名称 (MYCLIENT)。为此,请使用正则表达式 NO_CLIENT_SITE: (.*) \d。然后,将该正则表达式和 netlogon.log 文件的路径传递给 Select-String

Select-String -Pattern 'NO_CLIENT_SITE: (.*) \d' -Path "\MYDOMAINCONTROLLER\c$\windows\debug\netlogon.log"

这个输出很棒,但我只想查看客户名称。为此,请查看 Select-String 输出的每个对象。然后找到来自我们使用的正则表达式的值。

该值埋藏在每条匹配行的 Matches 属性内的第二个 Groups 对象中。

$_.Matches.Groups[1].Value

您现在的代码如下所示:

Select-String -Pattern 'NO_CLIENT_SITE: (.*) \d' -Path '\MYDOMAINCONTROLLER\c$\windows\debug\netlogon.log' | foreach {
    $_.Matches.Groups[1].Value
}

然而,你还没有完成。你会发现,如果一个客户端漫游了一段时间,它会被记录在日志中很多次。

要删除所有重复项,请将对象从 Select-String 通过管道传输到 Group-Object cmdlet。此过程将删除所有重复项,并为您提供查找唯一客户名称的方法。

Select-String -Pattern 'NO_CLIENT_SITE: (.*) \d' -Path '\MYDOMAINCONTROLLER\c$\windows\debug\netlogon.log' | foreach {
    $_.Matches.Groups[1].Value
} | Group-Object

最后一步是仅从 Group-Object 的输出中输出客户端名称。

$clients = Select-String -Pattern 'NO_CLIENT_SITE: (.*) \d' -Path '\MYDOMAINCONTROLLER\c$\windows\debug\netlogon.log' | foreach {
    $_.Matches.Groups[1].Value
} | Group-Object

$clients | foreach {
    $_.Name
}

将 netlogon 日志搜索扩展到所有 DC

您现在拥有执行单个 DC 的代码。此时,使用 foreach 循环查询所有 DC 是小菜一碟。

以下是您可以使用的整个代码块。

$dcs = ((Get-ADForest).Domains | foreach { (Get-ADDomainController -Server $_ -Filter *) }).HostName

foreach ($d in $dcs) {
    $output = @{'DomainController' = $d}
    $clients = Select-String -Pattern 'NO_CLIENT_SITE: (.*) \d' -Path "\$d\c`$\windows\debug\netlogon.log" | foreach {
        $_.Matches.Groups[1].Value
    } | Group-Object

    if ($clients) {
        $clients | foreach {
            $output.Client = $_.Name
            [pscustomobject]$output
        }
    }
}

概括

只要稍微了解一下漫游客户端的位置以及一些 PowerShell,您就可以快速解决这个问题。构建一个脚本来查询整个域中的每个 netlogon.log 文件,坐下来看看问题有多严重。现在,真正解决这些问题就取决于你了!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯