【问题标题】:Local Powershell script to trigger VBS script inside Citrix instance本地 Powershell 脚本在 Citrix 实例中触发 VBS 脚本
【发布时间】:2017-04-07 15:40:01
【问题描述】:

我正在尝试获取本地 powershell 脚本来触发 citrix 实例中的 VBS 脚本。事件应该是这样的:

Citrix 实例打开 Windows 资源管理器 ----> 键入到 Windows 资源管理器会话中的脚本的网络路径

我正在使用 Citrix 接收器安装随附的 WfIcaLib.dll (ICOSDK)。 Documentation PDF for the Citrix ICOSDK is available here

所以这是我正在使用的代码,它在 Powershell 命令行中完美运行,但是当我使用 32 位 ISE 时,它只会告诉我 DLL 已加载。我没有收到任何错误,但是当我通过 Powershell 命令行运行相同的确切命令时,Citrix 客户端从未真正打开过。

#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 位(即使在 32 位 powershell 版本上使用 Open With)。通过命令提示符或 32 位 powershell 控制台运行脚本都有效。

使用 Mike Garuccio 建议的任何方法都可以正常工作。我很可能最终会使用任务计划程序来运行脚本。

【问题讨论】:

  • 只是想确认一下,如果使用普通的 64 位 ISE 会怎样?假设这不起作用,您可以在 ISE 中运行脚本,然后运行 ​​$ICA |获取会员?可能有助于澄清正在创建对象并且正确的属性可用。
  • 迈克,我现在必须编辑我的问题。在您发表评论之前,我让 ISE 运行脚本,但现在如果我实际运行保存的 .ps1 脚本 - 每个 $ICA.Property 都会出现运行时异常。它看起来不像在加载 DLL。我正在使用 x86(32 位)版本的 Powershell 来运行它(使用 Open With 菜单),它会抛出错误,就好像它是 64 位实例一样。 - 确实证实了,我暂停了脚本,查看了实例,虽然我选择了x86版本,但它以64位打开。
  • 尝试打开 32 位控制台,然后从那里运行脚本,如果可行,我可以向您展示如何在脚本中构建运行空间并从那里运行,以便右键单击正常工作
  • cd <mydir> .\myscript.ps1 在我的 32 位 powershell 中工作。所以是的,脚本在 32 位控制台中运行良好。
  • 好吧,让我回顾一下我的笔记,找到关于如何为此配置运行空间的资料,很快就会有答案。

标签: powershell citrix xenapp


【解决方案1】:

看起来问题出在版本控制问题上,您可以使用 start-job 来处理(原本打算使用运行空间来解决这个问题,但代码更多,没有真正的好处)。这将启动在 32 位 powershell 下运行代码的作业,它仍应在屏幕上放置任何 GUI 元素或弹出窗口,但如果您稍后需要从脚本中获取任何数据,则需要接收该作业。代码如下所示。

$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 中并且工作不起作用,您可以使用解决方案 Here,它基本上做同样的事情,但在 powershell 中(删除他们使用的 if 语句,只需使用这些东西包含在其中,如下所示,您需要对配置文件和交互式设置进行任何更改。)

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

希望其中一个适合你!

【讨论】:

  • 我正在查看完全相同的站点,想知道我是否需要条件语句。感谢您的建议。一旦我发现你可以通过 cmd 提示符运行 powershell,我意识到我可以只用一个批处理脚本来启动 powershell。很多选择,一切都很好。感谢您的帮助!
  • 是的,仅当您的脚本有可能在 x86 系统上执行时才需要条件(因为他们没有 syswow)很高兴我能提供帮助!
猜你喜欢
  • 2021-11-09
  • 2019-08-10
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多