0

由于我们与 AD 和我们的库存管理工具存在差异,因此我正在尝试验证系统。我需要尝试远程访问大量 PC(约 500 台)。我正在尝试构建一个 GUI/脚本,如果没有用户登录,它将远程连接到计算机。我可以一个一个地做到这一点,但是因为有大量的 PC 在 AD 中,但不存在它每个失败都需要很长时间。我想尝试为列表中的所有计算机启动一项工作,但仅mstsc在没有用户登录的情况下启动。

#Clear previous jobs
Get-Job | Remove-Job
$computers = $richtextbox1.Text.Split("`n") | % { $_.trim() }
foreach ($computer in $computers) {
    if ($computer -ne "") {
         Start-Job -ScriptBlock {
             if (Test-Connection -ComputerName $args[0] -Count 1) {
                $uname = ""
                $uname = Get-WmiObject -Class Win32_Computersystem -ComputerName $args[0] |
                         Select-Object -Expand UserName
                if ($uname -like "") {
                      C:\Windows\System32\mstsc.exe /v:$args /h:768 /w:1024
                      # At this point the mstsc box would pop up, and the job
                      # can be killed if possible
                }
             }
         } -ArgumentList $computer
    }
}

如果我删除if ($uname -like "")它将启动mstsc。另一个问题是,当我对 60 台计算机执行此操作时,它将启动mstsc约 6 台计算机,等待大约 45 秒,然后再打开几个窗口(仅存在大约 10 台计算机)。所以我认为作业正在运行并且花费太长时间可能存在问题?如果执行时间太长,取消作业的最佳方法是什么?

我不确定问题是否与$args/相关$args[0]。在过去处理工作时,我不得不使用$args[0]. 我也知道这可能会与使用 Windows 10 登录用户产生不一致的结果,所以如果那里有更好的选择,那将很有帮助。

4

1 回答 1

0

我最终使用此检查来查看用户是否已登录,并且它有效。

$NOTNULLIFLOCKED = $null
$NOTNULLIFLOCKED = gwmi -Class win32_process -computername $comp -Filter "Name='LogonUI.exe'"
if ($NOTNULLIFLOCKED -ne $null)
{
    # No Active Session (LogonUI.exe Running)
    # If LogonUI.exe is running, that means the login box is currently present on the screen.
    & C:\Windows\System32\mstsc.exe "/v:$comp" "/h:768" "/w:1024"
}

我现在遇到另一个问题,但我会发布另一个问题。

于 2019-07-10T16:19:48.220 回答