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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Вызов консольной команды из Powershell и получение результата. Проблема с кириллицей.

Ответить
Настройки темы
PowerShell - [решено] Вызов консольной команды из Powershell и получение результата. Проблема с кириллицей.

Пользователь


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

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


Здравствуйте.
В одном скрипте есть функция, которая должна делать определение пользователя работающего на удаленном ПК.
Нужно чтобы определялись пользователи залогиненные с консоли, через RDP, через инструмент Подключение к виртуальной машине (Hyper-V).
Все эти данные показывает утилита qwinsta, которая присутствует и в W10 и в W7. Но есть проблема: в сети присутствуют ПК как с En так и Ru локализацией.
При запуске на кириллических системах через ISE

Код: Выделить весь код
$Results = qwinsta /server:$env:COMPUTERNAME
или
Код: Выделить весь код
Start-Process -filepath 'qwinsta.exe' -argumentlist "/server:$env:COMPUTERNAME" -RedirectStandardOutput "C:\temp\StandardOutput.txt"
$Result = get-content "C:\temp\StandardOutput.txt"
в результате получаю крякозябры.

При запуске в консоли PS - все красиво, но уверен что часть сотрудников для кого пишется скрипт будут его запускать через ISE.

Подскажите есть какое-то решение по получению вывода от консольных приложений в читаемом варианте или корректная перекодировка на лету?

Как вариант можно через
Код: Выделить весь код
$result = Invoke-Command -computername ИМЯ ПК -ScriptBlock {
 здесь будут команды по получении данных из qwinsta, их парсингу и возврат 
}
Хочется сделать универсальное решение, чтобы в дальнейшем его использовать.

Отправлено: 10:35, 26-08-2019

 

Аватара для Charg

Ветеран


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

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


Идеальное решение - не использовать старые утилиты, которые в результате выдают текст.
Powershell - штука объектно-ориентированная, так что работать нужно со свойствами объектов а не с текстом.

Объясни еще раз что конкретно делает эта qwinsta, наверняка в powershell есть аналог.

Я например недавно писал скрипт который коннектится к пользовательскому компьютеру, нюхает текущего залогиненного пользователя, а потом завершает рдп сеанс на rds-ферме и чистит кэш 1с. Конкретно часть "дай логин залогиненного пользователя" выглядит так:
Цитата:
$activeUsername = Invoke-Command -ComputerName $pcname -ScriptBlock {(Get-WMIObject -class Win32_ComputerSystem).UserName.Split('\')[1]}
(Get-WMIObject -class Win32_ComputerSystem).UserName выводит логин в виде OFFICE\username (OFFICE это название моего домена), мне надо было убрать офис потому там еще сплит и прочая муть.

Отправлено: 12:15, 26-08-2019 | #2



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

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


Старожил


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

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


ммм, старая проблема ISE

добавьте строчку в код
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("cp866")

Отправлено: 12:23, 26-08-2019 | #3


Аватара для Charg

Ветеран


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

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


Ageron, так придется каждый раз используя старые утилиты вспоминать про наличие этого нюанса и синтаксис решения и добавлять к скрипту. Не то чтобы это часто встречалось, но всё-таки "рассово-верное" решение - переходить на современные инструменты, тем более если они существуют и отлично работают, согласен?


Сразу же предвосхищая вопрос "а почему тогда get-wmiobject а не get-ciminstance - а вот потому что быстрее:
Скрытый текст

Отправлено: 12:26, 26-08-2019 | #4


Ветеран


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

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


Цитата densan:
но уверен что часть сотрудников для кого пишется скрипт будут его запускать через ISE. »
Проверяйте при запуске имя хоста, и для ISE выводите красивое сообщение, что скрипт не рассчитан на работу под ним (ISE — это, вообще-то, среда для редактирования и отладки скриптов, не должно быть скриптов в продакшене, предназначенных для исполнения в ISE).
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:41, 26-08-2019 | #5


Пользователь


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

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


Использую qwinsta, т.к.

Код: Выделить весь код
Get-WMIObject -Class Win32_ComputerSystem -ComputerName |Select-Object name, Username |ft -wrap
показывает пользователей, которые вошли с консоли (работают за самим компьютером), она не показывает пользователей вошедших на ПК через RDP или через Подключение к виртуальной машине (Hyper-V), т.к. часть компьютеров виртуальные.

Это можно обойти, если получить все запущенные explorer.exe и вывести пользователей под которыми они запущены, но это не даст имя активного пользователя - того, чей сеанс активен в данный момент.

Если подскажите как в PS получить имя пользователя, чей сеанс на ПК активен в данный момент - буду благодарен.

Отправлено: 13:55, 26-08-2019 | #6


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Charg:
Сразу же предвосхищая вопрос "а почему тогда get-wmiobject а не get-ciminstance - а вот потому что быстрее »
не показатель, это измерение, при каждом запуске, будет выводить различные результаты... тут требуется статистически набранное среднее значение...
И ещё: а результат из PS -v 7.0, можно глянуть?

-------
scio me nihil scire. Ѫ


Отправлено: 13:55, 26-08-2019 | #7


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

fascinating rhythm


Moderator


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

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


Цитата Charg:
Invoke-Command -ComputerName $pcname -ScriptBlock {(Get-WMIObject -class Win32_ComputerSystem).UserName.Split('\')[1]} »
Есть параметр -Computername:
Код: Выделить весь код
gwmi Win32_ComputerSystem -ComputerName $pcname

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


Отправлено: 16:52, 26-08-2019 | #8


Пользователь


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

Профиль | Отправить 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 += New-Object PSObject -Property @{Computername = $Computername; UserName = $Username; FIO = $ADUser.Name; ipPhone = $ADUser.ipPhone; mobile = $ADUser.mobile; telephoneNumber = $ADUser.telephoneNumber;}
При выводе $Report как можно указать порядок столбцов, который мне нужен: Computername, UserName, FIO ...

Отправлено: 17:21, 26-08-2019 | #9


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата densan:
При выводе $Report как можно указать порядок столбцов, который мне нужен »
Код: Выделить весь код
$report|select Computername, UserName, FIO ...

-------
scio me nihil scire. Ѫ


Отправлено: 17:39, 26-08-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Вызов консольной команды из Powershell и получение результата. Проблема с кириллицей.

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход