You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Remote Desktop ActiveX Control枚举可重定向PnP设备

解决PowerShell枚举RDP可重定向USB设备的问题

你的实现思路方向是对的,但PowerShell的动态类型特性导致直接处理COM对象的强类型接口时会遇到障碍——这就是你拿到System.__ComObject却无法转成MSTSCLib.IMsRdpDeviceCollection的核心原因。不需要用P/Invoke,通过嵌入C#代码在PowerShell中执行,可以绕过这个限制,直接调用COM接口的强类型方法。

具体步骤

  1. 生成强类型程序集
    先通过aximp.exe生成MSTSCLib.dll(确保以管理员身份运行命令提示符):

    aximp.exe "%windir%\system32\mstscax.dll" /out:MSTSCLib.dll
    
  2. 在PowerShell中嵌入C#代码调用COM接口
    将以下代码保存为.ps1脚本,运行时会加载生成的MSTSCLib.dll,创建MsRdpClient实例并枚举可重定向设备:

    # 加载生成的MSTSCLib.dll
    Add-Type -Path ".\MSTSCLib.dll"
    
    # 嵌入C#代码处理COM强类型转换
    $code = @"
    using MSTSCLib;
    using System;
    
    public class RdpDeviceEnumerator {
        public static void ListRedirectableDevices() {
            // 创建MsRdpClient10实例
            var client = new MsRdpClient10();
            // 显式转换为IMsRdpDeviceCollection接口
            IMsRdpDeviceCollection devices = client.DeviceCollection;
    
            Console.WriteLine("可重定向的RemoteFX USB设备:");
            for (int i = 1; i <= devices.Count; i++) {
                IMsRdpDevice device = devices.Item(i);
                Console.WriteLine($"设备名称: {device.DeviceName}, 设备ID: {device.DeviceId}, 可重定向: {device.Redirectable}");
            }
        }
    }
    "@
    
    # 编译C#代码
    Add-Type -TypeDefinition $code -ReferencedAssemblies ".\MSTSCLib.dll"
    
    # 调用枚举方法
    [RdpDeviceEnumerator]::ListRedirectableDevices()
    

为什么之前的方法失败?

PowerShell对COM对象的访问是动态的,它不会自动将__ComObject绑定到对应的强类型接口(比如IMsRdpDeviceCollection)。而C#支持显式接口转换,能直接调用COM组件暴露的强类型属性和方法,这就解决了PowerShell中无法直接操作设备集合的问题。

额外注意事项

  • 确保目标系统启用了RemoteFX USB重定向功能(可通过组策略计算机配置>管理模板>Windows组件>远程桌面服务>远程桌面会话主机>设备和资源重定向>允许RemoteFX USB设备重定向开启)。
  • 运行PowerShell脚本时需要足够的权限(建议以管理员身份运行)。

内容的提问来源于stack exchange,提问作者Paul π

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:15:01