คุณสามารถใช้ ADSI (Active Directory Service Interface) ของ Microsoft เพื่อสร้างบัญชีผู้ใช้ Windows ใน Delphi อาจเป็นเพราะชื่อของ ADSI หลายคนคิดว่า ADSI สามารถใช้ได้ใน Windows 2000 เท่านั้น ที่จริงแล้ว แพลตฟอร์ม Win32 ทั้งหมดรองรับ ADSI อาจจำเป็นต้องดาวน์โหลด ADSI สำหรับ Windows เวอร์ชันต่างๆ (รายละเอียดเพิ่มเติม http://www.microsoft.com/china/windows2000/library/howitworks/activedirectory/adsilinks.htm) Windows 2000 มี ADSI
ADSI เป็นหัวข้อใหญ่ ในบทความนี้ผมจะแนะนำสั้นๆ เท่านั้น ADSI เป็นอินเทอร์เฟซทั่วไปสำหรับบริการคอมพิวเตอร์ต่างๆ มากมาย (ส่วนใหญ่เป็นแบบไดเร็กทอรี) ผู้ให้บริการ ADSI มาตรฐานบางราย (PRovider เปรียบเสมือนอินเทอร์เฟซ COM ที่สามารถใช้ในโปรแกรมของคุณ) ได้แก่ WinNT, IIS, LDAP และ NDS ใช้ผู้ให้บริการ WinNT เพื่อสร้างและแก้ไขบัญชีผู้ใช้ และตั้งค่าหรือแก้ไขกลุ่ม
โปรแกรมขนาดเล็กต่อไปนี้แสดงขั้นตอนที่จำเป็นในการสร้างบัญชีผู้ใช้โดยใช้ ADSI ภายใต้ NT/2000:
ขั้นแรก คุณต้องนำเข้าไลบรารีคลาส ADSI (เมนูไลบรารีประเภทโครงการ/นำเข้า) ไลบรารีคลาสนี้สามารถพบได้ในไดเร็กทอรีย่อย system32 (เช่น C:/WINNT/system32/activeds.tlb) ชื่อไฟล์จะต้องเป็น "activeds.tlb" หากไม่พบไฟล์ คุณจะต้องติดตั้ง ADSI อย่างถูกต้อง หลังจากนำเข้าไลบรารีคลาสสำเร็จแล้ว คุณจะพบไฟล์ เช่น activeds_tlb.pas ในไดเร็กทอรี Imports ของ Delphi (เช่น ../Delphi6/Imports/activeds_tlb.pas) ไฟล์นี้จำเป็นต้องรวมอยู่ในคำสั่ง Uses ของคุณเพื่อให้ ADSI สามารถใช้ในโปรแกรม Delphi
ด้านล่างนี้เป็นตัวอย่างของ ADSI ที่สร้างผู้ใช้ คุณต้องแทนที่ [ชื่อคอมพิวเตอร์] ด้วยชื่อคอมพิวเตอร์จริงที่คุณจะสร้างผู้ใช้ ในทำนองเดียวกัน [ชื่อบัญชี] คือบัญชีผู้ใช้ที่จะสร้าง ทดสอบใน WindowNT 4.0 และ Windows 2000
-
ใช้ ActiveX // ใช้อินสแตนซ์ COM Moniker
ActiveDs_TLB // สร้างไลบรารีคลาส
ComObj; //ใช้ OleCheck และฟังก์ชัน COM อื่นๆ
การดำเนินการ
ขั้นตอน TForm1.BtnCreateUserClick (ผู้ส่ง: TObject);
var
Usr: IADsUser;
คอมพ์: IADsContainer;
เริ่ม
พยายาม
คอมพ์ := GetObject('WinNT://[ชื่อคอมพิวเตอร์],คอมพิวเตอร์') เป็น
IADคอนเทนเนอร์;
Usr := Comp.Create('user', '[accountname]') as IADsUser;
Usr.SetInfo;
ยกเว้น
บน E: EOleException จะเริ่มต้น
ShowMessage(E.ข้อความ);
จบ;
จบ;
จบ;
ขั้นตอน TForm1.BtnSetPassWordClick (ผู้ส่ง: TObject);
var
Usr: IADsUser;
เริ่ม
พยายาม
Usr := GetObject('WinNT://[ชื่อคอมพิวเตอร์]/[ชื่อบัญชี],ผู้ใช้')
ในฐานะผู้ใช้ IAD;
Usr.SetPassword('รหัสผ่านใหม่');
ยกเว้น
บน E: EOleException จะเริ่มต้น
ShowMessage(E.ข้อความ);
จบ;
จบ;
จบ;
// GetObject คือโค้ด VB (GetObject) ที่พบใน Usenet
-
// GetObject สามารถใช้ "ADSipath" (เช่น WinNT://....หรือ IIS://localhost)
// รวมกับผู้ให้บริการ ADSI ที่มีอยู่
ฟังก์ชัน TForm1.GetObject (ชื่อ const: สตริง): IDispatch;
var
ชื่อเล่น: IMoniker;
กิน: จำนวนเต็ม;
BindContext: IBindCtx;
จัดส่ง: IDispatch;
เริ่ม
OleCheck(CreateBindCtx(0, BindContext));
OleCheck (MkParseDisplayName (BindContext,
PWideChar(WideString(ชื่อ)),
กินแล้ว
ชื่อเล่น));
OleCheck (Moniker.BindToObject (BindContext, NIL, IDispatch,
จัดส่ง));
ผลลัพธ์ := จัดส่ง;
จบ;
จบ.
คุณยังสามารถใช้ ADSI เพื่อแก้ไขการตั้งค่าบัญชีผู้ใช้ได้ รหัสต่อไปนี้จะเปลี่ยนตัวเลือก "รหัสผ่านไม่มีวันหมดอายุ" สำหรับบัญชีใดๆ
ขั้นตอน TFormMain.ButtonNeverExpiresClick (ผู้ส่ง: TObject);
var
Usr: IADsUser;
เริ่ม
พยายาม
Usr := GetObject('WinNT://[ชื่อคอมพิวเตอร์]/[acccoutname],ผู้ใช้') asIADsUser;
// ตรวจสอบสถานะของช่องทำเครื่องหมาย
ถ้า CheckBoxPasswordNeverExpires ตรวจสอบแล้ว
Usr.Put('UserFlags', Usr.Get('UserFlags') หรือ 65536)
// 65536 ถูกกำหนดให้เป็น UF_DONT_EXPIRE_PASSWORD ใน iads.h ของ Microsoft ADSI SDK
อื่น
Usr.Put('UserFlags', Usr.Get('UserFlags') XOR 65536);
Usr.SetInfo;
ยกเว้น
บน E: EOleException จะเริ่มต้น
ShowMessage(E.ข้อความ);
จบ;
จบ;
จบ;