我有一堆服务器,我想检查是否可以使用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,则可能会破坏一切。
答案 0 :(得分:1)
您可以使用wmi来验证$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