![]() |
Вызов консольной команды из Powershell и получение результата. Проблема с кириллицей.
Здравствуйте.
В одном скрипте есть функция, которая должна делать определение пользователя работающего на удаленном ПК. Нужно чтобы определялись пользователи залогиненные с консоли, через 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" При запуске в консоли PS - все красиво, но уверен что часть сотрудников для кого пишется скрипт будут его запускать через ISE. Подскажите есть какое-то решение по получению вывода от консольных приложений в читаемом варианте или корректная перекодировка на лету? Как вариант можно через Код:
$result = Invoke-Command -computername ИМЯ ПК -ScriptBlock { |
Идеальное решение - не использовать старые утилиты, которые в результате выдают текст.
Powershell - штука объектно-ориентированная, так что работать нужно со свойствами объектов а не с текстом. Объясни еще раз что конкретно делает эта qwinsta, наверняка в powershell есть аналог. Я например недавно писал скрипт который коннектится к пользовательскому компьютеру, нюхает текущего залогиненного пользователя, а потом завершает рдп сеанс на rds-ферме и чистит кэш 1с. Конкретно часть "дай логин залогиненного пользователя" выглядит так: Цитата:
|
ммм, старая проблема ISE :)
добавьте строчку в код [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("cp866") |
Ageron, так придется каждый раз используя старые утилиты вспоминать про наличие этого нюанса и синтаксис решения и добавлять к скрипту. Не то чтобы это часто встречалось, но всё-таки "рассово-верное" решение - переходить на современные инструменты, тем более если они существуют и отлично работают, согласен?
Сразу же предвосхищая вопрос "а почему тогда get-wmiobject а не get-ciminstance - а вот потому что быстрее: Скрытый текст
![]() |
Цитата:
|
Использую qwinsta, т.к.
Код:
Get-WMIObject -Class Win32_ComputerSystem -ComputerName |Select-Object name, Username |ft -wrap Это можно обойти, если получить все запущенные explorer.exe и вывести пользователей под которыми они запущены, но это не даст имя активного пользователя - того, чей сеанс активен в данный момент. Если подскажите как в PS получить имя пользователя, чей сеанс на ПК активен в данный момент - буду благодарен. |
Цитата:
И ещё: а результат из PS -v 7.0, можно глянуть? |
Цитата:
Код:
gwmi Win32_ComputerSystem -ComputerName $pcname |
в общем через ...., но решил
Код:
$LogonUser = Invoke-Command -Session $session -ScriptBlock {(Get-WMIObject -Class Win32_ComputerSystem).Username} Код:
$Report += New-Object PSObject -Property @{Computername = $Computername; UserName = $Username; FIO = $ADUser.Name; ipPhone = $ADUser.ipPhone; mobile = $ADUser.mobile; telephoneNumber = $ADUser.telephoneNumber;} |
Цитата:
Код:
$report|select Computername, UserName, FIO ... |
densan, а зачем Вам вообще промежуточный текстовый файл:
Код:
cmd /c "qwinsta /server:$env:COMPUTERNAME" |Out-File c:\temp\1.txt -Encoding default Скрытый текст
Код:
$oProcess = New-Object -TypeName 'System.Diagnostics.Process' Не? |
В сети безопасники включили для PS режим CLM, часть функционала PS заблокирована.
Код:
New-Object : Не удается создать тип. В этом языковом режиме поддерживаются только основные типы. Код:
$tmp = New-TemporaryFile |
densan, в любом случае — зачем Вам вызов cmd /c? Мне кажется, что он тут лишний, не?
|
Спасибо, действительно конструкция без cmd /c работает:
Код:
$tmp = New-TemporaryFile |
Время: 23:24. |
Время: 23:24.
© OSzone.net 2001-