VBScript를 이용하여 Active Directory의 Account Attribute 한꺼번에 수정하기

IT경력 십년만에 처음으로 IAM (Identity Management) 프로젝트를 경험하고 있다. Single Sign On과 뗄레야 뗄 수 없는 IAM. 처음하는 프로젝트니 만큼 "맨땅에 헤딩"하는 건 당연하겠지만 너무도 힘들게 힘들게 일을 하고 있다. IAM프로젝트의 과정과 범위도 정의되지 않은 상태에서 일을하니 얼마나 힘든지 모르겠다.

 

아무도 가르쳐주지 않는 상황에서 너무도 답답하지만 중간에 그만두고 나갈수도 없고 진퇴양난의 상황에서 뭔가 배우는 즐거움하나로 버티고 있다. ㅋㅋ


대만에서 온 엔지니어가 실수로 수백개의 AD 계정을 잘못 업데이트하는 사고를 치고 엔드유저에게 미안해하던 차에 내가 만든 이 스크립트를 이용해서 복구하자고 제안 했다가 "미쳤다"는 소리를 들었다. AD 관리 경력 수년(?)이라는 사람이 AD를 일일히 수작업으로 눈으로 확인해가며 하루종일 그일만 하는 그 꼴을 보며 정말 어이가 없었다. 저렇게 수작업으로 일일히 AD를 관리할 거면 알바쓰는거랑 뭐가 달라..??

나보고 AD를 몰라도 너무 모른다나 뭐라나... 그럼 AD는 다 그렇게 관리하는게 제일 좋은 방법인가 보지.. ㅋㅋ

VBScript를 이용하여 AD 계정의 Attribute를 한꺼번에 수정하는 방법 말고도 커맨드를 이용하여 작업하는 방법도 있지만 너무번거로워서 MSDN 사이트를 뒤져서 방법을 찾아냈다. 애석하게도 네이버 등 검색사이트에서는 아직 만족할만한 방법을 찾을 수 없었다.

Active Directory 에는 사용자 계정의 생성과 수정과 Attribute 를 수정하기 위한 도구로 Active Directory Users and Computer가 제공된다.

 

 

 

이 도구는 다음과 같이 GUI 를 통해 Active Directory 상의 Attribute 를 수정하는 기능을 제공한다 .

 

 

 

하지만 일반적으로 Active Directory 에는 적게는 수십명 , 많게는 수만명의 사용자 계정이 존재한다 . 이렇게 많은 사용자의 Attribute 를 일일이 위의 화면과 같이 GUI 를 통해 수정하는 것은 한마디로 “말도 안되는 미친짓”이라고 표현할 수 있다 .

 

게다가 확장 Active Directory 의 Attribute 를 확장하였을 경우 확장된 Attribute 는 GUI 상에 표현되지도 않는다 . 물론 ADSIEDIT.MSC 라는 Windows 2000/2003 에 기본으로 설치되지는 않지만 별도로 설치하여 확장된 Attribute 까지 수정 가능한 도구가 있기는 하다 . 하지만 이 경우도 GUI 의 한계를 벗어날 수는 없다 .

 

어떻게 하면 일괄적으로 변경할 수 있을까를 고민하다 결국 직접 Visual Basic Script 를 이용하여 수정하는 Script 를 작성하였다 .

 

이 문서에서는 CSVDE.EXE 를 이용하여 현재 Active Directory 의 컴퓨터 및 사용자 정보를 Export 하는 방법에 대해서는 설명하지 않는다 .

 

다음의 스크립트를 사용하여 사용자 계정 (Account) 의 Attribute 를 수정하기 위해서는 다음의 정보를 미리 알고 있어야 한다 .

 

1. 사용자 계정의 DN

2. 사용자 계정에서 수정할 Attribute 의 Name

 

위의 두 정보를 알고 있다면 구분자 (Delimiter) “ ; ” 로 구분된 다음과 같은 ASCII 파일을 준비한다.
csvde.exe와 Excel을 이용하면 쉽게 만들 수 있다. 이것조차 어렵다고 생각된다면 포기해라. 누구처럼 GUI에서 일일히 수정하는것이 최선책이다.

CN=archoi,OU=Sales,OU=Users,OU= TESTAD , DC =FARM;050103-2017345; 1000345

TESTAD , DC =FARM;040913-4345626;1000456

   


위의 파일에서 CN=archoi,OU=Sales,OU=Users,OU=TESTAD,DC=FARM 이 DN 이고 780103-4017345 이 주민번호 ( 물론 가상 ~~ ^^) 그리고 1000345 는 사번이라고 가정한다 .

위의 파일과 동일한 디렉토리에 다음과 같이 VBS 파일을 작성한다 .

Const ForReading = 1

Const ForWriting = 2

Dim FSO, SSOfile, ALINE, CountFile, SSOCount

DIM PERSON, NAME, ADID

Dim userObj

Dim strDN

Set FSO = CreateObject ("Scripting.FileSystemObject")

Set SSOfile = FSO.OpenTextFile("Attribute.csv", ForReading, True)

Set CountFile = FSO.OpenTextFile("Result.txt", ForWriting, True)

SSOCount = 1

Do While Not SSOfile.AtEndOfStream

             ALINE = SSOfile.ReadLine

             'PERSON = split(ALINE, vbTab, -1, 1)

             PERSON = split(ALINE, ";", -1, 1)

             'strDN = "LDAP://CN=jslee1,OU=ITO(IT Operations),OU=Users,OU=ILK,DC=test,DC=farm"

            

             ' Double quotation Remove....first and last

             ' strDN = "LDAP://" & left(right(Person(0), len(Person(0))-1), len(Person(0))-2)

             strDN = "LDAP://" & Person(0)

             On error resume Next

             Set userObj = GetObject(strDN)

             if PERSON(1) <> "" then

                           userObj.put "Korean-Social-ID", PERSON(1)

             end if

             if PERSON(2) <> "" then

                           userObj.put "Sawon-No", PERSON(2)

             end if

             if Err.Number = 0 then

                           userObj.SetInfo      ' setinfo를 if문 앞에서 호출하면 잘못된 데이터가 저장될 수 있는 오류 발견...!!

                           CountFile.WriteLine (SSOCount)

             else

                           CountFile.WriteLine ( “ERROR : “ & strDN & "/" & Err.Description)

                           Err.clear

             end if

             SSOCount = SSOCount + 1

Loop

CountFile.Close

SSOFile.Close

 

이 스크립트는 Attribute.csv 파일을 읽어 DN 으로 지정된 Active Diretory 의 Attribute Value 를 수정하고 그 결과를 Result.txt 파일에 저장한다 . 수정이 성공된 행은 행의 번호가 출력되고 에러가 발생하여 수정하지 못할 경우에는 “ Error ” 와 DN 그리고 에러 사유를 출력한다 .

 

--- Written by unicenter@naver.com---

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">
  1. thumbnail
    sky@maker.so

    노하우를 쿨하게 공개하시는군요. ㅎㅎ

  2. thumbnail
    woo
    2020.09.10 11:58

    댓글 답글이 감동이네요 ㅎㅎ