在终端服务器上运行RemoteApp的完整shell(explorer.exe)

时间:2015-10-29 16:25:06

标签: vba shell internet-explorer remoteapp

民间, 我现在已经打了好几个星期了。我们在组织中的瘦客户端上运行专有企业应用程序。从这个应用程序,我们可以在幕后应用VBA脚本来做简单的功能。在过去添加按钮来打开IE并将它们引导到某些网站以输入数据,打开Calc等等。

最近我一直在使用下面的代码。它是在服务器上使用RDP会话开发的,该会话启动完整的桌面和explorer.exe。我注意到,如果explorer.exe没有运行,那么代码会在“ For each oWin in oShApp.Windows ”中显示为“运行时错误'429'”的函数中的行。

但是,如果我脚本启动explorer.exe(这很糟糕,因为它启用了启动栏和任务栏),ThinClient启动桌面和完整功能,它运行得很好,因为瘦客户端用户是登录。 我已经阅读了一些关于使用remoteapp而不是完整桌面时运行的“Limited Shell”的信息,并且想知道周围是否还有它,而没有启用开始菜单和任务栏?

请参阅下面的代码。 感谢您的帮助,CreteIT

Private Sub cmdHomePage_Click()
Dim ie As Object
Dim sMatch As String
sMatch = "http://www.companyweb.com"
    On Error Resume Next
Set ie = GetIEatURL(sMatch & "*")
On Error GoTo 0
If Not ie Is Nothing Then
    ShowWindow ie.hwnd, 9
    BringWindowToTop ie.hwnd
Else
    Dim strHome
    Dim strAPP
    strHome = "c:\progra~1\intern~1\iexplore.exe www.companyweb.com"
    strAPP = Shell(strHome, vbNormalFocus)
End If
End Sub

Function GetIEatURL(sMatch As String) As Object
Dim ie As Object, oShApp As Object, oWin As Object
Set oShApp = CreateObject("Shell.Application")
For Each oWin In oShApp.Windows
    If TypeName(oWin.Document) = "HTMLDocument" Then
        Set ie = oWin
                If LCase(ie.LocationURL) Like LCase(sMatch) Then
                Set GetIEatURL = ie
        Exit For
                End If
            End If
Next
Set oShApp = Nothing
Set oWin = Nothing
End Function

1 个答案:

答案 0 :(得分:1)

我在Microsoft的RemoteApp团队工作。我不太清楚你是从一个实际的RemoteApp会话运行这个脚本还是你自己的设置,它有一个不同的shell替换explorer.exe(或者根本没有shell),但无论哪种方式答案大致相同

您的脚本尝试实例化的Shell.Application ActiveX对象似乎是由shell实现的 - 通常是explorer.exe。如果没有运行,COM运行时将无法创建对象的实例,当您尝试激活它时,您将收到错误。

显而易见的解决方案是运行explorer.exe,但正如您所观察到的那样,还包括您可能不需要的任务栏和开始菜单。 RemoteApp运行自己的shell替换(rdpshell.exe),但是没有实现Shell.Application,因此只需在RemoteApp下运行您的应用程序就无法解决问题。

我能想到一些潜在的解决方案:

  1. 如果您使用RemoteApp,您可以编写自己的替换shell,它实现了Shell.Application。这是相当多的工作,可能没有很多关于如何正确地完成它的文档。如果您已有替换shell,则可以扩展它以实现Shell.Application。
  2. 您可以使用其他方法枚举窗口。不幸的是,这可能意味着Win32(通过EnumWindows函数),它不能直接从VB脚本访问;您可能必须创建一个实现所需行为的ActiveX对象,并从脚本中调用它。
  3. 类似于选项2但更重量级 - 您可以使ActiveX对象实现整个Shell.Application接口 - 即使它实际上不是shell - 并在远程计算机上注册它。如果你这样做,我不能保证你不会遇到问题;这不是我以前尝试过的东西。
  4. 不幸的是,这些解决方案都不是理想的,但希望某些东西可以让你做你需要的。