2025-11-28 00:35:46 +09:00

313 lines
8.9 KiB
JavaScript

/*---------------------------------------------------------------------
Copyright (C) Microsoft Corporation. All rights reserved.
Script name : Disconnect client (killclient)
Script version : 1.0
Description : This script disconnects one or more clients from
Windows Media Server.
Command line parameters : [-s <server1>][-p <pub1>][-all|-l <ipaddress>|-n <clientname>]
where -s represents target server, -all represents all clients
-p represents publishing point
-l represents ipaddress, -n represents client name
when -all is used, -l and -n are ignored.
-l and -n cannot be used together.
Example: killclient -s server1 -all
Returns :
1. Usage: killclient [-s <server1>][-p <pub1>][-all|-l <ipaddress>|-n <clientname>]
2. A client with the specified ip address does not exist
3. A client with the specified name does not exist
4. Invalid servername has been specified.
5. Invalid Publishing point name has been specified.
OS Requirements : Windows Server 2003 (all versions)
Software requirements : WMS Server
Scripting Engine : Jscript
---------------------------------------------------------------------*/
var objServer = null;
var objPubPoint = null;
var dwWhichArg = 0;
var dwNumPlayers = 0;
var dwNumPubPoints = 0;
var szArgServer = "";
var szArgPubPoint = "";
var szEachArgument = "";
var szArgIPAddress = "";
var szArgName = "";
var szTemp = "";
var dwPubPointIndex = 0;
var bCheckedIPAddress = false;
var bCheckedClientName = false;
var bCheckedPubPointOption = false;
var bCheckAll = false;
var PubPointArgumentList = new Array();
var objArgs = WScript.Arguments;
// Parse the command to seperate out the server names
while( dwWhichArg < WScript.Arguments.length )
{
szEachArgument = objArgs(dwWhichArg);
if( "-s" == szEachArgument.toLowerCase() )
{
dwWhichArg = dwWhichArg + 1;
if(dwWhichArg >= WScript.Arguments.length ) //ex: killclient -s
{
DisplayUsage();
}
szEachArgument = objArgs(dwWhichArg);
//if next szEachArgument is any valid argument, display usage : since sytax is wrong
if(( "-p" == szEachArgument.toLowerCase() ) || ( "-all" == szEachArgument.toLowerCase() ) || ( "-l" == szEachArgument.toLowerCase() ) || ( "-n" == szEachArgument.toLowerCase() ))
{
DisplayUsage();
}
else
{
//accept only one server name
if( -1 == szEachArgument.lastIndexOf(",") )
{
szArgServer = szEachArgument;
}
else
{
DisplayUsage();
}
}
}
else if( "-p" == szEachArgument.toLowerCase() )
{
bCheckedPubPointOption = true;
dwWhichArg = dwWhichArg + 1;
if(dwWhichArg >= WScript.Arguments.length ) //ex: killclient -s server1 -p
{
DisplayUsage();
}
szEachArgument = objArgs(dwWhichArg);
if(( "-s" == szEachArgument.toLowerCase() ) || ( "-all" == szEachArgument.toLowerCase() ) ||( "-l" == szEachArgument.toLowerCase() ) || ( "-n" == szEachArgument.toLowerCase() )) //if next szEachArgument is -s, display usage : since syntax is wrong
{
DisplayUsage();
}
else
{
//accept only one publishing point name
if( -1 == szEachArgument.lastIndexOf( "," ) )
{
szArgPubPoint = szEachArgument;
}
else
{
DisplayUsage();
}
}
}
else if( "-all" == szEachArgument.toLowerCase() )
{
bCheckAll = true;
}
else if( "-1" == szEachArgument.toLowerCase() )
{
bCheckedIPAddress = true;
dwWhichArg = dwWhichArg + 1;
if(dwWhichArg >= WScript.Arguments.length ) //ex: killclient -s server1 -l
{
DisplayUsage();
}
szEachArgument = objArgs(dwWhichArg);
if(( "-s" == szEachArgument.toLowerCase() )||( "-p" == szEachArgument.toLowerCase() ) || ( "-all" == szEachArgument.toLowerCase() ) || ( "-n" == szEachArgument.toLowerCase() ))
{
DisplayUsage();
}
else
{
//accept only one ipaddress value
if( -1 == szEachArgument.lastIndexOf( "," ) )
{
szArgIPAddress = szEachArgument;
}
else
{
DisplayUsage();
}
}
}
else if( "-n" == szEachArgument.toLowerCase() )
{
bCheckedClientName = true;
dwWhichArg = dwWhichArg + 1;
if(dwWhichArg >=WScript.Arguments.length) //ex: killclient -s server1 -n
{
DisplayUsage();
}
szEachArgument = objArgs(dwWhichArg);
if(( "-s" == szEachArgument.toLowerCase() ) || ( "-p" == szEachArgument.toLowerCase() ) || ( "-all" == szEachArgument.toLowerCase() ) ||( "-l" == szEachArgument.toLowerCase() ))
{
DisplayUsage();
}
else
{
//accept only one ipaddress value
if(szEachArgument.lastIndexOf(",")== -1)
{
szArgName = szEachArgument;
}
else
{
DisplayUsage();
}
}
}
else // if it is an invalid argument
{
DisplayUsage();
}
dwWhichArg = dwWhichArg + 1;
}
//if both -l and -n arguments are used, it's wrong
if(( bCheckedClientName )&&( bCheckedIPAddress ))
{
DisplaUsage();
}
// -p must exist and (-l or -n )one of them must exist, if this is not the case, display usage
if(!(( bCheckedPubPointOption ) && (( bCheckAll )||( bCheckedIPAddress )||( bCheckedClientName ))))
{
DisplayUsage();
}
// Connect to Server
//i.e. if server name is not mentioned, then start Publishing points on localhost
if( "" == szArgServer )
{
szArgServer="LocalHost"
}
objServer = new ActiveXObject( "WMSServer.server", szArgServer );
dwPubPointIndex = GetRequestedPubPointIndex();
dwNumPlayers = objServer.PublishingPoints.Item( dwPubPointIndex ).Players.Count;
objPubPoint = objServer.PublishingPoints.Item( dwPubPointIndex );
Trace( dwNumPlayers );
if( bCheckAll )
{
DisconnectAllClients();
}
else if( bCheckedIPAddress )
{
DisconnecsClientsByIPAddr();
}
else if( bCheckedClientName )
{
DisconnecsClientsByName();
}
else
{
DisplayUsage();
}
function DisconnectAllClients()
{
if( 0 == dwNumPlayers )
{
Trace("No clients connected");
}
else
{
var strUserName;
var i = 0;
for( i = ( dwNumPlayers - 1 ); i >= 0; i-- )
{
// objPubPoint.Players.RemoveAll();
strUserName = objPubPoint.Players.Item( i ).UserName;
objPubPoint.Players.Remove( i );
Trace( "Disconnected " + strUserName );
}
}
}
function DisconnecsClientsByIPAddr()
{
if( 0 == dwNumPlayers )
{
Trace("No clients connected");
}
else
{
var i = 0;
for( i = ( dwNumPlayers - 1 ); i >= 0; i-- )
{
if( szArgIPAddress == objPubPoint.Players.Item( i ).NetworkAddress )
{
objPubPoint.Players.Remove( i );
}
Trace("Disconnected "+ objPubPoint.Players.Item( i ).NetworkAddress );
break;
}
}
}
// This function sets pubpt limits on multiple servers
function GetRequestedPubPointIndex()
{
var flag = 0;
var i = 0;
dwNumPubPoints = objServer.PublishingPoints.Count;
while( i < dwNumPubPoints )
{
szTemp = objServer.PublishingPoints.item( i ).name;
if(szTemp.toLowerCase() == szArgPubPoint.toLowerCase())
{
flag = 1;
break;
}
i = i + 1;
}
if( 0 == flag )
{
szTemp = "Publishing Point "+szArgPubPoint+" does not exist ";
Trace(szTemp);
WScript.Quit(1);
}
//else
return( i );
}
function DisconnecsClientsByName()
{
if( 0 == dwNumPlayers )
{
Trace("No clients connected");
}
else
{
var i = 0;
for( i = ( dwNumPlayers - 1 ); i >= 0; i-- )
{
if( szArgName == objPubPoint.Players.Item( i ).UserName )
{
objPubPoint.Players.Remove( i );
}
Trace("Disconnected "+ objPubPoint.Players.Item( i ).UserName );
break;
}
}
}
function DisplayUsage()
{
Trace("Usage: KillClient -s <server1> -p <pub1> [-all|-l <ipaddress>|-n <clientname>] ");
Trace("Only one server name is accepted. ");
Trace("If server name is not mentioned, local host is the default server ");
WScript.Quit(1);
}
function Trace(Msg)
{
WScript.Echo(Msg);
}