// Copyright (c) 1998-1999 Microsoft Corporation /****************************************************************************** * * CHGLOGON.C * * This module contains code for the CHGLOGON utility. * * *******************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "chglogon.h" // max length of the locale string #define MAX_LOCALE_STRING 64 /* * Global Data */ USHORT help_flag = FALSE; // User wants help USHORT fQuery = FALSE; // query winstations USHORT fEnable = FALSE; // enable winstations USHORT fDisable = FALSE; // disable winstations TOKMAP ptm[] = { {L"/q", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fQuery}, {L"/query", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fQuery}, {L"/enable", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fEnable}, {L"/disable", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fDisable}, {L"/?", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &help_flag}, {0, 0, 0, 0, 0} }; /* * Local function prototypes. */ void Usage(BOOLEAN bError); /******************************************************************************* * * main * ******************************************************************************/ int __cdecl main(INT argc, CHAR **argv) { WCHAR **argvW; ULONG rc; INT i; PPOLICY_TS_MACHINE Ppolicy; WCHAR wszString[MAX_LOCALE_STRING + 1]; setlocale(LC_ALL, ".OCP"); // We don't want LC_CTYPE set the same as the others or else we will see // garbage output in the localized version, so we need to explicitly // set it to correct console output code page _snwprintf(wszString, sizeof(wszString)/sizeof(WCHAR), L".%d", GetConsoleOutputCP()); wszString[sizeof(wszString)/sizeof(WCHAR) - 1] = L'\0'; _wsetlocale(LC_CTYPE, wszString); SetThreadUILanguage(0); /* * 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 && !(rc & PARSE_FLAG_NO_PARMS) ) { Usage(TRUE); return(FAILURE); } else { Usage(FALSE); return(SUCCESS); } } //Check if we are running under Terminal Server if(!AreWeRunningTerminalServices()) { ErrorPrintf(IDS_ERROR_NOT_TS); return(FAILURE); } /* * Check if Group policy has thrown the big switch, if so, inform and refuse any changes */ Ppolicy = LocalAlloc( LPTR, sizeof(POLICY_TS_MACHINE) ); if (Ppolicy == NULL) { ErrorPrintf(IDS_ERROR_MALLOC); return(FAILURE); } RegGetMachinePolicy( Ppolicy ); if ( Ppolicy->fPolicyDenyTSConnections ) { if (Ppolicy->fDenyTSConnections) { ErrorPrintf(IDS_ERROR_WINSTATIONS_GP_DENY_CONNECTIONS_1 ); } else { ErrorPrintf(IDS_ERROR_WINSTATIONS_GP_DENY_CONNECTIONS_0 ); } LocalFree( Ppolicy ); Ppolicy = NULL; return( FAILURE ); } if (Ppolicy != NULL) { LocalFree( Ppolicy ); Ppolicy = NULL; } /* * Enable or disable */ if ( fDisable ) { rc = WriteProfileString( APPLICATION_NAME, WINSTATIONS_DISABLED, TEXT("1") ); } else if ( fEnable ) { rc = WriteProfileString( APPLICATION_NAME, WINSTATIONS_DISABLED, TEXT("0") ); } /* * Query or error ? */ if ( !fQuery && (rc != 1) ) { ErrorPrintf(IDS_ACCESS_DENIED); } else if ( GetProfileInt( APPLICATION_NAME, WINSTATIONS_DISABLED, 0 ) == 0 ) { ErrorPrintf(IDS_WINSTATIONS_ENABLED); } else { ErrorPrintf(IDS_WINSTATIONS_DISABLED); } return(SUCCESS); } /******************************************************************************* * * 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_HELP_USAGE1); ErrorPrintf(IDS_HELP_USAGE2); ErrorPrintf(IDS_HELP_USAGE3); ErrorPrintf(IDS_HELP_USAGE4); ErrorPrintf(IDS_HELP_USAGE5); } /* Usage() */