windows-nt/Source/XPSP1/NT/ds/nw/ndsutils/schema.c
2020-09-26 16:20:57 +08:00

450 lines
14 KiB
C

/***
Copyright (c) 1995 Microsoft Corporation
Module Name:
Schema.c
Abstract:
Command line test tool for testing the NDS schema APIs.
Author:
Glenn Curtis [glennc] 22-Apr-96
***/
#include <utils.c>
int
_cdecl main( int argc, char **argv )
{
DWORD status = NO_ERROR;
HANDLE hObject;
HANDLE hOperationData = NULL;
OEM_STRING OemArg;
UNICODE_STRING TreeName;
WCHAR lpTreeName[256];
UNICODE_STRING ObjectName;
WCHAR lpObjectName[256];
WCHAR TempName[256];
HANDLE hTree;
ASN1_ID asn1Id;
TreeName.Length = 0;
TreeName.MaximumLength = sizeof( lpTreeName );
TreeName.Buffer = lpTreeName;
ObjectName.Length = 0;
ObjectName.MaximumLength = sizeof( lpObjectName );
ObjectName.Buffer = lpObjectName;
//
// Check the arguments.
//
if ( argc != 5 )
{
Usage:
printf( "\nUsage: schema <tree name> -a|m|r A|C <attribute or class name>\n" );
printf( "\n where: a = add\n" );
printf( " where: m = modify (classes only)\n" );
printf( " where: r = remove\n" );
printf( " where: A = Attribute\n" );
printf( " where: C = Class\n" );
return -1;
}
OemArg.Length = strlen( argv[1] );
OemArg.MaximumLength = OemArg.Length;
OemArg.Buffer = argv[1];
RtlOemStringToUnicodeString( &TreeName, &OemArg, FALSE );
OemArg.Length = strlen( argv[4] );
OemArg.MaximumLength = OemArg.Length;
OemArg.Buffer = argv[4];
RtlOemStringToUnicodeString( &ObjectName, &OemArg, FALSE );
status = NwNdsOpenObject( TreeName.Buffer,
NULL,
NULL,
&hTree,
NULL,
NULL,
NULL,
NULL,
NULL );
if ( status )
{
printf( "\nError: NwNdsOpenObject returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
if ( argv[2][1] == 'a' && argv[3][0] == 'A' )
{
DWORD dwSyntaxId;
DWORD dwMinValue;
DWORD dwMaxValue;
printf( "\nGoing to try to add an attribute to schema.\n" );
printf( "\nEnter a syntax id (0-27) for new attribute %S\n", ObjectName.Buffer );
scanf( "%d", &dwSyntaxId );
printf( "\nEnter a minimum range value for new attribute %S\n", ObjectName.Buffer );
scanf( "%d", &dwMinValue );
printf( "\nEnter a maximum range value for new attribute %S\n", ObjectName.Buffer );
scanf( "%d", &dwMaxValue );
status = NwNdsDefineAttribute( hTree,
ObjectName.Buffer,
NDS_SINGLE_VALUED_ATTR,
dwSyntaxId,
dwMinValue,
dwMaxValue,
asn1Id );
if ( status )
{
printf( "\nError: NwNdsDefineAttribute returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
printf( "\n Success!\n" );
return 0;
}
if ( argv[2][1] == 'r' && argv[3][0] == 'A' )
{
printf( "\nGoing to try to remove an attribute from schema.\n" );
status = NwNdsDeleteAttrDef( hTree,
ObjectName.Buffer );
if ( status )
{
printf( "\nError: NwNdsDeleteAttrDef returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
printf( "\n Success!\n" );
return 0;
}
if ( argv[2][1] == 'a' && argv[3][0] == 'C' )
{
HANDLE hSuperClasses = NULL;
HANDLE hContainmentClasses = NULL;
HANDLE hNamingAttributes = NULL;
HANDLE hMandatoryAttributes = NULL;
HANDLE hOptionalAttributes = NULL;
DWORD dwFlags;
printf( "\nGoing to try to add a class to schema.\n" );
do
{
printf( "\nEnter super class name or <Enter> to end : " );
GetStringOrDefault( TempName, L"" );
if ( wcslen(TempName) > 0 )
{
if ( hSuperClasses == NULL )
{
status = NwNdsCreateBuffer( NDS_SCHEMA_DEFINE_CLASS,
&hSuperClasses );
if ( status )
{
printf( "\nError: NwNdsCreateBuffer returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
}
status = NwNdsPutInBuffer( TempName,
0,
NULL,
0,
0,
hSuperClasses );
if ( status )
{
printf( "\nError: NwNdsPutInBuffer returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
}
} while ( wcslen(TempName) > 0 );
do
{
printf( "\nEnter containment class name or <Enter> to end : " );
GetStringOrDefault( TempName, L"" );
if ( wcslen(TempName) > 0 )
{
if ( hContainmentClasses == NULL )
{
status = NwNdsCreateBuffer( NDS_SCHEMA_DEFINE_CLASS,
&hContainmentClasses );
if ( status )
{
printf( "\nError: NwNdsCreateBuffer returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
}
status = NwNdsPutInBuffer( TempName,
0,
NULL,
0,
0,
hContainmentClasses );
if ( status )
{
printf( "\nError: NwNdsPutInBuffer returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
}
} while ( wcslen(TempName) > 0 );
do
{
printf( "\nEnter naming attribute name or <Enter> to end : " );
GetStringOrDefault( TempName, L"" );
if ( wcslen(TempName) > 0 )
{
if ( hNamingAttributes == NULL )
{
status = NwNdsCreateBuffer( NDS_SCHEMA_DEFINE_CLASS,
&hNamingAttributes );
if ( status )
{
printf( "\nError: NwNdsCreateBuffer returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
}
status = NwNdsPutInBuffer( TempName,
0,
NULL,
0,
0,
hNamingAttributes );
if ( status )
{
printf( "\nError: NwNdsPutInBuffer returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
}
} while ( wcslen(TempName) > 0 );
do
{
printf( "\nEnter mandatory attribute name or <Enter> to end : " );
GetStringOrDefault( TempName, L"" );
if ( wcslen(TempName) > 0 )
{
if ( hMandatoryAttributes == NULL )
{
status = NwNdsCreateBuffer( NDS_SCHEMA_DEFINE_CLASS,
&hMandatoryAttributes );
if ( status )
{
printf( "\nError: NwNdsCreateBuffer returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
}
status = NwNdsPutInBuffer( TempName,
0,
NULL,
0,
0,
hMandatoryAttributes );
if ( status )
{
printf( "\nError: NwNdsPutInBuffer returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
}
} while ( wcslen(TempName) > 0 );
do
{
printf( "\nEnter optional attribute name or <Enter> to end : " );
GetStringOrDefault( TempName, L"" );
if ( wcslen(TempName) > 0 )
{
if ( hOptionalAttributes == NULL )
{
status = NwNdsCreateBuffer( NDS_SCHEMA_DEFINE_CLASS,
&hOptionalAttributes );
if ( status )
{
printf( "\nError: NwNdsCreateBuffer returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
}
status = NwNdsPutInBuffer( TempName,
0,
NULL,
0,
0,
hOptionalAttributes );
if ( status )
{
printf( "\nError: NwNdsPutInBuffer returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
}
} while ( wcslen(TempName) > 0 );
printf( "\nEnter a value for the class flags : " );
scanf( "%d", &dwFlags );
status = NwNdsDefineClass( hTree,
ObjectName.Buffer,
dwFlags,
asn1Id,
hSuperClasses,
hContainmentClasses,
hNamingAttributes,
hMandatoryAttributes,
hOptionalAttributes );
if ( status )
{
printf( "\nError: NwNdsDefineAttribute returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
printf( "\n Success!\n" );
return 0;
}
if ( argv[2][1] == 'r' && argv[3][0] == 'C' )
{
printf( "\nGoing to try to remove a class from schema.\n" );
status = NwNdsDeleteClassDef( hTree,
ObjectName.Buffer );
if ( status )
{
printf( "\nError: NwNdsDeleteClassDef returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
printf( "\n Success!\n" );
return 0;
}
if ( argv[2][1] == 'm' && argv[3][0] == 'C' )
{
WCHAR AddAttributeName[256];
printf( "\nGoing to try to add an attribute to a class in the schema.\n" );
printf( "\nEnter an attribute name to add to class %S\n", ObjectName.Buffer );
GetStringOrDefault( AddAttributeName, L"" );
status = NwNdsAddAttributeToClass( hTree,
ObjectName.Buffer,
AddAttributeName );
if ( status )
{
printf( "\nError: NwNdsAddAttributeToClass returned status 0x%.8X\n", status );
printf( "Error: GetLastError returned: 0x%.8X\n\n",
GetLastError() );
return -1;
}
printf( "\n Success!\n" );
return 0;
}
goto Usage;
}