我需要用特定的 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