필요성
도메인 사용자에 특정 경로 식별자를 저장하기 위한 속성을 추가해야 하는 비즈니스 요구사항이 발생했습니다. 기존에 사용자 정의 속성에 대한 구체적인 정보가 부족하여 공식 문서를 참고하여 진행하게 되었습니다. 본 테스트에서 추가한 속성명은 userPdictionary입니다.
시스템 환경
- Windows Server 2016 Standard
- Active Directory
- DNS
Active Directory 스키마 활성화
먼저 MMC 콘솔에서 Active Directory 스키마를 활성화해야 합니다.
스키마 DLL 등록
명령 프롬프트에서 다음 명령을 실행하여 schmmgmt.dll을 등록합니다:
regsvr32 schmmgmt.dll
MMC에 Active Directory 스키마 추가
- 실행 창에서 "mmc"를 입력하여 콘솔을 시작합니다.
- "파일 - 추가/제어 단원"을 선택합니다.
- "Active Directory 스키마"를 추가하고 확인을 클릭합니다.
- 좌측 패널에 현재 AD의 클래스 및 속성이 표시됩니다.
사용자 정의 속성 추가
- 좌측 속성 목록에서 마우스 오른쪽 버튼을 클릭하고 "새로 만들기 - 속성"을 선택합니다.
- "계속"을 선택하여 새 속성 생성 인터페이스로 진입합니다.
- 주요 매개변수를 설정합니다:
- 공용명
- LDAP 표시명
- 고유한 X500 개체 ID
- 설명
"고유한 X500 개체 ID"는 스키마 확장 시 필수적인 요소입니다.
개체 식별자(OID) 획득
OID는 분산 애플리케이션의 데이터 요소, 구문 및 기타 부분을 고유하게 식별하기 위해 다양한 기관에서 발급하는 고유한 숫자 값입니다. LDAP 프로토콜은 디렉터리 서비스가 OID를 사용하여 객체 클래스, 속성 및 구문을 식별하도록 요구합니다.
OID 생성 스크립트
다음 스크립트를 사용하여 고유한 OID를 생성할 수 있습니다:
' oidgen.vbs
' 고유한 OID를 생성하는 스크립트
Function GenerateOID()
' 변수 초기화
Dim guidString, oidPrefix
Dim guidPart0, guidPart1, guidPart2, guidPart3, guidPart4, guidPart5, guidPart6
Dim oidPart0, oidPart1, oidPart2, oidPart3, oidPart4, oidPart5, oidPart6
' GUID 생성
Set TypeLib = CreateObject("Scriptlet.TypeLib")
guidString = TypeLib.Guid
' 16진수를 10진수로 변환
guidPart0 = Trim(Mid(guidString, 2, 4))
guidPart1 = Trim(Mid(guidString, 6, 4))
guidPart2 = Trim(Mid(guidString, 11, 4))
guidPart3 = Trim(Mid(guidString, 16, 4))
guidPart4 = Trim(Mid(guidString, 21, 4))
guidPart5 = Trim(Mid(guidString, 26, 6))
guidPart6 = Trim(Mid(guidString, 32, 6))
' 16진수를 10진수로 변환
oidPart0 = CLng("&H" & guidPart0)
oidPart1 = CLng("&H" & guidPart1)
oidPart2 = CLng("&H" & guidPart2)
oidPart3 = CLng("&H" & guidPart3)
oidPart4 = CLng("&H" & guidPart4)
oidPart5 = CLng("&H" & guidPart5)
oidPart6 = CLng("&H" & guidPart6)
' OID 조합
GenerateOID = "1.2.840.113556.1.8000.2554." & oidPart0 & "." & oidPart1 & "." & oidPart2 & "." & oidPart3 & "." & oidPart4 & "." & oidPart5 & "." & oidPart6
End Function
' 결과 파일 생성
Set objFSO=CreateObject("Scripting.FileSystemObject")
outFile="C:\Temp\oidInfo.txt"
Set objFile = objFSO.CreateTextFile(outFile,True)
' 생성된 OID 출력
oidText = "귀하의 기본 OID는 다음과 같습니다: " & GenerateOID & vbCrLf & vbCrLf & _
"이 접두사는 스키마 속성 및 클래스를 명명하는 데 사용해야 합니다. 예를 들어, 접두사가 ""MyCompany""인 경우 ""mycompany-Employee-ShoeSize""와 같이 스키마 요소를 명명해야 합니다." & vbCrLf & vbCrLf & _
"새로운 스키마 클래스 및 속성에 대한 후속 OID는 .X를 OID에 추가하여 생성할 수 있으며, 여기서 X는 선택한 임의의 숫자일 수 있습니다. 일반적인 스키마 확장 구조는 다음과 같습니다:" & vbCrLf & _
"할당된 OID가 1.2.840.113556.1.8000.2554.999999인 경우:" & vbCrLf & _
"- 클래스는 1.2.840.113556.1.8000.2554.999999.1 아래에 위치할 수 있습니다" & vbCrLf & _
" 첫 번째 클래스 OID: 1.2.840.113556.1.8000.2554.999999.1.1" & vbCrLf & _
" 두 번째 클래스 OID: 1.2.840.113556.1.8000.2554.999999.1.2 등..." & vbCrLf & _
"- 속성은 1.2.840.113556.1.8000.2554.999999.2 아래에 위치할 수 있습니다" & vbCrLf & _
" 첫 번째 속성 OID: 1.2.840.113556.1.8000.2554.999999.2.1" & vbCrLf & _
" 두 번째 속성 OID: 1.2.840.113556.1.8000.2554.999999.2.2 등..." & vbCrLf & vbCrLf
objFile.Write oidText
objFile.Close
명령 프롬프트에서 이 스크립트를 실행하면 현재 AD의 OID가 생성됩니다. 예를 들어, 다음과 같은 OID가 생성될 수 있습니다:
1.2.840.113556.1.8000.2554.55786.31829.55335.19299.48276.12206014.6177421.2.1
OID를 속성에 적용
생성된 OID를 사용하여 새 속성을 정의합니다. 테스트 환경에서는 다음과 같이 설정했습니다:
- 공용명: userPdictionary
- LDAP 표시명: userPdictionary
- 고유한 X500 개체 ID: 1.2.840.113556.1.8000.2554.55786.31829.55335.19299.48276.12206014.6177421.2.1
- 설명: 사용자 경로 식별자 저장용 속성
속성을 클래스와 연결
- MMC 콘솔에서 "user" 클래스를 선택하고 마우스 오른쪽 버튼을 클릭합니다.
- "속성"을 선택합니다.
- "속성" 탭에서 선택 가능한 프로젝트 목록에서 새로 생성한 사용자 정의 속성을 추가합니다.
- "확인"을 클릭하여 변경 사항을 저장합니다.
스키마 확장 적용
스키마를 확장하는 애플리케이션은 다음 절차에 따라 업데이트를 적용해야 합니다:
- 새 속성 추가
- 새 클래스 추가
- 새 속성을 클래스에 추가
- 캐시 새로고침 트리거
스키마 캐시에 새 속성 이름이 즉시 존재하지 않으므로, 3단계에서 참조되는 새 속성은 OID로 참조해야 합니다. 즉시 확장을 사용하지 않는 경우 4단계는 필요하지 않습니다. 확장은 시스템 부하에 따라 약 5분 내에 스키마 캐시에 나타납니다.
사용자 속성 편집
Active Directory 사용자 및 컴퓨터 스냅인에서 사용자 개체를 열고 새로 추가한 속성에 값을 설정할 수 있습니다.