Microsoft의 ADSI(Active Directory Service Interface)를 사용하여 Delphi에서 Windows 사용자 계정을 생성할 수 있습니다. 아마도 ADSI라는 이름 때문에 많은 사람들은 ADSI가 Windows 2000에서만 사용될 수 있다고 생각합니다. 실제로 모든 Win32 플랫폼은 ADSI를 지원합니다. 다른 Windows 버전에 대한 ADSI를 다운로드해야 할 수도 있습니다. (자세한 내용은 http://www.microsoft.com/china/windows2000/library/howitworks/activedirectory/adsilinks.htm). Windows 2000에는 ADSI가 포함되어 있습니다.
ADSI는 큰 주제입니다. 이번 글에서는 간략하게만 소개하겠습니다. ADSI는 다양한 컴퓨터 서비스(주로 디렉터리 기반)에 대한 공통 인터페이스입니다. 일부 표준 ADSI 공급자(PROvider는 프로그램에서 사용할 수 있는 COM 인터페이스와 유사)는 WinNT, IIS, LDAP 및 NDS입니다. WinNT 공급자를 사용하여 사용자 계정을 생성 및 수정하고 그룹을 설정 또는 수정합니다.
다음 작은 프로그램은 NT/2000에서 ADSI를 사용하여 사용자 계정을 만드는 데 필요한 단계를 보여줍니다.
먼저 ADSI 클래스 라이브러리(프로젝트/유형 라이브러리 가져오기 메뉴)를 가져와야 합니다. 이 클래스 라이브러리는 system32 하위 디렉터리(예: C:/WINNT/system32/activeds.tlb)에서 찾을 수 있습니다. 파일 이름은 "activeds.tlb"여야 합니다. 파일을 찾을 수 없으면 ADSI를 올바르게 설치해야 합니다. 클래스 라이브러리를 성공적으로 가져온 후 Delphi의 Imports 디렉터리(예: ../Delphi6/Imports/activeds_tlb.pas)에서 activeds_tlb.pas와 같은 파일을 찾을 수 있습니다. 이 파일은 또한 ADSI가 Delphi 프로그램에서 사용될 수 있도록 Uses 문에 포함되어야 합니다.
다음은 사용자를 생성하는 ADSI의 예입니다. [컴퓨터 이름]을 사용자를 생성하려는 실제 컴퓨터 이름으로 바꿔야 합니다. 마찬가지로 [accountname]은 생성할 사용자 계정입니다. WindowNT 4.0 및 Windows 2000에서 테스트되었습니다.
...
ActiveX를 사용합니다. // COM 모니커 인스턴스를 사용합니다.
ActiveDs_TLB, // 생성된 클래스 라이브러리
ComObj; //OleCheck 및 기타 COM 기능을 사용합니다.
구현
절차 TForm1.BtnCreateUserClick(Sender: TObject);
var
사용자: IADsUser;
Comp: IADsContainer;
시작하다
노력하다
Comp := GetObject('WinNT://[컴퓨터 이름],컴퓨터') as
IADs컨테이너;
Usr := Comp.Create('user', '[accountname]') as IADsUser;
Usr.SetInfo;
제외하고
E: EOleException이 시작됩니다.
ShowMessage(E.메시지);
끝;
끝;
끝;
절차 TForm1.BtnSetPassWordClick(Sender: TObject);
var
사용자: IADsUser;
시작하다
노력하다
Usr := GetObject('WinNT://[컴퓨터 이름]/[계정 이름],사용자')
IADsUser로;
Usr.SetPassword('thenewpassword');
제외하고
E: EOleException이 시작됩니다.
ShowMessage(E.메시지);
끝;
끝;
끝;
// GetObject는 유즈넷에서 볼 수 있는 VB 코드(GetObject)입니다.
//
// GetObject는 "ADSipath"(예: WinNT://....또는 IIS://localhost)를 사용할 수 있습니다.
// 기존 ADSI 공급자와 번들
함수 TForm1.GetObject(const 이름: 문자열): IDispatch;
var
모니커: IMoniker;
먹음: 정수;
BindContext: IBindCtx;
파견: IDispatch;
시작하다
OleCheck(CreateBindCtx(0, BindContext));
OleCheck(MkParseDisplayName(BindContext,
PWideChar(와이드스트링(이름)),
먹다,
별명));
OleCheck(Moniker.BindToObject(BindContext, NIL, IDispatch,
보내다));
결과 := 파견;
끝;
끝.
ADSI를 사용하여 사용자 계정 설정을 수정할 수도 있습니다. 다음 코드는 모든 계정의 "비밀번호가 만료되지 않음" 옵션을 변경합니다.
절차 TFormMain.ButtonNeverExpiresClick(Sender: TObject);
var
사용자: IADsUser;
시작하다
노력하다
Usr := GetObject('WinNT://[컴퓨터 이름]/[acccoutname],사용자') asIADsUser;
// 체크박스 상태 확인
CheckBoxPasswordNeverExpires.Checked인 경우
Usr.Put('UserFlags', Usr.Get('UserFlags') OR 65536)
// 65536은 Microsoft ADSI SDK의 iads.h에 UF_DONT_EXPIRE_PASSWORD로 정의되어 있습니다.
또 다른
Usr.Put('UserFlags', Usr.Get('UserFlags') XOR 65536);
Usr.SetInfo;
제외하고
E: EOleException이 시작됩니다.
ShowMessage(E.메시지);
끝;
끝;
끝;