Windows2003-3790/inetsrv/query/cipwd/cipwd.cxx
2020-09-30 16:53:55 +02:00

160 lines
4.0 KiB
C++

//+-------------------------------------------------------------------------
//
// 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 <pch.cxx>
#pragma hdrstop
extern "C"
{
#include <ntsam.h>
#include <ntlsa.h>
}
#include <cisecret.hxx>
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