Локальный сценарий Powershell для запуска сценария VBS внутри экземпляра Citrix

Я пытаюсь получить локальный сценарий PowerShell для запуска сценария VBS внутри экземпляра Citrix. События должны быть такими:

Экземпляр Citrix, открывающий проводник Windows ----> Сетевой путь сценария, введенного в сеансе проводника Windows

Я использую WfIcaLib.dll (ICOSDK), поставляемый с установкой приемника Citrix. PDF с документацией для Citrix ICOSDK доступен здесь

Итак, это код, который я использую, который ИДЕАЛЬНО работает в командной строке Powershell, но когда я использую 32-битную ISE, он ничего не делает, кроме как сообщает мне, что DLL загружена. Я не получаю ошибок, но клиент Citrix никогда не открывается, как когда я запускаю те же самые команды через командную строку Powershell.

#load Citrix ICA Client SDK
[System.Reflection.Assembly]::LoadFile("C:\Program Files (x86)\Citrix\ICA Client\WfIcaLib.dll")

$ICA = New-Object WFICALib.ICAClientClass 
$ICA.Address = "***.***.***.***:****" 
$ICA.Application = "Windows ExplorerFED6" 
$ICA.Username = "******"
$ICA.Domain = "**" 
$ICA.Launch = $true
$ICA.Outputmode = [WfIcaLib.OutputMode]::OutputModeNormal 
$ICA.SetProp("Password", "*********")
$ICA.TWIMode=$true 
$ICA.Connect()

Любые идеи?

РЕДАКТИРОВАТЬ: РЕШЕНО - после повторного открытия в 32-разрядной среде ISE и получения кода для работы я не смог запустить файл .ps1, поскольку по умолчанию он оставался 64-разрядным (даже при использовании Open With в 32-разрядной версии PowerShell). Запуск сценария через командную строку или 32-разрядную консоль PowerShell работал.

Любой метод, предложенный Майком Гаруччо, работал нормально. Скорее всего, я буду использовать планировщик задач для запуска сценария.


person slightly drifting    schedule 23.11.2016    source источник
comment
Просто хочу подтвердить, что произойдет, если вы воспользуетесь обычным 64-битным ISE? предполагая, что это не работает, вы можете запустить сценарий в ISE, а затем запустить $ ICA | Get-Member? может помочь уточнить, что объект создается и доступны правильные свойства.   -  person Mike Garuccio    schedule 23.11.2016
comment
Майк, сейчас мне нужно отредактировать свой вопрос. Прямо перед вашим комментарием я получил ISE для запуска сценария, но теперь, если я действительно запускаю сохраненный сценарий .ps1 - я получаю исключение времени выполнения для каждого $ ICA.Property. Не похоже, что он загружает DLL. Я использую x86 (32-разрядную) версию Powershell для запуска этого (с помощью меню «Открыть с помощью»), и он выдает ошибки, как если бы это был 64-разрядный экземпляр. - Фактически подтверждено, я приостановил скрипт и посмотрел на экземпляр, хотя я выбрал версию x86, она открывается как 64-битная.   -  person slightly drifting    schedule 23.11.2016
comment
Попробуйте открыть 32-битную консоль, а затем запустить сценарий оттуда, если это сработает, я могу показать вам, как создать пространство выполнения внутри вашего сценария и запустить его оттуда, чтобы щелчок правой кнопкой мыши работал правильно   -  person Mike Garuccio    schedule 23.11.2016
comment
cd <mydir> .\myscript.ps1 Работал внутри моей 32-битной оболочки PowerShell. Так что да, скрипт отлично работает на 32-битной консоли.   -  person slightly drifting    schedule 23.11.2016
comment
хорошо, круто, позвольте мне вернуться к своим заметкам и найти мои материалы о том, как настроить для этого пространство выполнения, ответ будет в ближайшее время.   -  person Mike Garuccio    schedule 23.11.2016


Ответы (1)


Похоже, проблема связана с версией, с которой вы можете справиться с помощью start-job (изначально собирались сделать это с помощью runspace, но это намного больше кода без реальной выгоды). Это запустит задание по запуску вашего кода в 32-разрядной оболочке PowerShell, при этом все элементы графического интерфейса или всплывающие окна должны отображаться на экране, но если вам нужно будет получить какие-либо данные из сценария позже, вам нужно будет получить задание. код будет выглядеть примерно так, как показано ниже.

$SB = {
[System.Reflection.Assembly]::LoadFile("C:\Program Files (x86)\Citrix\ICA Client\WfIcaLib.dll")

  $ICA = New-Object WFICALib.ICAClientClass 
  $ICA.Address = "***.***.***.***:****" 
  $ICA.Application = "Windows ExplorerFED6" 
  $ICA.Username = "******"
  $ICA.Domain = "**" 
  $ICA.Launch = $true
  $ICA.Outputmode = [WfIcaLib.OutputMode]::OutputModeNormal 
  $ICA.SetProp("Password", "*********")
  $ICA.TWIMode=$true 
  $ICA.Connect()
}

Start-Job -ScriptBlock $SB -RunAs32
get-job | Receive-Job

В качестве альтернативы вы также можете использовать простой файл .bat в качестве средства запуска с чем-то вроде C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -file yourscript.ps1

или если вам нужно все обернуть в PowerShell и задание не работает, вы можете использовать решение Здесь, который в основном делает то же самое, но изнутри powershell (отбросьте оператор if, который они используют tho, просто используйте материал, содержащийся внутри него, как показано ниже, с любым изменения, которые необходимо внести в профиль и интерактивные настройки.)

&"$env:windir\syswow64\windowspowershell\v1.0\powershell.exe" -noninteractive -noprofile -file "C:\Path o\script.ps1" -executionpolicy bypass

надеюсь, что один из них сработает для вас!

person Mike Garuccio    schedule 23.11.2016
comment
Я смотрел на тот же самый сайт и задавался вопросом, нужно ли мне вообще условное выражение. Спасибо за предложения. Как только я обнаружил, что вы можете запускать powershell через командную строку, я понял, что могу просто запустить пакетный скрипт для запуска powershell. Много вариантов, все работают нормально. Цените помощь! - person slightly drifting; 23.11.2016
comment
да, условие необходимо только в том случае, если есть шанс, что ваш скрипт будет выполняться в системах x86 (поскольку у них нет syswow), рад, что смог помочь! - person Mike Garuccio; 23.11.2016