powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADO. Запрос к AD. Значение objectGUID в String
18 сообщений из 18, страница 1 из 1
ADO. Запрос к AD. Значение objectGUID в String
    #39891513
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,

Как извлечь значение objectGUID из домена в виде строки?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    
  lADOQuery.ConnectionString :=
    'Provider=ADsDSOObject;Encrypt Password=False;Integrated Security=SSPI;Mode=Read;Bind Flags=0;ADSI Flag=-2147483648';
  lADOQuery.ParamCheck := false;
  lADOQuery.SQL.Text := 'SELECT name, objectGUID FROM ''' + 'LDAP://' + lDomain +
      ''' where objectCategory = ''' + 'USER' + ''' and sAMAccountName = '''
      + 'any_surname' + '''';
  lADOQuery.Active := True;

  ShowMessage(lADOQuery.FieldValues['name']);
  ShowMessage(lADOQuery.FieldValues['objectGUID']);


name выводится корректно
objectGUID выводится неправильно '-'. Действительное значение {019FBC3F-5088-4811-B9E5-3C20991F8E50}, на скриншоте.

Спасибо.
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39891714
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiy
objectGUID выводится неправильно
С чего вы взяли? Что у вас получается и что ожидалось?
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39891738
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Ожидаю сообщение с текстом '{019FBC3F-5088-4811-B9E5-3C20991F8E50}', а получаю:
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39891984
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
 ShowMessage(lADOQuery.FieldByName('objectGUID').AsString);


?
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892181
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,

Код: pascal
1.
ShowMessage(lADOQuery.FieldByName('objectGUID').AsString);


Также '-'

Еще есть такой вариант:
Код: pascal
1.
ShowMessage(lADOQuery.FieldByName('objectGUID').Text);


На выходе:
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892201
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiy,

А если в запросе закастить его в натурально строковый тип?
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892212
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiy
Еще есть такой вариант:
Код: pascal
1.
ShowMessage(lADOQuery.FieldByName('objectGUID').Text);


Ну то есть он его получает тупо в двоичном виде. Проверьте, ради интереса, что
Код: pascal
1.
lADOQuery.FieldByName('objectGUID').Size = SizeOf(TGUID)

и если да, то вам надо просто засунуть это значение в TGUID, а уже его потом преобразовывать в текст.
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892223
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,

Проверил:
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892225
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тем не менее, для разных пользователей код
Код: pascal
1.
lGUID := TGUID(lADOQuery.FieldByName('objectGUID').Value);



Заполняет разные данные(может мне это и подойдет, проверю уникальность этих значений среди всех пользователей):
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892249
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiy
alekcvp,
Проверил:


Возможно это максимальный размер, есть ещё .DataSize
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892271
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,

.DataSize определяет как 4002

Еще сейчас понаблюдал грусть-печаль: для одного и того же пользователя TGUID(lADOQuery.FieldByName('objectGUID').Value) возвращает разные GUID, другими словами такое приведение некорректно. Также есть различия в содержимом lADOQuery.FieldByName('objectGUID'), когда запрашиваешь только objectGUID и когда с доп. полями, например name:
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892346
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad F,

Извини, пропустил сообщение. Сейчас заметил.

В общем, пробовал использовать cast и guid в запросе. Например так:
Код: pascal
1.
cast(objectGUID as uniqueidentifier) as objectGUID



Падает при активации запроса lADOQuery.Active := True так:
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892349
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiy,

А если порыться в списке функций используемого SQL-движка, нет ли там чего нибудь встроенного типа GuidToString()??
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892438
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
ShowMessage(lADOQuery.FieldByName('objectGUID').ClassName);
ShowMessage(BoolToStr(lADOQuery.FieldByName('objectGUID').IsBlob, True));
ShowMessage(IntToStr(lADOQuery.FieldByName('objectGUID').DataSize));
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892446
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function SSPIStrToGUID(const AStr: WideString): TGUID;
begin
  HexToBin(PWideChar(AStr), @Result, SizeOf(Result));
end;

var
  LADsUser: IADsUser;
begin
  OleCheck(ADsGetObject(
    PChar(Format('LDAP://<SID=%s>', [SIDStr])),
    IID_IADsUser,
    LADsUser
  );
  LGUID := SSPIStrToGUID(LADsUser.GUID);
end;
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892983
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Спасибо. Так получается. Сейчас поразбираюсь со строкой запроса, так как SID из вашего примера я программно не могу вычислить(по такой же причине, что и objectGUID).

Возможно, кому-нибудь пригодится в дополнение к примеру:
Код: pascal
1.
2.
3.
4.
uses
  ActiveX, ActiveDs_TLB;

function ADsGetObject(lpszPathName: PWideChar; const riid: TIID; out Obj): HRESULT; stdcall; external 'Activeds.dll';



Генерация ActiveDs_TLB.pas с описанием интерфейса IADsUser:
tlibimp -P activeds.tlb
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39892999
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
distinguishedName через ADO можно получить
Далее использовать его при обращении к функции ADsGetObject:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
var
  lDistinguishedName: String;
  lADsUser: IADsUser;
  lGUID:TGUID;
begin
  ...
  lADOQuery.SQL.Text := 'SELECT name, distinguishedName FROM ''' + 'LDAP://' + lDomain +
      ''' where objectCategory = ''' + 'USER' + ''' and sAMAccountName = '''
      + 'any_surname' + '''';
  lADOQuery.Active := True;
  lDistinguishedName := lADOQuery.FieldValues['distinguishedName'];

  ADsGetObject(
      PChar(Format('LDAP://%s', [lDistinguishedName])),
      IID_IADsUser,
      lADsUser
    );

  ShowMessage(lADsUser.GUID);
  lGUID := SSPIStrToGUID(lADsUser.GUID);
  ShowMessage(lGUID.ToString());
end;
...
Рейтинг: 0 / 0
ADO. Запрос к AD. Значение objectGUID в String
    #39893072
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiy
Сейчас поразбираюсь со строкой запроса, так как SID из вашего примера я программно не могу вычислить(по такой же причине, что и objectGUID).
Как-то так
Код: pascal
1.
Format('LDAP://CN=%s,CN=users,DC=%s', ['any_surname', lDomain]);
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADO. Запрос к AD. Значение objectGUID в String
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]