需要根据网络上的计算机名称列表查询锁定的用户,以查找会话挂起的位置

问题描述 投票:0回答:1

我想开发一个可以执行以下操作的函数:

  1. 输入被锁定用户的用户ID
  2. 导入已知计算机名称列表
  3. 对于列表中的每台计算机名称,运行“query user /server:*”powershell 脚本
  4. 返回脚本行的结果并将不同部分解析为对象以使其可搜索
  5. 如果在其中一行中找到初始输入中给出的用户 ID,则在代码末尾返回该计算机名称和该行

我的挫败感发生在第四阶段。解析该行变得很困难。当下面的代码运行时,它在 PS 中返回零错误,但输出文件是空白的。

$names = Get-Content $InputFile
$names = @()
foreach ($name in $names){
    try { 
        $Lines = @(query user /server:$name) -split "\n"
            foreach($Line in $Lines) {
                if ($Line -match "USERNAME\s+SESSIONNAME\s+ID\s+STATE\s+IDLE TIME\s+LOGON TIME") {
                    $Parsed_Server = $Line -split '\s+'
                    $names += [PSCustomObject]@{
                        SERVER = $Name
                        USERNAME = $Parsed_Server[1]
                        SESSIONNAME = $Parsed_Server[2]
                        ID = $Parsed_Server[3]
                        STATE = $Parsed_Server[4]
                        IDLE_TIME = $Parsed_Server[5]
                        LOGON_TIME = $Parsed_Server[6]
                    }
                } else {
                    -errorAction silentlyContinue
                }
        }
    } catch {
        Continue
    }
} $names | Export-Csv -Path $OutputFile -NoType

我把代码弄乱了几次。我什至运行了代码的简化版本,并得到了在 PS 中解析一个声明的计算机名称的结果。但我很傻,只让它做了一次,并没有保存进度,也不记得我改变了什么。 正试图再次找到它,然后将其放在这篇文章中。唉,我的时间不多了,我认为这里(希望)有足够的信息来开始在社区中提供答案。

powershell server active-directory
1个回答
0
投票

我在之前的工作中解决此问题的方法是远程连接到每个域控制器并搜索 EventID 4740,其中包含导致锁定的计算机的名称或 IP 地址。您还可以在每个成员服务器或计算机上使用 4625,但必须事先启用审核。

根据我的大多数经验,这是一个不会注销远程桌面会话的用户,他们通过 RDP 连接到服务器,然后更改密码。旧的 RDP 会话会定期刷新,发送旧的信用信息并导致锁定。

不幸的是,这不是我离开那份工作时备份的脚本之一。但对我来说,这是一种更快地查找锁定发生位置的方法。

我最近还发现了一种更 PowerShell... 的方式来查找登录用户

在我的github页面上无耻插件

EventID 4740 的唯一问题是您的 AD 必须具有正确的审核设置,而“开箱即用”的 Active Directory 则没有,您必须像本文所述那样事先进行设置。

可悲的是,很久以前 Novell NDS 就内置了此功能,您可以右键单击目录中的用户并强制其所有登录注销。 NDS 在某些方面领先于时代,但最终微软的目录胜出。

© www.soinside.com 2019 - 2024. All rights reserved.