|
Q: How do I programmatically search for specific records by matching attributes via the Open Directory API?A: You'll need to use the Directory Services Framework, more specifically, the Listing 1 below gives an example: Listing 1: Executing a trivial Open Directory Search. // Begin variable declaration. tDirReference dirRef; long status = eDSNoErr; unsigned long numResults = 0; tDataListPtr nodePath = NULL; tDirNodeReference nodeRef; tDataList recordTypesToSearchFor; tDataNodePtr patternToMatch = NULL; tDataNodePtr matchType; tDataListPtr requestedAttributes = NULL; tDataBufferPtr dataBuff = NULL; tContextData context = NULL; // Initiate the Open Directory Service. status = dsOpenDirService(&dirRef); // Allocate a buffer. dataBuff = dsDataBufferAllocate(dirRef, 2*1024); // Find the default search node. status = dsFindDirNodes(dirRef, dataBuff, NULL, eDSSearchNodeName, &numResults, &context); // Acquire a reference to the default search node. status = dsGetDirNodeName(dirRef, dataBuff, 1, &nodePath); // Do some cleaning up. dsDataBufferDeAllocate(dirRef, dataBuff); dataBuff = NULL; dataBuff = dsDataBufferAllocate(dirRef, 2*1024); // Open root level node for search. status = dsOpenDirNode(dirRef, nodePath, &nodeRef); // Build the tDataList containing the record type that you are searching for; // in this case, the record type is "Users". status = dsBuildListFromStringsAlloc (dirRef, &recordTypesToSearchFor, kDSStdRecordTypeUsers, NULL); // Return Records of Users. // tDataNodePtr containing the string value to search for within all records. patternToMatch = dsDataNodeAllocateString(dirRef, "Michael"); // tDataNodePtr containing the constant value that pertains to the scope of the search. matchType = dsDataNodeAllocateString(dirRef, kDSAttributesAll); // Build a list to contain the requested attributes of the records returned from your search. requestedAttributes = dsBuildListFromStrings(dirRef, kDS1AttrDistinguishedName, NULL); // The actual query. status = dsDoAttributeValueSearchWithData(nodeRef, dataBuff, &recordTypesToSearchFor, matchType, eDSContains, patternToMatch, requestedAttributes, FALSE, &numResults, &context); Note: A complete listing of constant values, which can be passed into You will also have to check the return
It would be wise to check that IMPORTANT: When searching a directory, keep in mind that not all nodes support all meta attribute type constants. For example, Meta Attribute Type Constants: Document Revision History
Posted: 2006-09-11 |
|