// // // #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 ]\n" "\t[DefaultLaunchPermission ]\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 ]\n" "\t\t[LaunchPermission ]\n" "\t\t[AccessPermission]\n" "\t]\n" ); }