Skrip LDIF

LDAP Data Interchange Format (LDIF) adalah standar Internet Engineering Task Force (IETF) yang menentukan cara mengimpor dan mengekspor data direktori antara server direktori yang menggunakan penyedia layanan LDAP. Windows 2000 dan Windows Server 2003 mencakup utilitas baris perintah, LDIFDE, yang dapat digunakan untuk mengimpor objek direktori ke Active Directory Domain Services menggunakan file LDIF. LDIFDE memungkinkan Anda mengatur filter ke string tertentu untuk mencari dan mencantumkan objek direktori di Active Directory Domain Services sebagai file LDIF yang dapat dengan mudah dibaca oleh administrator skema.

Saat mengimpor file Unicode, LDIFDE mengimpor file sebagai Unicode jika berisi pengidentifikasi Unicode di awal file. Jika Anda ingin mengimpor file sebagai Unicode ketika tidak berisi pengidentifikasi Unicode di awal file, Anda dapat menggunakan tombol -u untuk memaksanya diimpor sebagai Unicode.

Mode default untuk mengekspor file adalah ANSI. Jika ada entri Unicode, entri tersebut akan dikonversi menjadi format base 64. Untuk mengekspor file ke dalam format Unicode, gunakan tombol -u.

File LDIF harus menerapkan perubahan skema ketika ada dependensi antara atribut yang ditambahkan. Misalnya, atribut tautan penerusan harus ditambahkan sebelum atribut tautan kembali yang sesuai. Anda juga harus memperbarui cache skema sebelum menambahkan kelas yang bergantung pada atribut atau kelas yang ditambahkan sebelumnya dalam skrip LDIF. Untuk informasi selengkapnya, lihat contoh kode berikut.

Ketahuilah bahwa untuk nilai biner, Anda harus mengodekan nilai sebagai base64. Pengodean Base64 didefinisikan dalam IETF RFC 2045, Bagian 6.8.

Untuk informasi selengkapnya tentang format file LDIF, lihat Format Pertukaran Data LDAP (LDIF) - Spesifikasi Teknis (RFC 2849) di situs web Internet Engineering Task Force.

Jenis perubahan LDIF khusus NTDS

Lebih baik menggunakan changetypes ntdsSchema* daripada memanggil ldifde -k. Opsi -k dari ldifde mengabaikan serangkaian kesalahan LDAP yang lebih besar. Daftar lengkap kesalahan yang diabaikan adalah sebagai berikut:

  • Objek sudah menjadi anggota grup.
  • Pelanggaran kelas objek (artinya kelas objek yang ditentukan tidak ada), jika objek yang diimpor tidak memiliki atribut lain.
  • objek sudah ada (LDAP_ALREADY_EXISTS)
  • pelanggaran batasan (LDAP_CONSTRAINT_VIOLATION)
  • atribut atau nilai sudah ada (LDAP_ATTRIBUTE_OR_VALUE_EXISTS)
  • tidak ada objek tersebut (LDAP_NO_SUCH_OBJECT)

Changetype berikut dirancang khusus untuk operasi peningkatan skema.

Ubah jenis Deskripsi
ntdsSchemaAdd
ntdsSchemaAdd sesuai untuk ditambahkan dalam file LDIF. Satu-satunya perbedaan adalah bahwa ntdsSchemaAdd akan menyebabkan ldifde melewati operasi penambahan jika objek sudah ada dalam skema. (LDAP_ALREADY_EXISTS diabaikan.)
ntdsSchemaModify
ntdsSchemaModify sesuai dengan modifikasi dalam file LDIF. Satu-satunya perbedaan adalah bahwa ntdsSchemaModify akan menyebabkan ldifde melewati operasi modifikasi jika objek tidak ditemukan dalam skema. (LDAP_NO_SUCH_OBJECT diabaikan.)
ntdsSchemaDelete
ntdsSchemaDelete sesuai dengan penghapusan dalam file LDIF. Satu-satunya perbedaan adalah bahwa ntdsSchemaDelete akan menyebabkan ldifde melewati operasi penghapusan jika objek tidak ditemukan dalam skema. (LDAP_NO_SUCH_OBJECT diabaikan.)
ntdsSchemaModRdn
ntdsSchemaModRdn sesuai dengan modrdn dalam file LDIF. Satu-satunya perbedaan adalah bahwa ntdsSchemaModRdn akan menyebabkan ldifde melewati operasi modifikasi-relative-distinguished-name jika objek tidak ditemukan dalam skema. (LDAP_NO_SUCH_OBJECT diabaikan.)

Contoh

Contoh kode berikut mencakup:

  • Myschemaext.ldf adalah skrip LDIF yang berisi atribut dan kelas baru. Ketahuilah bahwa file ini adalah versi file yang dimodifikasi yang dihasilkan dari Lgetattcls.vbs. Perlu diketahui juga bahwa atribut My-Test-Attribute-DN-FL dipindahkan ke depan My-Test-Attribute-DN-BL karena tautan belakang (My-Test-Attribute-DN-BL) bergantung pada tautan penerusan (My-Test-Attribute-DN-FL). Selain itu, atribut operasional schemaUpdateNow diatur di dua tempat untuk memicu pembaruan cache skema sehingga atribut dan kelas dependen akan tersedia untuk menambahkan dua kelas dalam skrip.

    Catatan

    Lihat topik Mendapatkan ID Tautan untuk informasi tentang sumber ID di linkID: pernyataan.

  • Lgetattcls.vbs adalah file VBScript yang menghasilkan skrip LDIF yang digunakan sebagai titik awal untuk Myschemaext.ldf. Ketahuilah bahwa jalur skema saat ini digantikan oleh CN=Schema,CN=Configuration,DC=myorg,DC=com. Anda dapat mengganti DC=myorg,DC=com untuk mencerminkan nama khusus (DN) untuk diterbitkan dalam skrip LDIF memastikan bahwa LSETATTCLS. VBS mencerminkan perubahan dalam sFromDN-nya sehingga DN yang benar diganti ketika skrip LDIF diterapkan. Ketahui juga bahwa skrip menggunakan awalan untuk menemukan kelas dan atribut yang juga harus Anda tentukan dan gunakan awalan untuk semua kelas dan atribut Anda. Untuk informasi selengkapnya, lihat Penamaan Atribut dan Kelas. Selain itu, skrip hanya menghasilkan atribut yang diperlukan untuk atribut Objek Skema dan classSchema ke file LDIF.

  • Lsetattcls.vbs adalah file VBScript yang menggunakan skrip Myschemaext.ldf untuk menambahkan atribut dan kelas baru dalam skrip. Pastikan bahwa master skema dapat ditulis sebelum menjalankan skrip.

MYSCHEMAEXT. LDF

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: 1.2.840.113556.1.2.50
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: 1.2.840.113556.6.1234
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
-

LGETATTCLS. VBS

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

LSETATTCLS. VBS

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