//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996 // // Purpose: Hack app for setting/viewing password entries used by // CI to index remote scopes. Someday, this will be // handled by a real GUI admin tool. // // History: 28-Oct-96 dlee Created // //-------------------------------------------------------------------------- #include #pragma hdrstop extern "C" { #include #include } #include void DumpSecrets( WCHAR const * pwcMachine ) { // list all of the ci secret items CCiSecretRead secret( pwcMachine ); CCiSecretItem * pItem = secret.NextItem(); while ( 0 != pItem ) { printf( " catalog, user, password: '%ws' '%ws' '%ws'\n", pItem->getCatalog(), pItem->getUser(), pItem->getPassword() ); pItem = secret.NextItem(); } } //DumpSecrets void AddOrReplaceSecret( WCHAR const * pwcCat, WCHAR const * pwcUser, WCHAR const * pwcPW ) { // write objects start blank -- the old entries must be copied // into the write object, along with the new entry. CCiSecretWrite secretWrite; CCiSecretRead secret; CCiSecretItem * pItem = secret.NextItem(); while ( 0 != pItem ) { if ( ( !_wcsicmp( pwcCat, pItem->getCatalog() ) ) && ( !_wcsicmp( pwcUser, pItem->getUser() ) ) ) { // don't add this -- replace it below } else { // just copy the item secretWrite.Add( pItem->getCatalog(), pItem->getUser(), pItem->getPassword() ); } pItem = secret.NextItem(); } // add the new item secretWrite.Add( pwcCat, pwcUser, pwcPW ); // write it to the sam database secretWrite.Flush(); } //AddOrReplaceSecret void EmptySecrets() { CCiSecretWrite secretWrite; secretWrite.Flush(); } //EmptySecrets void Usage() { printf( "usage: cipwd catalogname domain\\user pwd\n" " or: cipwd -d[ump] [machine] (dump the entry list) \n" " or: cipwd -e[mpty] (empty the entry list)\n" ); exit( 1 ); } //Usage int __cdecl main( int argc, char *argv[] ) { TRANSLATE_EXCEPTIONS; TRY { if ( argc < 2 || argc > 4 ) Usage(); if ( 2 == argc || 3 == argc ) { if ( argv[1][0] == '-' && argv[1][1] == 'd' ) { if ( 2 == argc ) DumpSecrets( 0 ); else { WCHAR awcMachine[ MAX_PATH ]; mbstowcs( awcMachine, argv[2], sizeof awcMachine ); DumpSecrets( awcMachine ); } } else if ( argv[1][0] == '-' && argv[1][1] == 'e' ) EmptySecrets(); else Usage(); } else { WCHAR awcCat[ MAX_PATH + 1 ]; size_t c = mbstowcs( awcCat, argv[1], MAX_PATH ); if ( ( c == -1 ) || ( c == MAX_PATH ) ) THROW( CException( E_INVALIDARG ) ); WCHAR awcUser[ MAX_PATH + 1 ]; c = mbstowcs( awcUser, argv[2], MAX_PATH ); if ( ( c == -1 ) || ( c == MAX_PATH ) ) THROW( CException( E_INVALIDARG ) ); WCHAR awcPwd[ MAX_PATH + 1 ]; c = mbstowcs( awcPwd, argv[3], MAX_PATH ); if ( ( c == -1 ) || ( c == MAX_PATH ) ) THROW( CException( E_INVALIDARG ) ); AddOrReplaceSecret( awcCat, awcUser, awcPwd ); } } CATCH ( CException, e ) { printf( "caught exception 0x%x\n", e.GetErrorCode() ); } END_CATCH UNTRANSLATE_EXCEPTIONS; return 0; } //main