打开和关闭RDP窗口

时间:2019-03-26 14:30:57

标签: powershell

我有一堆服务器,我想检查是否可以使用RDP连接到它们。我有2000台服务器,所以我想使其自动化。

我对PowerShell不太熟悉,这是我所拥有的:

list.txt:

ip1
ip2
ip3
...
ipn

这是我的代码。我在每个ip上循环,连接,检查连接是否成功,然后尝试关闭它。

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()
}

远程桌面连接打开并连接。 if语句也可以。但是我无法杀死名为“-远程桌面连接”的全新远程桌面连接。似乎$app是空的。

我也尝试过:

Stop-Process -processname "$_*"

编辑

我不想检查远程计算机上是否有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 个答案:

答案 0 :(得分:1)

您可以使用来验证$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