windows-nt/Source/XPSP1/NT/termsrv/admtools/connect/tscon.c
2020-09-26 16:20:57 +08:00

271 lines
6.8 KiB
C

// Copyright (c) 1998-1999 Microsoft Corporation
/*************************************************************************
*
* TSCON.C
*
*************************************************************************/
#include <stdio.h>
#include <windows.h>
// #include <ntddkbd.h>
// #include <ntddmou.h>
#include <winstaw.h>
#include <stdlib.h>
#include <utilsub.h>
#include <string.h>
#include <malloc.h>
#include <locale.h>
#include "tscon.h"
#include "printfoa.h"
HANDLE hServerName = SERVERNAME_CURRENT;
WCHAR ServerName[MAX_IDS_LEN+1];
WINSTATIONNAME Source;
WINSTATIONNAME Destination;
WCHAR Password[ PASSWORD_LENGTH + 1 ];
USHORT help_flag = FALSE;
USHORT v_flag = FALSE;
TOKMAP ptm[] =
{
#define TERM_PARM 0
{TOKEN_SOURCE, TMFLAG_REQUIRED, TMFORM_S_STRING,
WINSTATIONNAME_LENGTH, Source},
/* { TOKEN_SERVER, TMFLAG_OPTIONAL, TMFORM_STRING,
MAX_IDS_LEN, ServerName}, */
{TOKEN_DESTINATION, TMFLAG_OPTIONAL, TMFORM_X_STRING,
WINSTATIONNAME_LENGTH, Destination},
{TOKEN_PASSWORD, TMFLAG_OPTIONAL, TMFORM_X_STRING,
PASSWORD_LENGTH, Password},
{TOKEN_HELP, TMFLAG_OPTIONAL, TMFORM_BOOLEAN,
sizeof(USHORT), &help_flag},
{TOKEN_VERBOSE, TMFLAG_OPTIONAL, TMFORM_BOOLEAN,
sizeof(USHORT), &v_flag},
{0, 0, 0, 0, 0}
};
/*
* Local function prototypes.
*/
void Usage( BOOLEAN bError );
/*************************************************************************
*
* main
* Main function and entry point of the TSCON utility.
*
* ENTRY:
* argc - count of the command line arguments.
* argv - vector of strings containing the command line arguments.
*
* EXIT
* Nothing.
*
*************************************************************************/
int __cdecl
main(INT argc, CHAR **argv)
{
BOOLEAN bCurrent = FALSE;
int rc, i;
WCHAR *CmdLine;
WCHAR **argvW, *endptr;
ULONG SourceId, DestId;
setlocale(LC_ALL, ".OCP");
/*
* Massage the command line.
*/
argvW = MassageCommandLine((DWORD)argc);
if (argvW == NULL) {
ErrorPrintf(IDS_ERROR_MALLOC);
return(FAILURE);
}
/*
* parse the cmd line without parsing the program name (argc-1, argv+1)
*/
rc = ParseCommandLine(argc-1, argvW+1, ptm, 0);
/*
* Check for error from ParseCommandLine
*/
if ( help_flag || rc ) {
if ( !help_flag ) {
Usage(TRUE);
return(FAILURE);
} else {
Usage(FALSE);
return(SUCCESS);
}
}
// If SERVER or DEST are not specified, we need to run on TS
// Check if we are running under Terminal Server
if ( ( (!IsTokenPresent(ptm, TOKEN_SERVER) )
|| (!IsTokenPresent(ptm, TOKEN_DESTINATION)) )
&& (!AreWeRunningTerminalServices()) )
{
ErrorPrintf(IDS_ERROR_NOT_TS);
return(FAILURE);
}
/*
* Open the specified server
*/
if( ServerName[0] ) {
hServerName = WinStationOpenServer( ServerName );
if( hServerName == NULL ) {
StringErrorPrintf(IDS_ERROR_SERVER,ServerName);
PutStdErr( GetLastError(), 0 );
return(FAILURE);
}
}
/*
* Validate the source.
*/
if ( !IsTokenPresent(ptm, TOKEN_SOURCE) ) {
/*
* No source specified; use current winstation.
*/
SourceId = GetCurrentLogonId();
} else if ( !iswdigit(*Source) ) {
/*
* Treat the source string as a WinStation name.
*/
if ( !LogonIdFromWinStationName(hServerName, Source, &SourceId) ) {
StringErrorPrintf(IDS_ERROR_WINSTATION_NOT_FOUND, Source);
return(FAILURE);
}
} else {
/*
* Treat the source string as a LogonId.
*/
SourceId = wcstoul(Source, &endptr, 10);
if ( *endptr ) {
StringErrorPrintf(IDS_ERROR_INVALID_LOGONID, Source);
return(FAILURE);
}
if ( !WinStationNameFromLogonId(hServerName, SourceId, Source) ) {
ErrorPrintf(IDS_ERROR_LOGONID_NOT_FOUND, SourceId);
return(FAILURE);
}
}
/*
* Validate the destination.
*/
if ( !IsTokenPresent(ptm, TOKEN_DESTINATION) ) {
/*
* No destination specified; use current winstation.
*/
bCurrent = TRUE;
DestId = GetCurrentLogonId();
if ( !WinStationNameFromLogonId(hServerName, DestId, Destination) ) {
ErrorPrintf(IDS_ERROR_CANT_GET_CURRENT_WINSTATION, GetLastError());
PutStdErr(GetLastError(), 0);
return(FAILURE);
}
} else {
/*
* Validate the destination WinStation name.
*/
if ( !LogonIdFromWinStationName(hServerName, Destination, &DestId) ) {
StringErrorPrintf(IDS_ERROR_WINSTATION_NOT_FOUND, Destination);
return(FAILURE);
}
}
/*
* Perform the connect.
*/
if ( v_flag )
DwordStringMessage(IDS_WINSTATION_CONNECT, SourceId, Destination);
if ( !WinStationConnect(hServerName, SourceId, DestId, Password, TRUE) ) {
if ( bCurrent )
ErrorPrintf(IDS_ERROR_WINSTATION_CONNECT_CURRENT,
SourceId, GetLastError());
else
ErrorPrintf(IDS_ERROR_WINSTATION_CONNECT,
SourceId, Destination, GetLastError());
PutStdErr(GetLastError(), 0);
return(FAILURE);
}
return(SUCCESS);
} /* main() */
/*******************************************************************************
*
* Usage
*
* Output the usage message for this utility.
*
* ENTRY:
* bError (input)
* TRUE if the 'invalid parameter(s)' message should preceed the usage
* message and the output go to stderr; FALSE for no such error
* string and output goes to stdout.
*
* EXIT:
*
*
******************************************************************************/
void
Usage( BOOLEAN bError )
{
if ( bError ) {
ErrorPrintf(IDS_ERROR_INVALID_PARAMETERS);
ErrorPrintf(IDS_USAGE_1);
ErrorPrintf(IDS_USAGE_2);
ErrorPrintf(IDS_USAGE_3);
ErrorPrintf(IDS_USAGE_4);
ErrorPrintf(IDS_USAGE_5);
// ErrorPrintf(IDS_USAGE_6);
ErrorPrintf(IDS_USAGE_7);
ErrorPrintf(IDS_USAGE_8);
ErrorPrintf(IDS_USAGE_9);
}
else{
Message(IDS_USAGE_1);
Message(IDS_USAGE_2);
Message(IDS_USAGE_3);
Message(IDS_USAGE_4);
Message(IDS_USAGE_5);
//Message(IDS_USAGE_6);
Message(IDS_USAGE_7);
Message(IDS_USAGE_8);
Message(IDS_USAGE_9);
}
} /* Usage() */