仅当没有用户远程登录时,才从作业启动MSTSC / RDP

时间:2019-07-10 13:16:11

标签: powershell username rdp mstsc

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

1 个答案:

答案 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"
}

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