Удалённое подключение средствами ОС к работающему сеансу пользователя для удалённого решения его проблем
Код:
Import-Module ActiveDirectory
$encoding = [System.Text.Encoding]::UTF8
$MSRA = 'C:\Windows\System32\msra.exe'
$MSTSC = 'C:\Windows\System32\mstsc.exe'
$ipRegEx="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
$i=1
### Ввод части имени компьютера для поиска в AD и проверка, существует ли такой ПК в домене.
### Если не существует - сообщить об этом и снова предложить ввести корректное имя ПК в домене.
[console]::ForegroundColor = "Green"
clear-host
$List_of_computers = "1"
$i=1
do {
switch ($List_of_computers.length)
{
{$List_of_computers -eq "1"}
{
$ComputerName = Read-Host "Введите часть имени компьютера для удалённого подключения через Windows Remote Assistance"
}
{$List_of_computers.length -eq 0}
{
clear-host
$ComputerName = Read-Host "Компьютера с таким именем($ComputerName) не существует.`nПожалуйста, введите другое имя"
}
}
### "[dc.vektor.local]" - имя вашего домен-контроллера, если нужно искать конкретно на нём имена рабочиз станций
### 'OU=Workstations,DC=vektor,DC=local' - путь к OU, где располагаются все рабочие станции, по которым будет происходить выборка
$List_of_computers = (Get-ADComputer -Server "[dc.vektor.local]" -SearchBase 'OU=Workstations,DC=vektor,DC=local' -LDAPFilter "(name=*$ComputerName*)" | Select Name -ExpandProperty Name | Sort)
} while ($List_of_computers.length -eq 0)
[console]::ForegroundColor = "White"
### Проверка - если найден только один ПК из найденных компьютеров в домене - занести в переменную $Targeted_Computer только его.
### Иначе вывести список найденных ПК с предложением выбора нужного компьютера и присовением имени выбранного ПК в переменную $Targeted_Computer
if ($List_of_computers.gettype().isArray -eq $False)
{
Write-Output "`nПо поисковому запросу найден только один компьютер($List_of_computers)`n"
"[$i] " + $List_of_computers
$Targeted_Computer=$List_of_computers
}
else {
for (;$List_of_computers[$i-1];$i++)
{
"[$i] "+ $List_of_computers[$i-1]
}
$i=[int](Read-Host "Введите номер компьютера из списка или нажмите Ctrl+C - для завершения работы скрипта")
$Targeted_Computer=$List_of_computers[$i-1]
}
### После выбора ПК производится проверка сетевой доступности этого компьютера.
### Если по DNS-имени недоступен - появляется предложение ввести его IP-адрес, чтобы подключиться через него.
### Но, если ПК доступен по DNS-имени, то произвести проверку на версию ОС.
### Если версия ОС уровня Windows 7 - подключиться старым способом с запросом у юзера разрешения на доступ к его ПК
### Иначе подключиться к юзеру без запроса логина/пароля.
if (-not (Test-Connection -ComputerName $Targeted_Computer -Quiet -Count 1 -EA Silent))
{
$ComputerIP = Read-Host "Компьютер недоступен(не пингуется DNS-имя), попробуйте ввести его ip-адрес"
if ($ComputerIP -notmatch $ipRegEx)
{
Write-Host "ip-адрес введён неверно, запустите скрипт заново"
exit
}
start-Process -FilePath $MSRA -Args "/offerra \\$ComputerIP"
}
else
{
$OsVer = (Get-WmiObject Win32_OperatingSystem -ComputerName "$Targeted_Computer").version
if ($OsVer -match ("6.1"))
{
start-Process -FilePath $MSRA -Args "/offerra \\$Targeted_Computer"
}
else
{
### Здесь производится поиск номера сессии на удалённом ПК и занесение номера в переменную, чтобы использовать её для удаленного подключения
$i=0
$User_Session = (quser /server:$Targeted_Computer | Select-Object -skip 1 | ForEach-Object{$_.Split(' ',[System.StringSplitOptions]::RemoveEmptyEntries)})
foreach ($Session_name in $User_Session)
{
if ($Session_name -like "console")
{
$rid = $User_Session[$i+1]
}
$i++
}
write-host "Запускается удалённый помощник на компьютере $Targeted_Computer"
start-Process -FilePath $MSTSC -Args "/shadow:$rid /v:$Targeted_Computer /control /noConsentPrompt"
}
}