LDIF 스크립트
LDIF(LDAP 데이터 교환 형식)는 LDAP 서비스 공급자를 사용하는 디렉터리 서버 간에 디렉터리 데이터를 가져오고 내보내는 방법을 정의하는 IETF(인터넷 엔지니어링 태스크 포스) 표준입니다. Windows 2000 및 Windows Server 2003에는 LDIF 파일을 사용하여 디렉터리 개체를 Active Directory Domain Services 가져오는 데 사용할 수 있는 명령줄 유틸리티 LDIFDE가 포함되어 있습니다. LDIFDE를 사용하면 스키마 관리자가 쉽게 읽을 수 있는 LDIF 파일로 Active Directory Domain Services 디렉터리 개체를 검색하고 나열하기 위해 필터를 특정 문자열로 설정할 수 있습니다.
유니코드 파일을 가져올 때 LDIFDE는 파일의 시작 부분에 유니코드 식별자가 포함된 경우 파일을 유니코드로 가져옵니다. 파일의 시작 부분에 유니코드 식별자가 포함되지 않은 경우 유니코드로 파일을 가져오려면 -u 스위치를 사용하여 강제로 유니코드로 가져올 수 있습니다.
파일을 내보내는 기본 모드는 ANSI입니다. 유니코드 항목이 있는 경우 기본 64 형식으로 변환됩니다. 파일을 유니코드 형식으로 내보내려면 -u 스위치를 사용합니다.
추가된 특성 간에 종속성이 있는 경우 LDIF 파일은 스키마 변경 내용을 적용해야 합니다. 예를 들어 전달 링크 특성을 해당 백 링크 특성 앞에 추가해야 합니다. 또한 LDIF 스크립트의 앞부분에서 추가된 특성 또는 클래스에 의존하는 클래스를 추가하기 전에 스키마 캐시를 업데이트해야 합니다. 자세한 내용은 다음 코드 예제를 참조하세요.
이진 값의 경우 값을 base64로 인코딩해야 합니다. Base64 인코딩은 IETF RFC 2045, 섹션 6.8에 정의되어 있습니다.
LDIF 파일 형식에 대한 자세한 내용은 인터넷 엔지니어링 태스크 포스 웹 사이트의 LDIF(LDAP 데이터 교환 형식) - 기술 사양 (RFC 2849)을 참조하세요.
ldifde -k를 호출하는 대신 ntdsSchema* 변경 형식을 사용하는 것이 좋습니다. ldifde의 -k 옵션은 더 큰 LDAP 오류 집합을 무시합니다. 무시된 오류의 전체 목록은 다음과 같습니다.
- 개체가 이미 그룹의 구성원입니다.
- 가져오는 개체에 다른 특성이 없는 경우 개체 클래스 위반(지정된 개체 클래스가 없음을 의미)입니다.
- 개체가 이미 있음(LDAP_ALREADY_EXISTS)
- 제약 조건 위반(LDAP_CONSTRAINT_VIOLATION)
- 특성 또는 값이 이미 있음(LDAP_ATTRIBUTE_OR_VALUE_EXISTS)
- 이러한 개체 없음(LDAP_NO_SUCH_OBJECT)
다음 변경 유형은 스키마 업그레이드 작업을 위해 특별히 설계되었습니다.
Changetype | 설명 |
---|---|
ntdsSchemaAdd |
ntdsSchemaAdd 는 LDIF 파일에 를 추가하는 데 해당합니다. 유일한 차이점은 개체가 스키마에 이미 있는 경우 ntdsSchemaAdd 로 인해 ldifde가 추가 작업을 건너뛰게 된다는 것입니다. (LDAP_ALREADY_EXISTS 무시됩니다.) |
ntdsSchemaModify |
ntdsSchemaModify 는 LDIF 파일에서 수정 에 해당합니다. 유일한 차이점은 개체가 스키마에 없는 경우 ntdsSchemaModify 로 인해 ldifde가 수정 작업을 건너뛰게 된다는 것입니다. (LDAP_NO_SUCH_OBJECT 무시됩니다.) |
ntdsSchemaDelete |
ntdsSchemaDelete 는 LDIF 파일에서 삭제 에 해당합니다. 유일한 차이점은 ntdsSchemaDelete 로 인해 스키마에서 개체를 찾을 수 없는 경우 ldifde가 삭제 작업을 건너뛰게 됩니다. (LDAP_NO_SUCH_OBJECT 무시됩니다.) |
ntdsSchemaModRdn |
ntdsSchemaModRdn 은 LDIF 파일의 modrdn 에 해당합니다. 유일한 차이점은 개체가 스키마에 없는 경우 ntdsSchemaModRdn 으로 인해 ldifde가 수정 상대 고유 이름 작업을 건너뛰게 된다는 것입니다. (LDAP_NO_SUCH_OBJECT 무시됩니다.) |
다음 코드 예제에는 다음이 포함됩니다.
Myschemaext.ldf는 새 특성 및 클래스를 포함하는 LDIF 스크립트입니다. 이 파일은 Lgetattcls.vbs 생성된 파일의 수정된 버전입니다. 또한 My-Test-Attribute-DN-FL 특성은 뒤로 링크(My-Test-Attribute-DN-BL)가 정방향 링크(My-Test-Attribute-DN-FL)에 종속되어 있기 때문에 My-Test-Attribute-DN-BL보다 앞서 이동되었습니다. 또한 schemaUpdateNow 운영 특성은 두 위치에서 스키마 캐시 업데이트를 트리거하도록 설정되므로 종속 특성 및 클래스를 스크립트에서 두 클래스를 추가하는 데 사용할 수 있습니다.
참고
linkID: 문의 ID 원본에 대한 자세한 내용은 링크 ID 가져오기 항목을 참조하세요.
Lgetattcls.vbs Myschemaext.ldf의 시작점으로 사용되는 LDIF 스크립트를 생성하는 VBScript 파일입니다. 현재 스키마 경로는 CN=Schema,CN=Configuration,DC=myorg,DC=com으로 대체됩니다. LDIF 스크립트에 게시할 DN(고유 이름)을 반영하도록 DC=myorg,DC=com을 바꿔서 LSETATTCLS.VBS sFromDN의 변경 내용을 반영하여 LDIF 스크립트가 적용될 때 올바른 DN이 대체되도록 할 수 있습니다. 또한 스크립트는 접두사를 사용하여 모든 클래스 및 특성에 대한 접두사를 정의하고 사용해야 하는 클래스와 특성을 찾습니다. 자세한 내용은 특성 및 클래스 명명을 참조하세요. 또한 스크립트는 attributeSchema 및 classSchema 개체에 필요한 특성만 LDIF 파일에 출력합니다.
Lsetattcls.vbs Myschemaext.ldf 스크립트를 사용하여 스크립트에 새 특성 및 클래스를 추가하는 VBScript 파일입니다. 스크립트를 실행하기 전에 스키마 master 쓸 수 있는지 확인합니다.
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
-
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