在 Windows 2003 上使用 TCMON/TCCOM 应用 QoS DSCP 标记时出现未知错误

在 Windows 2003 上使用 TCMON/TCCOM 应用 QoS DSCP 标记时出现未知错误

我需要用特定的 DSCP 值标记来自某些 Windows 2003 服务器的某些流量。

不幸的是,在这种情况下,我们可以采取的选项既不是在路由器上标记流量,也不是升级到 Windows 2008。

我花了一些时间研究 tcmon 和 tccom,现在距离实现这个目标已经非常近了。在一台打了完整补丁并更新为最新版本的 XP 虚拟机上,我找到了编写 TCCOM 脚本的方法(使用进程资源管理器来获取变量,使用 Word 2003 vba 对象资源管理器来找出 API)。该脚本在启动时运行,并在我的 XP VM 上正确设置流程,没有任何问题。

但在 Windows 2003 Server 上,我根本无法通过脚本或使用 tcmon gui 添加流程。它只是说“未知错误”(当编写脚本时,它会给出错误代码 80004005)。

我尝试了以下方法来解决这个问题:

  • 确保安装了 qos 数据包调度程序
  • 安装了 Visual Basic 运行时 SP6
  • 尝试卸载/重新安装 tcmon/tccom 多次
  • 在几台 2003 测试服务器和虚拟机上进行了尝试
  • 我发现 它解释了如何编写 C 程序来与流量控制 API 通信,但如果我能让 tccom 工作,这似乎有点过头了。此页面上的 tcmonlite 程序不能完全满足我的需要。

有谁设法让 tcmon/tccom 在 Windows 2003 上运行吗?

对于任何感兴趣的人,这是我的脚本 (vbscript),其中包含一个示例流程(不是我实际在做的事情)。它创建一个流程并添加一个过滤器,将 DSCP 32 应用于从 192.168.10.0/24 到 192.168.20.0/24 tcp 端口 80 的流量。

option explicit

dim client 
set client = wscript.createobject("TrafficControl.Client")

dim sInterface 
sInterface = "AMD PCNET Family PCI Ethernet Adapter - Packet Scheduler Miniport"

dim ifce
set ifce = getInterface(client,sInterface)

dim flowSpec
set flowSpec = ifce.CreateFlowSpec

dim filterSpec
set filterSpec = ifce.CreateFilterSpec(2)

clearAllFlows client

flowSpec.Parameters("TX_FRIENDLY_NAME") = "From Vbscript"
flowSpec.Parameters("TX_DCLASS") = 40
flowSpec.Parameters("TX_TOKEN_RATE") = -1
flowSpec.Parameters("TX_SERVICE_TYPE") = 1

filterSpec.Parameters("PROTOCOL_ID_MASK") =0
filterSpec.Parameters("PROTOCOL_ID") = 0
filterSpec.Parameters("DEST_PORT_MASK") = 65535
filterSpec.Parameters("SOURCE_PORT_MASK") = 0
filterSpec.Parameters("DEST_PORT") = 80
filterSpec.Parameters("SOURCE_PORT") = 0
filterSpec.Parameters("DEST_ADDRESS_MASK") = "255.255.255.0"
filterSpec.Parameters("SOURCE_ADDRESS_MASK") = "255.255.255.0"
filterSpec.Parameters("DEST_ADDRESS") = "192.168.20.0"
filterSpec.Parameters("SOURCE_ADDRESS") = "192.168.10.0"

dim newFlow
set newFlow = ifce.CreateFlow(flowSpec,1,"Flow obj from vbscript")
newFlow.CreateFilter filterSpec


function getInterface(oClient,sIntName)
    dim oInterface
    for each oInterface in oClient.interfaces
        if oInterface.Name = sIntName then
            set getInterface = oInterface
        end if
    Next
end function

sub clearAllFlows(oClient)
    dim oInterface, oFlow
    for each oInterface in client.interfaces
        for each oFlow in oInterface.flows
            oFlow.delete
        Next
    Next
end sub

相关内容