|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Переменные. Скрипт на разных языковых версиях ОС (en/ru w10pro). |
|
PowerShell - Переменные. Скрипт на разных языковых версиях ОС (en/ru w10pro).
|
Новый участник Сообщения: 35 |
Всем привет!
Необходимо написать скрипт со следующим алгоритмом: 1. Ввести имя машины 2. Проверить, что машина доступна по сети(т.е. отвечает на эхо-запросы команды ping) 3. Если да - проверить, кто из пользователей на ней залогинен на текущий момент и активен. Вытащить номер сессии пользователя в переменную. 4. Присоединиться к его оболочке/экрану/теневому сеансу(не знаю, как тут правильно назвать) средствами удалённого рабочего стола Windows на основании переменной из п.3. Типа Radmin. У меня пока только вопрос по п.3 - команду по вытаскиванию всех сессий я нашёл: PS C:\Users\administrator> $rdpsession = qwinsta /server:ivanovis | ForEach-Object { $_.Trim() -replace "\s+", "," } | ConvertFrom-Csv PS C:\Users\administrator> $rdpsession Результат вывода на русскоязычной версии ОС: СЕАНС : services ПОЛЬЗОВАТЕЛЬ : 0 ID : Диск СТАТУС : ТИП : УСТР-ВО : СЕАНС : console ПОЛЬЗОВАТЕЛЬ : ivanovis ID : 1 СТАТУС : Активно ТИП : УСТР-ВО : СЕАНС : rdp-tcp ПОЛЬЗОВАТЕЛЬ : 65536 ID : Прием СТАТУС : ТИП : УСТР-ВО : Результат вывода на англоязычной версии ОС: SESSIONNAME : services USERNAME : 0 ID : Disc STATE : TYPE : DEVICE : SESSIONNAME : console USERNAME : ivanovis ID : 1 STATE : Active TYPE : DEVICE : SESSIONNAME : rdp-tcp USERNAME : 65536 ID : Listen STATE : TYPE : DEVICE : $rdpsession.Сеанс Если необходимо сделать тоже самое в en-версии, то я ввожу команду: $rdpsession.SESSIONNAME Вопросы: 1. Необходимо писать несколько проверок на язык ОС и затем запускать соответствующую часть скрипта под нужный язык? 2. Или у этих параметров есть какие-то универсальные обозначения? |
|
Отправлено: 09:54, 30-10-2019 |
fascinating rhythm Сообщения: 6626
|
Профиль | Отправить PM | Цитировать |
------- Отправлено: 10:41, 30-10-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 427
|
Профиль | Отправить PM | Цитировать Цитата rango13:
(Get-WmiObject -computername $CompRemote -query "Select logonid from Win32_LogonSession where logontype = 2").LogonId |
|
Отправлено: 11:40, 30-10-2019 | #3 |
![]() Ветеран Сообщения: 2798
|
Профиль | Отправить PM | Цитировать Цитата rango13:
RDP работает с сеансами, вклиниться в сеанс пользователя не являясь этим пользователем невозможно (средствами RDP). А чтобы являться этим пользователем нужно залогиниться от его имени (т.е. логин+пароль). Логин можно понюхать из списка существующих сеансов, а вот пароль - нет. Тот теневой сеанс (или как там он правильно называется) о котором ты наверное думаешь и в который можно вклиниться являясь администратором - это фишка терминальных сеансов, которые работают исключительно на серверных виндах. Это ставит под сомнение всю идею скрипта и вообще рабочего процесса, который ты пытаешься внедрить с его помощью. |
|
Последний раз редактировалось Charg, 30-10-2019 в 13:43. Отправлено: 13:33, 30-10-2019 | #4 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Цитата Charg:
С другого ПК, где залогинен этот пользователь запускается консоль и в ней вводится команда: PS> qwinsta /server:ivanovis Получаю вывод сессий, среди которых вижу ID пользователя, который работает за этим ПК. Затем пишу команду: PS> mstsc /shadow:3 /v:ivanovis /control /noConsentPrompt Загружается удалённый сеанс, где я вижу, что делает пользователь+я могу управлять курсором и передавать нажатия клавиш. Вот статья на эту тему. |
||
Отправлено: 16:27, 30-10-2019 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Charg:
Как нынче с этим делом под новыми ОС — не знаю. |
|
Отправлено: 17:56, 30-10-2019 | #6 |
![]() Ветеран Сообщения: 2798
|
Профиль | Отправить PM | Цитировать Хм, был неправ, действительно подключиться к десктопным ОС можно, хотя и статьи говорят об обратном и везде речь идёт именно о серверах.
|
Отправлено: 18:06, 31-10-2019 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Charg, я сам поначалу был в шоке. когда увидел, что таковое возможно, и опробовал.
|
Отправлено: 21:31, 31-10-2019 | #8 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать DJ Mogarych, Ageron, Charg, Iska, наконец-то освободилось время и написал скрипт уровня начинающий. Может, вам или вашим коллегам пригодится вдруг.
Удалённое подключение средствами ОС к работающему сеансу пользователя для удалённого решения его проблем
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" } } |
Отправлено: 06:16, 15-12-2019 | #9 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Разное - [решено] Как поменять значки (UK,EN,RU) на флаги? | B1Km0p | Оформление Windows 11/ 10 / 8 / 7 / Vista | 11 | 07-11-2018 11:36 | |
Ресурсы - Отображение раскладки (En-Ru) на экранной клавиатуре Windows 7 | batyaPS | Оформление Windows 11/ 10 / 8 / 7 / Vista | 4 | 27-02-2012 14:17 | |
2008 R2 - Два контроллера на разных версиях 2008R2 стандарт и интерпрайз.....возможно ли? | dxnet | Windows Server 2008/2008 R2 | 3 | 19-02-2010 09:25 | |
CMS-ы. Как быть когда надо разместить сайт в 2-ух языковых версиях? | Sev | Вебмастеру | 1 | 16-01-2009 21:56 | |
как изменить раскладку клавиатуры с En на Ru? | Guest | Microsoft Windows 95/98/Me (архив) | 11 | 14-01-2003 14:09 |
|