由于我们与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台计算机执行此操作时,它将为约6台计算机启动mstsc
,等待约45秒,然后再打开几个窗口(仅存在约10台计算机)。因此,我认为作业正在运行且耗时太长可能存在问题?如果执行时间太长,取消作业的最佳方法是什么?
我不确定该问题是否与$args
/ $args[0]
有关。过去处理工作时,我不得不使用$args[0]
。我还知道,这可能会导致与Windows 10登录用户产生不一致的结果,因此,如果那里有更好的选择,那将有所帮助。
答案 0 :(得分: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"
}
我现在遇到另一个问题,但是我将发布另一个问题。