Заметки · 01.09.2022

Тестируем ADapter

Итак, давайте протестируем ADapter и заодно, на примере Object Pascal в IDE Lazarus, я покажу как обращаться к утилите и получать из неё вывод.

Тестовый проект будет максимально простой. На форме будет 10 контролов:

  • TEdit (1 штука);
  • TMemo (1 штука);
  • TButton (8 штук).
Вот так выглядит форма в проекте

Теперь напишем функцию проверки пустоты в TEdit (в проекте у контрола имя userlogin):

function emptyedit(test: string): boolean;
begin
  if test='' then result:=false else result:=true;
end;

Если данных нет и TEdit пуст — функция вернёт False, если данные есть — True.

Теперь можно браться за процедуру обращения к внешней утилите. Для начала рассмотрим обычное обращение без параметров запуска, чтобы можно было взаимодействовать с окном Active-Directory-Object-Picker.

procedure GetAllDataFromAD;
var
  adapter: TProcess;
  stringlist: TStringList;
  error, notexe: string;
begin
  main_form.memo.Clear;
  error:='Произошла ошибка обращения к adapter.exe';
  notexe:='Не найден файл adapter.exe!' + #13 + 'Скачать его можно отсюда: https://ngdream.ru/adapter';
  if FileExists('adapter.exe') then
  begin
    try
      adapter:=TProcess.Create(nil);
      adapter.Executable:='adapter.exe';
      adapter.Options:=adapter.Options + [poUsePipes, poWaitOnExit, poNoConsole];
      adapter.Execute;
      stringlist:=TStringList.Create;
      stringlist.LoadFromStream(adapter.Output);
      main_form.memo.Text:=(ConsoleToUTF8(stringlist.Text));
      stringlist.Free;
      adapter.Free;
    except
      main_form.memo.Text:=error;
    end;
  end
  else main_form.memo.Text:=notexe;
end;

poNoConsole в adapter.Options никак не повлияет на вывод окна Active-Directory-Object-Picker, зато пользователь не увидит мрачное окно консоли и будет напрямую контактировать с окном выбора пользователя.

Получение данных о пользователе

И, чтобы завершить картину, покажу процедуру для адресного обращения к утилите с параметрами запуска. Как раз для этой процедуры и нужна, упомянутая выше, функция проверки TEdit.

procedure GetDataFromAD(command: string; username: string);
var
  prc: TProcess;
  stringlist: TStringList;
  error, empty, notexe: string;
begin
  main_form.memo.Clear;
  empty:='Необходимо задать логин пользователя';
  error:='Произошла ошибка обращения к adapter.exe';
  notexe:='Не найден файл adapter.exe' + #13 + 'Скачать его можно отсюда: https://ngdream.ru/adapter';
  login:=main_form.userlogin.Text;
  if FileExists('adapter.exe') then
  begin
    if emptyedit(login)=true then
       begin
         try
           prc:=TProcess.Create(nil);
           prc.Executable:='adapter.exe';
           prc.Parameters.Add(command);
           prc.Parameters.Add(username);
           prc.Options:=prc.Options + [poUsePipes, poWaitOnExit, poNoConsole];
           prc.Execute;
           stringlist:=TStringList.Create;
           stringlist.LoadFromStream(prc.Output);
           main_form.memo.Text:=(ConsoleToUTF8(stringlist.Text));
           stringlist.Free;
           prc.Free;
         except
           main_form.memo.Text:=error;
         end;
       end
       else main_form.memo.Text:=empty;
  end
  else main_form.memo.Text:=notexe;
end;

Данная процедура принимает данные в виде необходимого параметра запуска и содержимого нашего TEdit (если, разумеется, в нём есть данные).

Получение отображаемого имени

Вызывать процедуру можно вот так:

procedure Tmain_form.getdisplaynameClick(Sender: TObject);
begin
  GetAllDataFromAD; // Процедура получения общих данных пользователя
  GetDataFromAD('-getname', userlogin.Text); // Процедура получения конкретных данных пользователя
end; 

Вот таким методом можно получать данные о пользователе из Active Directory с помощью консольной утилиты ADapter.

Посмотреть весь код и взглянуть на работу тестовой программы можно вот по этой ссылке: