450 lines
14 KiB
C
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;
|
||
|
}
|
||
|
|
||
|
|