375 lines
9.3 KiB
C
375 lines
9.3 KiB
C
//
|
|
//
|
|
//
|
|
|
|
#include "olecnfg.h"
|
|
|
|
const char * GlobalKeyNames[] =
|
|
{
|
|
0,
|
|
"EnableDCOM",
|
|
"DefaultLaunchPermission",
|
|
"DefaultAccessPermission",
|
|
"LegacyAuthenticationLevel"
|
|
};
|
|
|
|
const char * ClsidKeyNames[] =
|
|
{
|
|
0,
|
|
"InprocHandler32",
|
|
"InprocServer32",
|
|
"LocalServer32",
|
|
"LocalService",
|
|
"RemoteServerName",
|
|
"RunAs",
|
|
"ActivateAtStorage",
|
|
"LaunchPermission",
|
|
"AccessPermission"
|
|
};
|
|
|
|
int ArgsLeft;
|
|
char ** Args;
|
|
|
|
HKEY hRegOle = 0;
|
|
HKEY hRegClsid = 0;
|
|
|
|
#define IsDigit(c) (IsCharAlphaNumeric(c) && !IsCharAlpha(c))
|
|
|
|
void __cdecl main(int argc, char **argv)
|
|
{
|
|
int GlobalKeys[GLOBAL_KEYS+1];
|
|
int Key;
|
|
int n;
|
|
DWORD Disposition;
|
|
long RegStatus;
|
|
|
|
memset( GlobalKeys, 0, sizeof(GlobalKeys) );
|
|
|
|
ArgsLeft = argc - 1;
|
|
Args = argv + 1;
|
|
|
|
if ( (argc > 1) &&
|
|
((strcmp( "/?", argv[1] ) == 0) || (strcmp( "-?", argv[1] ) == 0)) )
|
|
{
|
|
DisplayHelp();
|
|
return;
|
|
}
|
|
|
|
//
|
|
// With no arguments, display the global registry activation values.
|
|
//
|
|
if ( ArgsLeft == 0 )
|
|
{
|
|
DisplayGlobalSettings();
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Look for specified global registry keys and operations
|
|
//
|
|
for ( ; ArgsLeft > 0; )
|
|
{
|
|
if ( _stricmp( *Args, "EnableDCOM" ) == 0 )
|
|
Key = ENABLE_NETWORK_OLE;
|
|
else if ( _stricmp( *Args, "DefaultLaunchPermission" ) == 0 )
|
|
Key = DEFAULT_LAUNCH_PERMISSION;
|
|
else if ( _stricmp( *Args, "DefaultAccessPermission" ) == 0 )
|
|
Key = DEFAULT_ACCESS_PERMISSION;
|
|
else if ( _stricmp( *Args, "LegacyAuthenticationLevel" ) == 0 )
|
|
Key = LEGACY_AUTHENTICATION_LEVEL;
|
|
else
|
|
break;
|
|
|
|
EAT_ARG();
|
|
|
|
if ( Key >= 100 )
|
|
{
|
|
if ( Key == MERGE )
|
|
{
|
|
MergeHives( );
|
|
}
|
|
else if ( Key == SAVE_USER )
|
|
{
|
|
SaveChangesToUser( );
|
|
}
|
|
else if ( Key == SAVE_COMMON )
|
|
{
|
|
SaveChangesToCommon( );
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if ( Key == DEFAULT_ACCESS_PERMISSION )
|
|
{
|
|
GlobalKeys[Key] = YES;
|
|
continue;
|
|
}
|
|
|
|
if ( Key == LEGACY_AUTHENTICATION_LEVEL )
|
|
{
|
|
if ( ! IsDigit(**Args) || (**Args < '1') || (**Args > '6') )
|
|
{
|
|
printf( "LegacyAuthenticationLevel must be followed by a 1 to 6.\n" );
|
|
return;
|
|
}
|
|
|
|
GlobalKeys[Key] = **Args;
|
|
}
|
|
else if ( (GlobalKeys[Key] = ReadYesOrNo()) == INVALID )
|
|
{
|
|
printf( "%s must be followed by 'y' or 'n'\n", Args[-1] );
|
|
return;
|
|
}
|
|
|
|
EAT_ARG();
|
|
}
|
|
|
|
//
|
|
// Set global keys on or off.
|
|
//
|
|
for ( Key = 1; Key < sizeof(GlobalKeys)/sizeof(int); Key++ )
|
|
{
|
|
if ( (Key == LEGACY_AUTHENTICATION_LEVEL) && (GlobalKeys[Key] != 0) )
|
|
{
|
|
if ( ! SetGlobalKey( Key, GlobalKeys[Key] - '0' ) )
|
|
return;
|
|
continue;
|
|
}
|
|
|
|
if ( (GlobalKeys[Key] == YES) || (GlobalKeys[Key] == NO) )
|
|
if ( ! SetGlobalKey( Key, GlobalKeys[Key] ) )
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Process any CLSID/ProgID specification.
|
|
//
|
|
ParseClsidProgId();
|
|
|
|
if ( hRegOle )
|
|
RegCloseKey( hRegOle );
|
|
if ( hRegClsid )
|
|
RegCloseKey( hRegClsid );
|
|
}
|
|
|
|
void ParseClsidProgId()
|
|
{
|
|
CLSID_INFO ClsidInfo;
|
|
BOOL NoKeys;
|
|
int ClsidKey;
|
|
|
|
if ( ArgsLeft == 0 )
|
|
return;
|
|
|
|
memset( &ClsidInfo, 0, sizeof(CLSID_INFO) );
|
|
|
|
NoKeys = TRUE;
|
|
|
|
if ( (ArgsLeft > 0) && (**Args != '{') )
|
|
{
|
|
ClsidInfo.ProgId = *Args;
|
|
EAT_ARG();
|
|
|
|
if ( (ArgsLeft > 0) &&
|
|
(**Args != '{') &&
|
|
(NextClsidKey() == UNKNOWN) )
|
|
{
|
|
ClsidInfo.ProgIdDescription = *Args;
|
|
EAT_ARG();
|
|
}
|
|
}
|
|
|
|
if ( (ArgsLeft > 0) && (**Args == '{') )
|
|
{
|
|
ClsidInfo.Clsid = *Args;
|
|
EAT_ARG();
|
|
|
|
if ( (ArgsLeft > 0) &&
|
|
(NextClsidKey() == UNKNOWN) )
|
|
{
|
|
ClsidInfo.ClsidDescription = *Args;
|
|
EAT_ARG();
|
|
}
|
|
}
|
|
|
|
for (; ArgsLeft > 0;)
|
|
{
|
|
ClsidKey = NextClsidKey();
|
|
if ( (1 <= ClsidKey) && (ClsidKey <= CLSID_KEYS) )
|
|
NoKeys = FALSE;
|
|
|
|
EAT_ARG();
|
|
|
|
switch ( ClsidKey )
|
|
{
|
|
case LAUNCH_PERMISSION :
|
|
if ( (ClsidInfo.LaunchPermission = ReadYesOrNo()) == INVALID )
|
|
{
|
|
printf( "%s must be followed by 'y' or 'n'\n",
|
|
ClsidKeyNames[LAUNCH_PERMISSION] );
|
|
goto ErrorReturn;
|
|
}
|
|
EAT_ARG();
|
|
break;
|
|
|
|
case ACCESS_PERMISSION :
|
|
ClsidInfo.AccessPermission = YES;
|
|
break;
|
|
|
|
case ACTIVATE_AT_STORAGE :
|
|
if ( (ClsidInfo.ActivateAtStorage = ReadYesOrNo()) == INVALID )
|
|
{
|
|
printf( "%s must be followed by 'y' or 'n'\n",
|
|
ClsidKeyNames[ACTIVATE_AT_STORAGE] );
|
|
goto ErrorReturn;
|
|
}
|
|
EAT_ARG();
|
|
break;
|
|
|
|
case INPROC_HANDLER32 :
|
|
case INPROC_SERVER32 :
|
|
case LOCAL_SERVER32 :
|
|
case LOCAL_SERVICE :
|
|
if ( NextClsidKey() == UNKNOWN )
|
|
{
|
|
ClsidInfo.ServerPaths[ClsidKey] = *Args;
|
|
EAT_ARG();
|
|
}
|
|
else
|
|
{
|
|
ClsidInfo.ServerPaths[ClsidKey] = "";
|
|
}
|
|
break;
|
|
|
|
case REMOTE_SERVER_NAME :
|
|
if ( NextClsidKey() == UNKNOWN )
|
|
{
|
|
ClsidInfo.RemoteServerName = *Args;
|
|
EAT_ARG();
|
|
}
|
|
else
|
|
{
|
|
ClsidInfo.RemoteServerName = "";
|
|
}
|
|
break;
|
|
|
|
case RUN_AS :
|
|
if ( NextClsidKey() == UNKNOWN )
|
|
{
|
|
ClsidInfo.RunAsUserName = *Args;
|
|
EAT_ARG();
|
|
|
|
if ( _stricmp(ClsidInfo.RunAsUserName,"Interactive User") == 0 )
|
|
break;
|
|
|
|
if ( _stricmp(ClsidInfo.RunAsUserName,"Interactive") == 0 )
|
|
{
|
|
if ( (ArgsLeft > 0) && (_stricmp(*Args,"User") == 0) )
|
|
{
|
|
EAT_ARG();
|
|
ClsidInfo.RunAsUserName = "Interactive User";
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( NextClsidKey() != UNKNOWN )
|
|
{
|
|
printf( "RunAs password or '*' must follow the user name.\n" );
|
|
goto ErrorReturn;
|
|
}
|
|
|
|
ClsidInfo.RunAsPassword = *Args;
|
|
EAT_ARG();
|
|
}
|
|
else
|
|
{
|
|
ClsidInfo.RunAsUserName = "";
|
|
}
|
|
break;
|
|
|
|
default :
|
|
printf( "Invalid CLSID/ProgID specification given (%s)\n", Args[-1] );
|
|
goto ErrorReturn;
|
|
break;
|
|
} // switch
|
|
} // for
|
|
|
|
//
|
|
// Display current CLSID/ProgID settings if no keys were specified and
|
|
// only a CLSID or ProgID (but not both) was given.
|
|
//
|
|
if ( NoKeys &&
|
|
(ClsidInfo.ProgIdDescription == 0) &&
|
|
(ClsidInfo.ClsidDescription == 0) &&
|
|
((ClsidInfo.Clsid == 0) || (ClsidInfo.ProgId == 0)) )
|
|
DisplayClsidKeys( &ClsidInfo );
|
|
else
|
|
UpdateClsidKeys( &ClsidInfo );
|
|
|
|
return;
|
|
|
|
ErrorReturn:
|
|
printf( "No CLSID/ProgID entries were modified\n" );
|
|
}
|
|
|
|
int NextClsidKey()
|
|
{
|
|
if ( ArgsLeft == 0 )
|
|
return END_OF_ARGS;
|
|
|
|
if ( _stricmp( *Args, "InprocHandler32" ) == 0 )
|
|
return INPROC_HANDLER32;
|
|
if ( _stricmp( *Args, "InprocServer32" ) == 0 )
|
|
return INPROC_SERVER32;
|
|
if ( _stricmp( *Args, "LocalServer32" ) == 0 )
|
|
return LOCAL_SERVER32;
|
|
if ( _stricmp( *Args, "LocalService" ) == 0 )
|
|
return LOCAL_SERVICE;
|
|
if ( _stricmp( *Args, "RemoteServerName" ) == 0 )
|
|
return REMOTE_SERVER_NAME;
|
|
if ( _stricmp( *Args, "RunAs" ) == 0 )
|
|
return RUN_AS;
|
|
if ( _stricmp( *Args, "ActivateAtStorage" ) == 0 )
|
|
return ACTIVATE_AT_STORAGE;
|
|
if ( _stricmp( *Args, "LaunchPermission" ) == 0 )
|
|
return LAUNCH_PERMISSION;
|
|
if ( _stricmp( *Args, "AccessPermission" ) == 0 )
|
|
return ACCESS_PERMISSION;
|
|
|
|
return UNKNOWN;
|
|
}
|
|
|
|
int ReadYesOrNo()
|
|
{
|
|
if ( ArgsLeft == 0 )
|
|
return INVALID;
|
|
|
|
if ( (char)CharUpperA((LPSTR)**Args) == 'Y' )
|
|
return YES;
|
|
if ( (char)CharUpperA((LPSTR)**Args) == 'N' )
|
|
return NO;
|
|
|
|
return INVALID;
|
|
}
|
|
|
|
|
|
void DisplayHelp()
|
|
{
|
|
puts( "\nolecnfg\n"
|
|
"\t[EnableDCOM <y,n>]\n"
|
|
"\t[DefaultLaunchPermission <y,n>]\n"
|
|
"\t[DefaultAccessPermission]\n"
|
|
"\t[LegacyAuthenticationLevel <1,2,3,4,5,6>]\n" );
|
|
puts( "\t[[ProgID [Description]] [CLSID [Description]]\n"
|
|
"\t\t[InprocHandler32 [Path]]\n"
|
|
"\t\t[InprocServer32 [Path]]\n"
|
|
"\t\t[LocalServer32 [Path]]\n"
|
|
"\t\t[LocalService [Path]]\n"
|
|
"\t\t[RemoteServerName [MachineName]]\n"
|
|
"\t\t[RunAs [UserName Password]] ]\n"
|
|
"\t\t[ActivateAtStorage <y,n>]\n"
|
|
"\t\t[LaunchPermission <y,n>]\n"
|
|
"\t\t[AccessPermission]\n"
|
|
"\t]\n" );
|
|
}
|