Вы можете использовать ADSI (интерфейс службы Active Directory) от 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, в каталоге импорта 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);
вар
Пользователь: IADsUser;
Комп: IADsContainer;
начинать
пытаться
Comp := GetObject('WinNT://[имя компьютера],компьютер') как
IADsContainer;
Usr := Comp.Create('user', '[accountname]') как IADsUser;
Usr.SetInfo;
кроме
на E: EOleException начинается
ПоказатьСообщение(Е.Сообщение);
конец;
конец;
конец;
процедура TForm1.BtnSetPassWordClick(Отправитель: TObject);
вар
Пользователь: IADsUser;
начинать
пытаться
Usr := GetObject('WinNT://[имя компьютера]/[имя учетной записи],пользователь')
как IADsUser;
Usr.SetPassword('thenewpassword');
кроме
на E: EOleException начинается
ПоказатьСообщение(Е.Сообщение);
конец;
конец;
конец;
// GetObject — это код VB (GetObject), найденный в Usenet.
//
// GetObject может использовать ADSipath (например, WinNT://....или IIS://localhost)
// Объединение с существующим провайдером ADSI
функция TForm1.GetObject(const Name: string): IDispatch;
вар
Прозвище: IМоникер;
Съедено: целое число;
БиндКонтекст: IBindCtx;
Отправка: IDispatch;
начинать
OleCheck(CreateBindCtx(0, BindContext));
OleCheck(MkParseDisplayName(BindContext,
PWideChar(WideString(Имя)),
Съел,
Прозвище));
OleCheck(Moniker.BindToObject(BindContext, NIL, IDispatch,
Отправлять));
Результат: = Отправка;
конец;
конец.
Вы также можете использовать ADSI для изменения настроек учетной записи пользователя. Следующий код изменит параметр «Срок действия пароля не истекает» для любой учетной записи.
процедура TFormMain.ButtonNeverExpiresClick(Отправитель: TObject);
вар
Пользователь: IADsUser;
начинать
пытаться
Usr := GetObject('WinNT://[имя компьютера]/[имя_аккаунта],пользователь') asIADsUser;
// Проверяем статус флажка
если CheckBoxPasswordNeverExpires.Checked тогда
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 начинается
ПоказатьСообщение(Е.Сообщение);
конец;
конец;
конец;