Directory Services |
The LDAP Data Interchange Format (LDIF) is an Internet Engineering Task Force (IETF) standard that defines how to import and export directory data between directory servers that use LDAP service providers. Windows 2000 and Windows Server 2003 include a command-line utility, LDIFDE, which can be used to import directory objects into Active Directory using LDIF files. LDIFDE enables you to set a filter to a specific string in order to search for and list directory objects in Active Directory as LDIF files which can be easily read by schema administrators.
When importing a Unicode file, LDIFDE imports the file as Unicode if it contains the Unicode identifier at the beginning of the file. If you wish to import a file as Unicode when it does not contain the Unicode identifier at the beginning of the file, you can use the -u switch in order to force it to be imported as Unicode.
The default mode for exporting files is ANSI. If there are Unicode entries, they will be converted into base 64 format. To export a file into Unicode format, use the -u switch.
An LDIF file must apply schema changes when there are dependencies between the attributes that are added. For example, forward link attributes should be added before the corresponding back link attribute. You must also update the schema cache before adding classes that depend on attributes or classes added earlier in the LDIF script. For more information, see the following code example.
Be aware that for binary values, you must encode the values as base64. Base64 encoding is defined in IETF RFC 2045, Section 6.8.
The following code example consists of:
dn: CN=My-Test-Attribute-CaseExactString,CN=Schema,CN=Configuration,DC=myorg,DC=com changetype: add adminDisplayName: My-Test-Attribute-CaseExactString attributeID: 1.2.840.113556.1.4.7000.159.24.10.65 attributeSyntax: 2.5.5.3 cn: My-Test-Attribute-CaseExactString description: Test attribute of syntax CaseExactString used to show how to add a CaseExactString attribute. isMemberOfPartialAttributeSet: FALSE isSingleValued: TRUE lDAPDisplayName: myTestAttributeCaseExactString distinguishedName: CN=My-Test-Attribute-CaseExactString,CN=Schema,CN=Configuration,DC=myorg,DC=com objectCategory: CN=Attribute-Schema,CN=Schema,CN=Configuration,DC=myorg,DC=com objectClass: attributeSchema oMSyntax: 27 name: My-Test-Attribute-CaseExactString schemaIDGUID:: 6ASznA3W0hGBpwDAT7mMGg== searchFlags: 0 dn: CN=My-Test-Attribute-DN-FL,CN=Schema,CN=Configuration,DC=myorg,DC=com changetype: add adminDisplayName: My-Test-Attribute-DN-FL attributeID: 1.2.840.113556.1.4.7000.159.24.10.614 attributeSyntax: 2.5.5.1 cn: My-Test-Attribute-DN-FL description: Test forward link attribute of syntax DN used to show how to add a forward link attribute. Back link is My-Test-Attribute-DN-BL. isMemberOfPartialAttributeSet: FALSE isSingleValued: TRUE lDAPDisplayName: myTestAttributeDNFL linkID: 146 distinguishedName: CN=My-Test-Attribute-DN-FL,CN=Schema,CN=Configuration,DC=myorg,DC=com objectCategory: CN=Attribute-Schema,CN=Schema,CN=Configuration,DC=myorg,DC=com objectClass: attributeSchema oMObjectClass:: KwwCh3McAIVK oMSyntax: 127 rangeLower: 0 rangeUpper: 257 name: My-Test-Attribute-DN-FL schemaIDGUID:: YGLudffa0hGLEwDAT7mMGg== searchFlags: 0 dn: CN=My-Test-Attribute-DN-BL,CN=Schema,CN=Configuration,DC=myorg,DC=com changetype: add adminDisplayName: My-Test-Attribute-DN-BL attributeID: 1.2.840.113556.1.4.7000.159.24.10.615 attributeSyntax: 2.5.5.1 cn: My-Test-Attribute-DN-BL description: Test back link attribute of syntax DN used to show how to add a back link attribute. Forward link is My-Test-Attribute-DN-FL. isMemberOfPartialAttributeSet: FALSE isSingleValued: TRUE lDAPDisplayName: myTestAttributeDNBL linkID: 147 distinguishedName: CN=My-Test-Attribute-DN-BL,CN=Schema,CN=Configuration,DC=myorg,DC=com objectCategory: CN=Attribute-Schema,CN=Schema,CN=Configuration,DC=myorg,DC=com objectClass: attributeSchema oMObjectClass:: KwwCh3McAIVK oMSyntax: 127 rangeLower: 0 rangeUpper: 257 name: My-Test-Attribute-DN-BL schemaIDGUID:: jFfbhffa0hGLEwDAT7mMGg== searchFlags: 0 dn: CN=My-Test-Attribute-DN-Regular,CN=Schema,CN=Configuration,DC=myorg,DC=com changetype: add adminDisplayName: My-Test-Attribute-DN-Regular attributeID: 1.2.840.113556.1.4.7000.159.24.10.613 attributeSyntax: 2.5.5.12 cn: My-Test-Attribute-DN-Regular description: Test attribute of syntax DN used to show how to add a DN attribute. isMemberOfPartialAttributeSet: FALSE isSingleValued: TRUE lDAPDisplayName: myTestAttributeDNRegular distinguishedName: CN=My-Test-Attribute-DN-Regular,CN=Schema,CN=Configuration,DC=myorg,DC=com objectCategory: CN=Attribute-Schema,CN=Schema,CN=Configuration,DC=myorg,DC=com objectClass: attributeSchema oMObjectClass:: KwwCh3McAIVK oMSyntax: 64 rangeLower: 0 rangeUpper: 257 name: My-Test-Attribute-DN-Regular schemaIDGUID:: 5QSznA3W0hGBpwDAT7mMGg== searchFlags: 0 dn: CN=My-Test-Attribute-DNString,CN=Schema,CN=Configuration,DC=myorg,DC=com changetype: add adminDisplayName: My-Test-Attribute-DNString attributeID: 1.2.840.113556.1.4.7000.159.24.10.611 attributeSyntax: 2.5.5.14 cn: My-Test-Attribute-DNString description: Test attribute of syntax DNString used to show how to add a DNString attribute. isMemberOfPartialAttributeSet: FALSE isSingleValued: TRUE lDAPDisplayName: myTestAttributeDNString distinguishedName: CN=My-Test-Attribute-DNString,CN=Schema,CN=Configuration,DC=myorg,DC=com objectCategory: CN=Attribute-Schema,CN=Schema,CN=Configuration,DC=myorg,DC=com objectClass: attributeSchema oMObjectClass:: KoZIhvcUAQEBDA== oMSyntax: 127 rangeLower: 1 rangeUpper: 64 name: My-Test-Attribute-DNString schemaIDGUID:: 5ASznA3W0hGBpwDAT7mMGg== searchFlags: 0 DN: changetype: modify add: schemaUpdateNow schemaUpdateNow: 1 - dn: CN=My-Test-Auxiliary-Class1,CN=Schema,CN=Configuration,DC=Fabrikam,DC=com changetype: add adminDisplayName: My-Test-Auxiliary-Class1 description: Test class used to show how to add an auxiliary class. objectCategory: CN=Class-Schema,CN=Schema,CN=Configuration,DC=Fabrikam,DC=com objectClass: classSchema lDAPDisplayName: myTestAuxiliaryClass1 governsID: 1.2.840.113556.1.4.7000.159.24.10.611.11 instanceType: 4 objectClassCategory: 3 schemaIDGUID:: mmsxdsXb0hGL0AAA+HW2YA== subClassOf: Top mayContain: my-Test-Attribute-DNString mustContain: description DN: changetype: modify add: schemaUpdateNow schemaUpdateNow: 1 - dn: CN=My-Test-Structural-Class1,CN=Schema,CN=Configuration,DC=Fabrikam,DC=com changetype: add adminDisplayName: My-Test-Structural-Class1 auxiliaryClass: myTestAuxiliaryClass1 defaultHidingValue: FALSE defaultObjectCategory: CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=Fabrikam,DC=com defaultSecurityDescriptor: D:(A;;RPWPCRCCDCLCLOLORCWOWDSDDTDTSW;;;DA)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)(A;;RPLCLORC;;;AU) admindescription: Test class used to show how to add a structure class. objectCategory: CN=Class-Schema,CN=Schema,CN=Configuration,DC=Fabrikam,DC=com objectClass: classSchema lDAPDisplayName: myTestStructuralClass1 governsID: 1.2.840.113556.1.4.7000.159.24.10.611.12 mayContain: myTestAttributeDNFL mayContain: wWWHomePage mustContain: url instanceType: 4 objectClassCategory: 1 possSuperiors: organizationalUnit rDNAttID: ou schemaIDGUID:: 1HsnsL7b0hGL0AAA+HW2YA== subClassOf: organizationalUnit DN: changetype: modify add: schemaUpdateNow schemaUpdateNow: 1 -
On Error Resume Next '''''''''''''''''''''''''''''''''''''' ' Bind to the rootDSE '''''''''''''''''''''''''''''''''''''' sPrefix = "LDAP://" Set root= GetObject(sPrefix & "rootDSE") If (Err.Number <> 0) Then BailOnFailure Err.Number, "on GetObject method" End If '''''''''''''''''''''''''''''''''''''' ' Get the DN for the Schema '''''''''''''''''''''''''''''''''''''' sSchema = root.Get("schemaNamingContext") If (Err.Number <> 0) Then BailOnFailure Err.Number, "on Get method" End If '''''''''''''''''''''''''''''''''''''' ' Bind to the Schema container '''''''''''''''''''''''''''''''''''''' Set Schema= GetObject(sPrefix & sSchema ) If (Err.Number <> 0) Then BailOnFailure Err.Number, "on GetObject method to bind to Schema" End If ''''''''''''''''''''''''''''''''''''''' ' Read the fsmoRoleOwner attribute to see which server is the schema master. ''''''''''''''''''''''''''''''''''''''' sMaster = Schema.Get("fsmoRoleOwner") If (Err.Number <> 0) Then BailOnFailure Err.Number, "on IADs::Get method for fsmoRoleOwner" End If ''''''''''''''''''''''''''''''''''''''' ' fsmoRoleOwner attribute returns the nTDSDSA object. ' The parent is the server object. ' Bind to NTDSDSA object and get parent ''''''''''''''''''''''''''''''''''''''' Set NTDS = GetObject(sPrefix & sMaster) If (Err.Number <> 0) Then BailOnFailure Err.Number, "on GetObject method for NTDS" End If sServer = NTDS.Parent If (Err.Number <> 0) Then BailOnFailure Err.Number, "on IADs::get_Parent method" End If ''''''''''''''''''''''''''''''''''''''' ' Bind to server object and get the ' reference to the computer object. ''''''''''''''''''''''''''''''''''''''' Set Server = GetObject(sServer) If (Err.Number <> 0) Then BailOnFailure Err.Number, "on GetObject method for " & sServer End If '''''''''''''''''''''''''''''''''''''''''' ' Display the DN for the computer object. '''''''''''''''''''''''''''''''''''''''''' sComputerDNSName = Server.Get("DNSHostName") strText = "Schema Master has the following DNS Name: "& sComputerDNSName WScript.echo strText sFile = "myschemaext1.ldf" sFromDN = sSchema sToDN = "CN=Schema,CN=Configuration,DC=myorg,DC=com" sAttrPrefix = "My-Test" sFilter = "(&((cn=" & sAttrPrefix & "*)(|(objectCategory=classSchema)_ (objectCategory=attributeSchema))))" sRetAttr = "dn,adminDescription,adminDisplayName,governsID,cn,mayContain,_ mustContain,systemMayContain,systemMustContain,lDAPDisplayName,_ objectClassCategory,distinguishedName,objectCategory,objectClass,_ possSuperiors,systemPossSuperiors,subClassOf,defaultObjectCategory,_ name,schemaIDGUID,auxiliaryClass,auxiliaryClass,systemAuxiliaryClass,_ description,defaultHidingValue,rDNAttId,defaultSecurityDescriptor,_ attributeID,attributeSecurityGUID,attributeSyntax,_ isMemberOfPartialAttributeSet,isSingleValued,mAPIID,oMSyntax,rangeLower,_ rangeUpper,searchFlags,oMObjectClass,linkID" ' Add flag rootDN. sCommand = "ldifde -d " & sSchema sCommand = sCommand & " -c " & sFromDN & " " & sToDN ' Add flag schema master. sCommand = sCommand & " -s " & sComputerDNSName ' Add flag filename. sCommand = sCommand & " -f " & sFile ' Add flag filter to search for attributes. sCommand = sCommand & " -r " & sFilter ' Add flag for attributes to return. sCommand = sCommand & " -l " & sRetAttr WScript.echo sCommand Set WshShell = Wscript.CreateObject("Wscript.Shell") WshShell.Run (sCommand) ''''''''''''''''''''''''''''''''''''''' ' Display subroutines ''''''''''''''''''''''''''''''''''''''' Sub BailOnFailure(ErrNum, ErrText) strText = "Error 0x"_ & Hex(ErrNum) & " " & ErrText MsgBox strText, vbInformation, "ADSI Error" WScript.Quit End Sub
On Error Resume Next '''''''''''''''''''''''''''''''''''''' ' Bind to the rootDSE '''''''''''''''''''''''''''''''''''''' sPrefix = "LDAP://" Set root= GetObject(sPrefix & "rootDSE") If (Err.Number <> 0) Then BailOnFailure Err.Number, "on GetObject method" End If '''''''''''''''''''''''''''''''''''''' ' Get the DN for the Schema '''''''''''''''''''''''''''''''''''''' sSchema = root.Get("schemaNamingContext") If (Err.Number <> 0) Then BailOnFailure Err.Number, "on Get method" End If '''''''''''''''''''''''''''''''''''''' ' Bind to the Schema container '''''''''''''''''''''''''''''''''''''' Set Schema= GetObject(sPrefix & sSchema ) If (Err.Number <> 0) Then BailOnFailure Err.Number, "on GetObject method to bind to Schema" End If '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Read the fsmoRoleOwner attribute to see which server is the schema master. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' sMaster = Schema.Get("fsmoRoleOwner") If (Err.Number <> 0) Then BailOnFailure Err.Number, "on IADs::Get method for fsmoRoleOwner" End If ''''''''''''''''''''''''''''''''''''''''''''''''''''' ' fsmoRoleOwner attribute returns the nTDSDSA object. ' The parent is the server object. ' Bind to NTDSDSA object and get parent ''''''''''''''''''''''''''''''''''''''''''''''''''''' Set NTDS = GetObject(sPrefix & sMaster) If (Err.Number <> 0) Then BailOnFailure Err.Number, "on GetObject method for NTDS" End If sServer = NTDS.Parent If (Err.Number <> 0) Then BailOnFailure Err.Number, "on IADs::get_Parent method" End If ''''''''''''''''''''''''''''''''''''''''''''''' ' Bind to server object ' and get the reference to the computer object. ''''''''''''''''''''''''''''''''''''''''''''''' Set Server = GetObject(sServer) If (Err.Number <> 0) Then BailOnFailure Err.Number, "on GetObject method for " & sServer End If sComputer = Server.Get("serverReference") ''''''''''''''''''''''''''''''''''''''''' ' Display the DN for the computer object. ''''''''''''''''''''''''''''''''''''''''' sComputerDNSName = Server.Get("DNSHostName") ' strText = "Schema Master has the following DN: "& sComputer strText = "Schema Master has the following DNS Name: "& sComputerDNSName WScript.echo strText sFile = "myschemaext.ldf" sFromDN = "CN=Schema,CN=Configuration,DC=myorg,DC=com" sToDN = sSchema ' Add flag replace fromDN with ToDN. sCommand = "ldifde -i -k -c " & sFromDN & " " & sToDN ' Add flag schema master. sCommand = sCommand & " -s " & sComputerDNSName 'Add flag filename. sCommand = sCommand & " -f " & sFile ' Add flag filter to search for my attributes. WScript.echo sCommand Set WshShell = Wscript.CreateObject("Wscript.Shell") WshShell.Run (sCommand) ''''''''''''''''''''''''''''''''''''''' ' Display subroutines ''''''''''''''''''''''''''''''''''''''' Sub BailOnFailure(ErrNum, ErrText) strText = "Error 0x" & Hex(ErrNum) & " " & ErrText MsgBox strText, vbInformation, "ADSI Error" WScript.Quit End Sub