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