Example Multicast Scripts
Applies To: Windows Server 2008
This topic does not apply to Windows Server 2008 R2. For Windows Server 2008 R2, you can configure this behavior on the Multicast tab of the server’s properties.
The following examples are sample scripts that you can use with your multicast transmissions. To use each script, copy the code to a file and then save, it using the .vbs file name extension. Then open an elevated Command Prompt window and run a command that uses the following syntax: cscript <nameoffile>.vbs <WDSServer>. For example: cscript mcinfo.vbs localhost.
In This Topic
Stop Transmissions Slower than 1 MB per Second
Display Performance Information About Clients
Stop Transmissions Slower than 1 MB per Second
The following Microsoft Visual Basic script will stop the transmission of the master client for any multicast session that has been transmitting data at a rate slower then 1 MB per second for longer than 60 seconds. You can configure these values by using the parameters at the top of the script. The master client is the slowest client in a transmission — that is, the client that is not capable of installing any faster while the other clients may be able to install at a faster rate. To determine the master client, view the output of the following command: WDSUTIL /Get-MulticastTransmission /Show-clients. Note that there may be as many master clients as the server has network adapters.
' -------------Times are in milliseconds
sleepTime = 5000 ' Minimum time to wait between each query to the server
timeThreshold = 60000 ' Minimum time to wait before kicking the master client out of a slow session
' ------------- Speeds are in KB/sec
speedThreshold = 1024 ' Minimum transfer rate for a session
' ------------- Display variables
displayAllSessions = true ' Display all sessions on the server, not just the slow sessions
printStatusDots = true ' Print a dot every time we contact the server. Useful to show that the script is doing something
' ------------------------------- End user defined settings -------------------------------
Dim sessionDictionary, Manager, Server, hostname
' WDS Transport type definitions
WdsTptDisconnectUnknown = 0
WdsTptDisconnectFallback = 1
WdsTptDisconnectAbort = 2
' Run main
main()
' ---------------------------------- main
sub main
if WScript.Arguments.Count < 1 then
wscript.echo "[WARN]: Hostname not specified on command line, trying to connect to localhost"
hostname = "localhost"
else
hostname = WScript.Arguments.Item(0)
end if
' We use a dictionary to keep track of sessions on the server
Set sessionDictionary = CreateObject("Scripting.Dictionary")
' Create the Transport Manager
Set Manager = CreateObject("WdsTptMgmt.WdsTransportManager")
' Connect to the server
Set Server = Manager.GetWdsTransportServer(hostname)
' Echo out current settings
if displayAllSessions = false then
wscript.echo "[INFO]: Not displaying information for all sessions"
end if
if printStatusDots then
wscript.echo "[INFO]: Printing status dots"
end if
wscript.echo "[INFO]: Speed Threshold: " + Cstr(speedThreshold) + " KB/sec, Time Threshold: " + Cstr(Int(timeThreshold/1000)) + "s, Sleep time: " + Cstr(Int(sleepTime/1000)) + "s"
wscript.echo "[INFO]: Examining sessions on " + Server.name + "..." + vbCrLf
' Loop forever. User must control C out of the script to stop execution.
Do while true
if printStatusDots then
Wscript.StdOut.Write(".")
end if
loopAndKick()
wscript.sleep(sleepTime)
loop
end sub
' ---------------------------------- loopAndKick
sub loopAndKick
' Get a list of the namespaces on the server
Set NamespaceCollection = Server.NamespaceManager.RetrieveNamespaces("", "", False)
' Get all namespaces present on the server
for i = 1 to CLng(NamespaceCollection.count)
Set ns = NamespaceCollection.Item(i)
' Get all contents for this namespace
Set ContentCollection = NamespaceCollection.Item(i).RetrieveContents()
for j = 1 to CLng(ContentCollection.count)
Set content = ContentCollection.item(j)
' Get all sessions for this content
Set SessionCollection = content.RetrieveSessions()
for k = 1 to CLng(SessionCollection.count)
Set session = SessionCollection.item(k)
Set ClientCollection = session.RetrieveClients()
'Calculate the transfer rate, in KB/sec, for this session
tRate = CLng(session.TransferRate)
tRate = Int(tRate / 1024)
' Echo this session out to the screen
if displayAllSessions then
wscript.echo ns.name + content.name + ", Num clients: " + CStr(ClientCollection.count) + ", " + CStr(tRate) + " kB/sec"
end if
' If the session ID already exists in the dictionary, but no clients are connected, remove the entry from the dictionary
if ( (CLng(ClientCollection.count) = 0) AND sessionDictionary.Exists( CLng(session.ID)) ) then
wscript.echo vbTab + "Remove: " + Cstr(session.ID)
sessionDictionary.Remove(CLng(session.ID))
' If the session ID exists in the dictionary, update the session details, and kick the master client if needed
elseif sessionDictionary.Exists( CLng(session.ID) ) then
' Retrieve and update timeSlow
timeSlow = sessionDictionary.Item( CLng(session.ID) )
timeSlow = timeSlow + sleepTime
' If we've gone too slow for too long, kick the current master client
if ( (tRate < speedThreshold) AND (timeSlow > timeThreshold) ) then
' Make sure we have a valid master client ID before we attempt to kick
if Clng(session.MasterClientId) <> 0 then
wscript.echo vbTab + "Kicking client: " + Cstr(session.MasterClientId)
Server.DisconnectClient session.MasterClientId, WdsTptDisconnectFallback
' Reset time slow for this session
timeSlow = 0
end if
end if
' Remove the old entry from the dictionary
sessionDictionary.Remove(CLng(session.ID))
' If the session is still too slow, add it back to the dictionary with the new time value
if( tRate < speedThreshold) then
wscript.echo vbTab + "Update: " + Cstr(session.ID) + ", Time slow: " + Cstr(Int(timeSlow/1000)) + "s"
sessionDictionary.Add CLng(session.ID), timeSlow
Otherwise, we've removed the session from the dictionary above
else
wscript.echo vbTab + "Remove: " + Cstr(session.ID)
end if
' The session isn't in the dictionary. If the session is going too slow and has clients connected, add it to the dictionary
else
if( (tRate < speedThreshold) AND (CLng(ClientCollection.count) <> 0) ) then
wscript.echo vbTab + "Add: " + Cstr(session.ID)
sessionDictionary.Add CLng(session.ID), 0
end if
end if
next
next
next
end sub
Display Performance Information About Clients
The following Visual Basic script displays performance information for all clients in all transmissions that are connected to the same server.
' Create the Tranport Manager
Set Manager = CreateObject("WdsTptMgmt.WdsTransportManager")
if WScript.Arguments.Count = 0 then
wscript.echo "INFO: Specify a host name on the command line to connect to a remote host" & vbCrLf
Set Server = Manager.GetWdsTransportServer("localhost")
else
Set Server = Manager.GetWdsTransportServer(WScript.Arguments.Item(0))
end if
' Print Server name
wscript.echo "Server: " + Server.name
' Get a list of the namespaces on the server
Set NamespaceCollection = Server.NamespaceManager.RetrieveNamespaces("", "", False)
' Get all namespaces present on the server
for i = 1 to CLng(NamespaceCollection.count)
Set ns = NamespaceCollection.Item(i)
wscript.echo " Namespace ID: " + CStr(ns.id) + ", Name: " + ns.name
' Get all contents for this namespace
Set ContentCollection = NamespaceCollection.Item(i).RetrieveContents()
for j = 1 to CLng(ContentCollection.count)
Set content = ContentCollection.item(j)
wscript.echo " Content ID : " + CStr(content.id) + ", Name: " + content.name
' Get all sessions for this content
Set SessionCollection = content.RetrieveSessions()
for k = 1 to CLng(SessionCollection.count)
Set session = SessionCollection.item(k)
tRate = CLng(session.TransferRate)
tRate = Int(tRate / 1024)
' Get all clients for this session
Set ClientCollection = session.RetrieveClients()
wscript.echo " Session ID: " + CStr(session.id) + ", NIC Name: " + session.NetworkInterfaceName &_
+ ", tRate: " + CStr(tRate) + " kB/sec, clients: " + Cstr(ClientCollection.count)
for l = 1 to Cint(ClientCollection.count)
set client = ClientCollection.item(l)
' Determine if this client is the master client
if Clng(session.MasterClientId) = Clng(client.id) then
wscript.echo " * Client ID: " + CStr(client.id) + ", Name: " + client.name &_
+ ", IP: " + client.IpAddress + ", MAC: " + client.MacAddress + ", Time connected: " + Cstr(client.JoinDuration)
else
wscript.echo " Client ID: " + CStr(client.id) + ", Name: " + client.name &_
+ ", IP: " + client.IpAddress + ", MAC: " + client.MacAddress + ", Time connected: " + Cstr(client.JoinDuration)
end if
next
next
next
next
The following code is example output from the preceding script:
C:\Users\administrator>cscript MCInfo.vbs localhost
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.
Server: wds-server.fabrikam.com
Namespace ID: 2471217798, Name: WDS:Server08/install-(2).wim/1
Namespace ID: 2471217799, Name: WDS:Server08/install.wim/1
Namespace ID: 2471217807, Name: WDS:Server03/amd64.wim/1
Namespace ID: 2471217808, Name: WDS:Server03/x86.wim/1
Namespace ID: 2471217810, Name: WDS:Vista/amd64.wim/1
Namespace ID: 2471217811, Name: WDS:Vista/x86.wim/1
Namespace ID: 2471217812, Name: WDS:XP_SP2/install-(2).wim/1
Content ID : 3263057331, Name: Res.rwm
Session ID: 3353296855, NIC Name: Broadcom NetXtreme Gigabit Ethernet #2, tRate: 0 kB/sec, clients: 0
Namespace ID: 2471217813, Name: WDS:XP_SP2/Install.wim/1
Content ID : 3263057330, Name: Res.rwm
Session ID: 3353296854, NIC Name: Broadcom NetXtreme Gigabit Ethernet #2, tRate: 883 kB/sec, clients: 1
* Client ID: 3267943420, Name: MININT-1U7QOTT, IP: 172.30.170.162, MAC: 000E7F28D375, Time connected: 1111