由于我们与 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 登录用户产生不一致的结果,所以如果那里有更好的选择,那将很有帮助。