/*** Copyright (c) 1995 Microsoft Corporation Module Name: Schema.c Abstract: Command line test tool for dumping the NDS schema attribute and class names and/or definitions. Author: Glenn Curtis [glennc] 22-Apr-96 ***/ #include int _cdecl main( int argc, char **argv ) { DWORD status = NO_ERROR; HANDLE hTree = NULL; HANDLE hOperationData = NULL; OEM_STRING OemArg; UNICODE_STRING TreeName; WCHAR szTreeName[256]; WCHAR szTempAttrName[256]; WCHAR szTempClassName[256]; ASN1_ID asn1Id; DWORD dwNumberOfEntries; DWORD dwInfoType; DWORD dwSyntaxID; DWORD iter; TreeName.Length = 0; TreeName.MaximumLength = sizeof( szTreeName ); TreeName.Buffer = szTreeName; // // Check the arguments. // if ( argc < 3 ) { Usage: printf( "\nUsage: ditdump -n|d|x C|A [P] [C]\n" ); printf( "\n where: n = Names only\n" ); printf( " where: d = Names & definitions\n" ); printf( " where: x = Extended names & definitions (Includes inherited properties)\n" ); printf( " where: C = Classes\n" ); printf( " where: A = Attributes\n" ); printf( "\n where: P = Prompts user for list of specific\n" ); printf( " classes, attributes, or syntaxes to read.\n" ); printf( "\n where: C = Prompts user for a specific set of credentials.\n" ); return -1; } OemArg.Length = strlen( argv[1] ); OemArg.MaximumLength = OemArg.Length; OemArg.Buffer = argv[1]; RtlOemStringToUnicodeString( &TreeName, &OemArg, FALSE ); if ( ( argc > 4 && argv[4][0] == 'C' ) || ( argc > 5 && argv[5][0] == 'C' ) ) { WCHAR UserName[256]; WCHAR Password[256]; printf( "\nEnter a user name : " ); GetStringOrDefault( UserName, L"" ); printf( "\nEnter a password : " ); GetStringOrDefault( Password, L"" ); status = NwNdsOpenObject( TreeName.Buffer, UserName, Password, &hTree, NULL, NULL, NULL, NULL, NULL ); } else { 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] == 'n' && argv[3][0] == 'A' ) { LPNDS_NAME_ONLY lpAttrNames = NULL; if ( argc > 4 && argv[4][0] == 'P' ) { status = NwNdsCreateBuffer( NDS_SCHEMA_READ_ATTR_DEF, &hOperationData ); if ( status ) { printf( "\nError: NwNdsCreateBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } do { printf( "\nEnter attribute name or to end : " ); GetStringOrDefault( szTempAttrName, L"" ); if ( wcslen(szTempAttrName) > 0 ) { status = NwNdsPutInBuffer( szTempAttrName, 0, NULL, 0, 0, hOperationData ); if ( status ) { printf( "\nError: NwNdsPutInBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } } } while ( wcslen(szTempAttrName) > 0 ); } printf( "\nGoing to dump the schema attribute names.\n" ); status = NwNdsReadAttrDef( hTree, NDS_INFO_NAMES, &hOperationData ); if ( status ) { printf( "\nError: NwNdsReadAttrDef returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } status = NwNdsGetAttrDefListFromBuffer( hOperationData, &dwNumberOfEntries, &dwInfoType, (LPVOID *) &lpAttrNames ); if ( status ) { printf( "\nError: NwNdsGetAttrDefListFromBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } printf( "\nThe list of attribute definitions in the schema for\n" ); printf( "NDS tree %S is :\n\n", TreeName.Buffer ); for ( iter = 0; iter < dwNumberOfEntries; iter++ ) { (void) NwNdsGetSyntaxID( hTree, lpAttrNames[iter].szName, &dwSyntaxID ); printf( " %S (Syntax ID: %ld)\n", lpAttrNames[iter].szName, dwSyntaxID ); } (void) NwNdsFreeBuffer( hOperationData ); (void) NwNdsCloseObject( hTree ); return 0; } if ( argv[2][1] == 'd' && argv[3][0] == 'A' ) { LPNDS_ATTR_DEF lpAttrDefs = NULL; if ( argc > 4 && argv[4][0] == 'P' ) { status = NwNdsCreateBuffer( NDS_SCHEMA_READ_ATTR_DEF, &hOperationData ); if ( status ) { printf( "\nError: NwNdsCreateBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } do { printf( "\nEnter attribute name or to end : " ); GetStringOrDefault( szTempAttrName, L"" ); if ( wcslen(szTempAttrName) > 0 ) { status = NwNdsPutInBuffer( szTempAttrName, 0, NULL, 0, 0, hOperationData ); if ( status ) { printf( "\nError: NwNdsPutInBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } } } while ( wcslen(szTempAttrName) > 0 ); } printf( "\nGoing to dump the schema attribute names and definitions.\n" ); status = NwNdsReadAttrDef( hTree, NDS_INFO_NAMES_DEFS, &hOperationData ); if ( status ) { printf( "\nError: NwNdsReadAttrDef returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } status = NwNdsGetAttrDefListFromBuffer( hOperationData, &dwNumberOfEntries, &dwInfoType, (LPVOID *) &lpAttrDefs ); if ( status ) { printf( "\nError: NwNdsGetAttrDefListFromBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } printf( "\nThe list of attribute definitions in the schema for\n" ); printf( "NDS tree %S is :\n\n", TreeName.Buffer ); for ( iter = 0; iter < dwNumberOfEntries; iter++ ) { printf( " %S\n", lpAttrDefs[iter].szAttributeName ); printf( " _____________________________________________\n" ); printf( " Flags : 0x%.8X\n", lpAttrDefs[iter].dwFlags ); printf( " Syntax ID : %ld\n", lpAttrDefs[iter].dwSyntaxID ); printf( " Lower Limit : 0x%.8X\n", lpAttrDefs[iter].dwLowerLimit ); printf( " Upper Limit : 0x%.8X\n", lpAttrDefs[iter].dwUpperLimit ); printf( " ASN.1 ID length : %ld\n", lpAttrDefs[iter].asn1ID.length ); printf( " ASN.1 ID Data : %s\n\n", lpAttrDefs[iter].asn1ID.data ); } (void) NwNdsFreeBuffer( hOperationData ); (void) NwNdsCloseObject( hTree ); return 0; } if ( argv[2][1] == 'n' && argv[3][0] == 'C' ) { LPNDS_NAME_ONLY lpClassNames = NULL; if ( argc > 4 && argv[4][0] == 'P' ) { status = NwNdsCreateBuffer( NDS_SCHEMA_READ_CLASS_DEF, &hOperationData ); if ( status ) { printf( "\nError: NwNdsCreateBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } do { printf( "\nEnter class name or to end : " ); GetStringOrDefault( szTempClassName, L"" ); if ( wcslen(szTempClassName) > 0 ) { status = NwNdsPutInBuffer( szTempClassName, 0, NULL, 0, 0, hOperationData ); if ( status ) { printf( "\nError: NwNdsPutInBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } } } while ( wcslen(szTempClassName) > 0 ); } printf( "\nGoing to dump the schema class names.\n" ); status = NwNdsReadClassDef( hTree, NDS_INFO_NAMES, &hOperationData ); if ( status ) { printf( "\nError: NwNdsReadClassDef returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } status = NwNdsGetClassDefListFromBuffer( hOperationData, &dwNumberOfEntries, &dwInfoType, (LPVOID *) &lpClassNames ); if ( status ) { printf( "\nError: NwNdsGetClassDefListFromBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } printf( "\nThe list of class definitions in the schema for\n" ); printf( "NDS tree %S is :\n\n", TreeName.Buffer ); for ( iter = 0; iter < dwNumberOfEntries; iter++ ) { printf( " %S\n", lpClassNames[iter].szName ); } (void) NwNdsFreeBuffer( hOperationData ); (void) NwNdsCloseObject( hTree ); return 0; } if ( argv[2][1] == 'd' && argv[3][0] == 'C' ) { LPNDS_CLASS_DEF lpClassDefs = NULL; if ( argc > 4 && argv[4][0] == 'P' ) { status = NwNdsCreateBuffer( NDS_SCHEMA_READ_CLASS_DEF, &hOperationData ); if ( status ) { printf( "\nError: NwNdsCreateBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } do { printf( "\nEnter class name or to end : " ); GetStringOrDefault( szTempClassName, L"" ); if ( wcslen(szTempClassName) > 0 ) { status = NwNdsPutInBuffer( szTempClassName, 0, NULL, 0, 0, hOperationData ); if ( status ) { printf( "\nError: NwNdsPutInBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } } } while ( wcslen(szTempClassName) > 0 ); } printf( "\nGoing to dump the schema class names and definitions.\n" ); status = NwNdsReadClassDef( hTree, NDS_INFO_NAMES_DEFS, &hOperationData ); if ( status ) { printf( "\nError: NwNdsReadClassDef returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } status = NwNdsGetClassDefListFromBuffer( hOperationData, &dwNumberOfEntries, &dwInfoType, (LPVOID *) &lpClassDefs ); if ( status ) { printf( "\nError: NwNdsGetClassDefListFromBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } printf( "\nThe list of class definitions in the schema for\n" ); printf( "NDS tree %S is :\n\n", TreeName.Buffer ); for ( iter = 0; iter < dwNumberOfEntries; iter++ ) { printf( " %S\n", lpClassDefs[iter].szClassName ); printf( " _____________________________________________\n" ); printf( " Flags : 0x%.8X\n", lpClassDefs[iter].dwFlags ); printf( " ASN.1 ID length : %ld\n", lpClassDefs[iter].asn1ID.length ); printf( " ASN.1 ID Data : %s\n\n", lpClassDefs[iter].asn1ID.data ); printf( " Super Classes (%ld) : \n", lpClassDefs[iter].dwNumberOfSuperClasses ); DumpListOfStrings( lpClassDefs[iter].lpSuperClasses ); printf( " Containment Classes (%ld) : \n", lpClassDefs[iter].dwNumberOfContainmentClasses ); DumpListOfStrings( lpClassDefs[iter].lpContainmentClasses ); printf( " Naming Attributes (%ld) : \n", lpClassDefs[iter].dwNumberOfNamingAttributes ); DumpListOfStrings( lpClassDefs[iter].lpNamingAttributes ); printf( " Mandatory Attributes (%ld) : \n", lpClassDefs[iter].dwNumberOfMandatoryAttributes ); DumpListOfStrings( lpClassDefs[iter].lpMandatoryAttributes ); printf( " Optional Attributes (%ld) : \n", lpClassDefs[iter].dwNumberOfOptionalAttributes ); DumpListOfStrings( lpClassDefs[iter].lpOptionalAttributes ); printf( "\n" ); } (void) NwNdsFreeBuffer( hOperationData ); (void) NwNdsCloseObject( hTree ); return 0; } if ( argv[2][1] == 'x' && argv[3][0] == 'C' ) { LPNDS_CLASS_DEF lpClassDefs = NULL; if ( argc > 4 && argv[4][0] == 'P' ) { status = NwNdsCreateBuffer( NDS_SCHEMA_READ_CLASS_DEF, &hOperationData ); if ( status ) { printf( "\nError: NwNdsCreateBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } do { printf( "\nEnter class name or to end : " ); GetStringOrDefault( szTempClassName, L"" ); if ( wcslen(szTempClassName) > 0 ) { status = NwNdsPutInBuffer( szTempClassName, 0, NULL, 0, 0, hOperationData ); if ( status ) { printf( "\nError: NwNdsPutInBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } } } while ( wcslen(szTempClassName) > 0 ); } printf( "\nGoing to dump the extended schema class names and definitions.\n" ); status = NwNdsReadClassDef( hTree, NDS_CLASS_INFO_EXPANDED_DEFS, &hOperationData ); if ( status ) { printf( "\nError: NwNdsReadClassDef returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } status = NwNdsGetClassDefListFromBuffer( hOperationData, &dwNumberOfEntries, &dwInfoType, (LPVOID *) &lpClassDefs ); if ( status ) { printf( "\nError: NwNdsGetClassDefListFromBuffer returned status 0x%.8X\n", status ); printf( "Error: GetLastError returned: 0x%.8X\n\n", GetLastError() ); return -1; } printf( "\nThe list of class definitions in the schema for\n" ); printf( "NDS tree %S is :\n\n", TreeName.Buffer ); for ( iter = 0; iter < dwNumberOfEntries; iter++ ) { printf( " %S\n", lpClassDefs[iter].szClassName ); printf( " _____________________________________________\n" ); printf( " Flags : 0x%.8X\n", lpClassDefs[iter].dwFlags ); printf( " ASN.1 ID length : %ld\n", lpClassDefs[iter].asn1ID.length ); printf( " ASN.1 ID Data : %s\n\n", lpClassDefs[iter].asn1ID.data ); printf( " Super Classes (%ld) : \n", lpClassDefs[iter].dwNumberOfSuperClasses ); DumpListOfStrings( lpClassDefs[iter].lpSuperClasses ); printf( " Containment Classes (%ld) : \n", lpClassDefs[iter].dwNumberOfContainmentClasses ); DumpListOfStrings( lpClassDefs[iter].lpContainmentClasses ); printf( " Naming Attributes (%ld) : \n", lpClassDefs[iter].dwNumberOfNamingAttributes ); DumpListOfStrings( lpClassDefs[iter].lpNamingAttributes ); printf( " Mandatory Attributes (%ld) : \n", lpClassDefs[iter].dwNumberOfMandatoryAttributes ); DumpListOfStrings( lpClassDefs[iter].lpMandatoryAttributes ); printf( " Optional Attributes (%ld) : \n", lpClassDefs[iter].dwNumberOfOptionalAttributes ); DumpListOfStrings( lpClassDefs[iter].lpOptionalAttributes ); printf( "\n" ); } (void) NwNdsFreeBuffer( hOperationData ); (void) NwNdsCloseObject( hTree ); return 0; } goto Usage; }