|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Вызов консольной команды из Powershell и получение результата. Проблема с кириллицей. |
|
|
PowerShell - [решено] Вызов консольной команды из Powershell и получение результата. Проблема с кириллицей.
|
Пользователь Сообщения: 60 |
Здравствуйте.
В одном скрипте есть функция, которая должна делать определение пользователя работающего на удаленном ПК. Нужно чтобы определялись пользователи залогиненные с консоли, через RDP, через инструмент Подключение к виртуальной машине (Hyper-V). Все эти данные показывает утилита qwinsta, которая присутствует и в W10 и в W7. Но есть проблема: в сети присутствуют ПК как с En так и Ru локализацией. При запуске на кириллических системах через ISE или Start-Process -filepath 'qwinsta.exe' -argumentlist "/server:$env:COMPUTERNAME" -RedirectStandardOutput "C:\temp\StandardOutput.txt" $Result = get-content "C:\temp\StandardOutput.txt" При запуске в консоли PS - все красиво, но уверен что часть сотрудников для кого пишется скрипт будут его запускать через ISE. Подскажите есть какое-то решение по получению вывода от консольных приложений в читаемом варианте или корректная перекодировка на лету? Как вариант можно через Хочется сделать универсальное решение, чтобы в дальнейшем его использовать. |
|
Отправлено: 10:35, 26-08-2019 |
![]() Ветеран Сообщения: 2798
|
Профиль | Отправить PM | Цитировать Идеальное решение - не использовать старые утилиты, которые в результате выдают текст.
Powershell - штука объектно-ориентированная, так что работать нужно со свойствами объектов а не с текстом. Объясни еще раз что конкретно делает эта qwinsta, наверняка в powershell есть аналог. Я например недавно писал скрипт который коннектится к пользовательскому компьютеру, нюхает текущего залогиненного пользователя, а потом завершает рдп сеанс на rds-ферме и чистит кэш 1с. Конкретно часть "дай логин залогиненного пользователя" выглядит так: Цитата:
|
|
Отправлено: 12:15, 26-08-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 427
|
Профиль | Отправить PM | Цитировать ммм, старая проблема ISE
![]() добавьте строчку в код [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("cp866") |
Отправлено: 12:23, 26-08-2019 | #3 |
![]() Ветеран Сообщения: 2798
|
Профиль | Отправить PM | Цитировать Ageron, так придется каждый раз используя старые утилиты вспоминать про наличие этого нюанса и синтаксис решения и добавлять к скрипту. Не то чтобы это часто встречалось, но всё-таки "рассово-верное" решение - переходить на современные инструменты, тем более если они существуют и отлично работают, согласен?
Сразу же предвосхищая вопрос "а почему тогда get-wmiobject а не get-ciminstance - а вот потому что быстрее: Скрытый текст
![]() |
Отправлено: 12:26, 26-08-2019 | #4 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата densan:
|
||
Отправлено: 12:41, 26-08-2019 | #5 |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать Использую qwinsta, т.к.
Get-WMIObject -Class Win32_ComputerSystem -ComputerName |Select-Object name, Username |ft -wrap Это можно обойти, если получить все запущенные explorer.exe и вывести пользователей под которыми они запущены, но это не даст имя активного пользователя - того, чей сеанс активен в данный момент. Если подскажите как в PS получить имя пользователя, чей сеанс на ПК активен в данный момент - буду благодарен. |
Отправлено: 13:55, 26-08-2019 | #6 |
Crazy Сообщения: 1228
|
Профиль | Отправить PM | Цитировать Цитата Charg:
И ещё: а результат из PS -v 7.0, можно глянуть? |
|
------- Отправлено: 13:55, 26-08-2019 | #7 |
fascinating rhythm Сообщения: 6660
|
Профиль | Отправить PM | Цитировать Цитата Charg:
|
|
------- Отправлено: 16:52, 26-08-2019 | #8 |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать в общем через ...., но решил
$LogonUser = Invoke-Command -Session $session -ScriptBlock {(Get-WMIObject -Class Win32_ComputerSystem).Username} # про параметр -Computername знаю, но я ранее создаю сессию к ПК, проверяю её на доступность, поэтому мне удобнее/быстрее так. if ( [string]::IsNullOrEmpty($LogonUser) ) { # не получили username залогиненого пользователя # возможно пользователь работает по RDP или сессия не активна $Username = Invoke-Command -Session $session -ScriptBlock { cmd /c "qwinsta /server:$env:COMPUTERNAME" |Out-File c:\temp\1.txt -Encoding default $queryResults = Get-Content c:\temp\1.txt -Encoding oem | foreach { (($_.trim() -replace "\s+",","))} | ConvertFrom-Csv ForEach ($queryResult in $queryResults) { if ($queryResult.СТАТУС -eq 'Активно') { $RDPUser = $queryResult.ПОЛЬЗОВАТЕЛЬ } } Return $RDPUser } } else { $Username = $LogonUser.Split("\")[1] } При выводе $Report как можно указать порядок столбцов, который мне нужен: Computername, UserName, FIO ... |
Отправлено: 17:21, 26-08-2019 | #9 |
Crazy Сообщения: 1228
|
Профиль | Отправить PM | Цитировать Цитата densan:
|
|
------- Отправлено: 17:39, 26-08-2019 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
PowerShell - [решено] Backup Switch conf(Вызов powershell ), не работает скрипт. | shtir | Скриптовые языки администрирования Windows | 2 | 16-11-2015 08:45 | |
CMD/BAT - [решено] Powershell вызов из cmd | c4uran | Скриптовые языки администрирования Windows | 7 | 15-09-2015 10:53 | |
CMD/BAT - Запись результата команды в txt | DeepPurple | Скриптовые языки администрирования Windows | 4 | 12-12-2013 15:31 | |
CMD/BAT - [решено] Вызов функции из скрипта powershell | ferget | Программирование и базы данных | 0 | 03-06-2011 03:33 | |
CMD/BAT - [решено] выполнение команды с повторением до результата | cher | Скриптовые языки администрирования Windows | 3 | 23-05-2011 16:52 |
|