Открыть и закрыть окно RDP - PullRequest
2 голосов
/ 26 марта 2019

У меня есть несколько серверов, и я хочу проверить, могу ли я подключиться к ним с помощью RDP. У меня 2000 серверов, поэтому я хотел автоматизировать их.

Я не очень знаком с PowerShell, вот что у меня есть:

list.txt:

ip1
ip2
ip3
...
ipn

Вот мой код. Я зацикливаюсь на каждом ips, соединяюсь, проверяю, было ли соединение успешным, и пытаюсь закрыть его.

Get-Content C:\Users\MyUser\Documents\computers2.txt |
ForEach-Object{
    cmdkey /generic:TERMSRV/$_ /user:MyUser /pass:MyPassWord
    mstsc /v:$_
    Start-Sleep 90
    $app = Get-Process -processname "$_*"
    if (Get-winevent -comp $_ -FilterHashtable @{Logname='security'; ID=4624; starttime=(get-date).addMinutes(-10)} | where {$_.properties[8].value -eq 10 -and $_.properties[5].value -eq 'MyUser'}) {
        "$_" >> C:\Users\MyUser\Documents\valid.txt
    }
    $app.Kill()
}

Remote Desktop Connection открывается и подключается. Операторы if тоже работают. Но мне не удается убить мое новое подключение к удаленному рабочему столу с именем «- подключение к удаленному рабочему столу» Кажется, $app пусто.

Я пробовал также:

Stop-Process -processname "$_*"

EDIT

Я не хочу проверять, включен ли RDP на удаленном компьютере (проверьте порт с помощью Test-NetConnection -Port 53 -ComputerName $_), но имеет ли конкретный пользователь доступ к удаленному серверу.

Обход

Get-Content C:\Users\MyUser\Documents\computers2.txt |
ForEach-Object{
    cmdkey /generic:TERMSRV/$_ /user:MyUser /pass:MyPassWord
    mstsc /v:$_
    Write-Host "Sleeping for 90 sec"
    Start-Sleep 90
    if (Get-winevent -comp $_ -FilterHashtable @{Logname='security'; ID=4624; starttime=(get-date).addMinutes(-10)} | where {$_.properties[8].value -eq 10 -and $_.properties[5].value -eq 'MyUser'}) {
        "$_" >> C:\Users\MyUser\Documents\result.txt
    }
    Get-Process | Where-Object { $_.Name -eq "mstsc" } | Select-Object -First 1 | Stop-Process
}

Это работает, если вы уверены, что на компьютере, на котором вы работаете, есть только одно RDP-соединение. Для меня я подключен в RDP к этой машине ... Так что будет запущен процесс 2 mstsc. На данный момент это никогда не убивало мою сессию, только новые. Но если кто-то еще пойдет в RDP на машине, это может сломать все.

1 Ответ

1 голос
/ 26 марта 2019

Вы можете подтвердить, что $app правильно заполнен, используя :

$app = Get-WmiObject -Filter 'CommandLine LIKE "%$_%"' -Class Win32_Process
...
$app.Terminate()

В качестве альтернативы, вы можете использовать Start-Process с -PassThru для запуска mstsc.exe и назначьте $app, а затем, когда вы закончите: $app | Stop-Process

В действии:

$app = Start-Process -FilePath C:\Windows\System32\mstsc.exe -ArgumentList "/v:$_" -PassThru
...
$app | Stop-Process
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...