Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Переменные. Скрипт на разных языковых версиях ОС (en/ru w10pro).

Ответить
Настройки темы
PowerShell - Переменные. Скрипт на разных языковых версиях ОС (en/ru w10pro).

Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем привет!

Необходимо написать скрипт со следующим алгоритмом:

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      :
Если мне необходимо извлечь значения поля "Сеанс" при запуске команды в ru-версии ОС, то я ввожу команду:
$rdpsession.Сеанс

Если необходимо сделать тоже самое в en-версии, то я ввожу команду:
$rdpsession.SESSIONNAME


Вопросы:
1. Необходимо писать несколько проверок на язык ОС и затем запускать соответствующую часть скрипта под нужный язык?
2. Или у этих параметров есть какие-то универсальные обозначения?

Отправлено: 09:54, 30-10-2019

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
if ($rdpsession.Сеанс) {$rdpsession.Сеанс}
else {$rdpsession.SESSIONNAME}

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 10:41, 30-10-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 427
Благодарности: 72

Профиль | Отправить PM | Цитировать


Цитата rango13:
Если да - проверить, кто из пользователей на ней залогинен на текущий момент и активен. Вытащить номер сессии пользователя в переменную. »
сделайте проще, сразу доставайте id

(Get-WmiObject -computername $CompRemote -query "Select logonid from Win32_LogonSession where logontype = 2").LogonId

Отправлено: 11:40, 30-10-2019 | #3


Аватара для Charg

Ветеран


Сообщения: 2798
Благодарности: 469

Профиль | Отправить PM | Цитировать


Цитата rango13:
Присоединиться к его оболочке/экрану/теневому сеансу(не знаю, как тут правильно назвать) средствами удалённого рабочего стола Windows »
Не зная пароля пользователя - не получится.
RDP работает с сеансами, вклиниться в сеанс пользователя не являясь этим пользователем невозможно (средствами RDP). А чтобы являться этим пользователем нужно залогиниться от его имени (т.е. логин+пароль). Логин можно понюхать из списка существующих сеансов, а вот пароль - нет.
Тот теневой сеанс (или как там он правильно называется) о котором ты наверное думаешь и в который можно вклиниться являясь администратором - это фишка терминальных сеансов, которые работают исключительно на серверных виндах.
Это ставит под сомнение всю идею скрипта и вообще рабочего процесса, который ты пытаешься внедрить с его помощью.

Последний раз редактировалось Charg, 30-10-2019 в 13:43.


Отправлено: 13:33, 30-10-2019 | #4


Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Charg:
Не зная пароля пользователя - не получится. »
Сеть доменная, на ПК сотрудников в локальную группу удалённого рабочего стола(и локальных администраторов) добавлен определённый пользователь.
С другого ПК, где залогинен этот пользователь запускается консоль и в ней вводится команда:

PS> qwinsta /server:ivanovis
Получаю вывод сессий, среди которых вижу ID пользователя, который работает за этим ПК. Затем пишу команду:
PS> mstsc /shadow:3 /v:ivanovis /control /noConsentPrompt

Загружается удалённый сеанс, где я вижу, что делает пользователь+я могу управлять курсором и передавать нажатия клавиш.
Вот статья на эту тему.

Отправлено: 16:27, 30-10-2019 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Charg:
RDP работает с сеансами, вклиниться в сеанс пользователя не являясь этим пользователем невозможно (средствами RDP). »
В домене, администратору — можно было (удалённое управление). А вот если сессия заблокирована — тогда да, нужно было знать пароль пользователя для разблокировки.

Как нынче с этим делом под новыми ОС — не знаю.

Отправлено: 17:56, 30-10-2019 | #6


Аватара для Charg

Ветеран


Сообщения: 2798
Благодарности: 469

Профиль | Отправить PM | Цитировать


Хм, был неправ, действительно подключиться к десктопным ОС можно, хотя и статьи говорят об обратном и везде речь идёт именно о серверах.

Отправлено: 18:06, 31-10-2019 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Charg, я сам поначалу был в шоке. когда увидел, что таковое возможно, и опробовал.

Отправлено: 21:31, 31-10-2019 | #8


Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Переменные. Скрипт на разных языковых версиях ОС (en/ru w10pro).

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Как поменять значки (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




 
Переход