/*** 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 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 -a|m|r A|C \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 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 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 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 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 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; }