Sources
Delphi Russian Knowledge Base
DRKB - база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Создание Аккаунта в Windows, используя ADSI (Активные директории)

01.01.2007
Philip Jespersen

Чтобы создавать пользовательские аккаунты в Windows на Delphi можно использовать ADSI (Active Directory Services Interface) от Microsoft. Вы думаете, что ADSI это новая примочка для Windows 2000 (судя по названию), но оказывается ADSI доступна для всех платформ Win32. Для этого Вам потребуется всего навсего скачать ADSI для Windows (более полная информация на http://www.microsoft.com/adsi ). Ну и конечно же ADSI входит в поставку Windows 2000.

ADSI довольно большой предмет для изучения. В данном примере я затрону этот предмет поверхностно. ADSI - это своего рода основа для различных сервисов (обычно основанных на директориях) оперционной системы. Например, стандартными ADSI сервисами можно назвать (COM интерфейсы, которые можно использовать в программах) WinNT, IIS, LDAP и NDS. WinNT сервис может тем самым использоваться для создания пользовательских аккаунтов, модификации их или модификации групп.

Следующий небольшой пример показывает необходимые шаги для создания пользовательского аккаунта в NT/2000, используя ADSI:

Во первых Вам прийдётся импортировать Библиотеку Типов ADSI (Menu Project/Import Type Library). Библиотеку Типов можно найти в поддирректории system32 (Например C:\WINNT\system32\activeds.tlb). Требуемый файл называется 'activeds.tlb'. Если такого файла нет, то проверьте, правильно ли вы установили ADSI. После успешного импортирования Библиотеки Типов Вы найдёте новый файл в дирректории ипортов Delphi, файл будет называться "activeds_tlb.pas" (..\Delphi5\Imports\activeds_tlb.pas). Чтобы приступить к программированию ADSI в Delphi, необходимо включить этот файл в Ваш проект.

Далее в примере, необходимо заменить [computername] на фактическое имя компьютера, с которым Вы работаете. То же надо проделать с [accountname]. Пример тестировался на WindowsNT 4.0 и Windows 2000.

... 

uses ActiveX,        // используется для COM Moniker stuff... 
     ActiveDs_TLB,   // созданная библиотека типов 
     ComObj;         // используется для OleCheck и других функций COM 

implementation 

procedure TForm1.BtnCreateUserClick(Sender: TObject); 
var 
  Usr:  IADsUser; 
  Comp: IADsContainer; 
begin 
  try 
    Comp := GetObject('WinNT://[computername],computer') as 
      IADsContainer; 
    Usr := Comp.Create('user', '[accountname]') as IADsUser; 
    Usr.SetInfo; 
  except 
    on E: EOleException do begin 
      ShowMessage(E.Message); 
    end; 
  end; 
end; 


procedure TForm1.BtnSetPasswordClick(Sender: TObject); 
var 
  Usr: IADsUser; 
begin 
  try 
    Usr := GetObject('WinNT://[computername]/[accountname],user') 
      as IADsUser; 
    Usr.SetPassword('thenewpassword'); 
  except 
    on E: EOleException do begin 
      ShowMessage(E.Message); 
    end; 
  end; 
end; 


// GetObject использует вызов VB GetObject 
// Данный код (GetObject) был найден в Usenet.   
// 
// GetObject позволяет связаться с существующим ADSI сервисом 
// используя 'ADSIPath' (например WinNT://.... или 
// IIS://localhost). 

function TForm1.GetObject(const Name: string): IDispatch; 
var 
  Moniker: IMoniker; 
  Eaten: integer; 
  BindContext: IBindCtx; 
  Dispatch: IDispatch; 
begin 
  OleCheck(CreateBindCtx(0, BindContext)); 
  OleCheck(MkParseDisplayName(BindContext, 
                              PWideChar(WideString(Name)), 
                              Eaten, 
                              Moniker)); 
  OleCheck(Moniker.BindToObject(BindContext, NIL, IDispatch, 
            Dispatch)); 

  Result := Dispatch; 
end; 

end. 

Через ADSI Вы так же можете изменять параметры пользовательских аккаунтов. Следующий код изменяет флаг 'Password never expires' нужного аккаунта:

procedure TFormMain.ButtonNeverExpiresClick(Sender: TObject); 
var 
  Usr: IADsUser; 
begin 
  try 
    Usr := GetObject('WinNT://[computername]/[acccoutname],user') as 
      IADsUser; 

  // Проверяем состояние чекбоксов... 
  if CheckBoxPasswordNeverExpires.Checked then 
    Usr.Put('UserFlags', Usr.Get('UserFlags') OR 65536) 
    // 65536 объявлено как UF_DONT_EXPIRE_PASSWORD в iads.h   
    // в ADSI SDK от Microsoft 
  else 
    Usr.Put('UserFlags', Usr.Get('UserFlags') XOR 65536);   
    Usr.SetInfo; 

  except 
    on E: EOleException do begin 
      ShowMessage(E.Message); 
    end; 
  end; 
end; 

В завершение...

Чтобы использовать большие возможности ADSI, необходимо проверить, поддерживаются ли такие сервисы как IADsUser или IADsContainer.

Я рекомендую поработать с ADSI SDK от Microsoft и более детально изучить Библиотеку Типов.

Некоторые ADSI компоненты я постараюсь выложить на своей домашней страничке (http://www.jespersen.ch). Так что, если интересно, то заходите и мыльте на philip@jespersen.ch

Previous page:
Локальная сеть
Top:
DRKB
Next page:
Имена сетевого адаптера, системное имя устройства и описание