Windows2003-3790/termsrv/admtools/chglogon/chglogon.c
2020-09-30 16:53:55 +02:00

211 lines
5.3 KiB
C

// Copyright (c) 1998-1999 Microsoft Corporation
/******************************************************************************
*
* CHGLOGON.C
*
* This module contains code for the CHGLOGON utility.
*
*
*******************************************************************************/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <winstaw.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <utilsub.h>
#include <string.h>
#include <locale.h>
#include <printfoa.h>
#include <winnlsp.h>
#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() */