|
Запрос ADO к LDAP. Как правильно передать параметр objectGUID. | ☑ | ||
---|---|---|---|---|
0
ELEA26
14.09.17
✎
15:52
|
Как правильно передать параметр objectGUID
Код: ADODB_Command = Новый COMОбъект("ADODB.Command"); ADODB_Command.ActiveConnection =Connection; ADODB_Command.Properties("Page Size").Value = 1000; ADODB_Command.Properties("Timeout").Value = 30; ADODB_Command.Properties("Cache Results").Value = Ложь; query = "SELECT ADsPath,objectGUID,sAMAccountName,userPrincipalName FROM 'LDAP://"+Адрес+"/"+ОбщиеФункции.Root()+"' where objectGUID = ?"; ADODB_Command.CommandType = 8; ADODB_Command.CommandText = query; //Parameters=ADODB_Command.Parameters; //Parameter = ADODB_Command.CreateParameter( , 72,1, 5,ОбщиеФункции.ПреобразоватьGUIDвCOM(Гуид)); //Как только не преобразовывал этот гуид. //1 - Имя (говорят именовать нельзя) //2 - Тип (см. в "C:\Program Files\Common Files\System\ado\adojavas.inc") //3 - 1=входящий, 2=исходящий (adParamInput,adParamOutput) там же в файле //4 - хз. Длина видимо //5 - значение //ADODB_Command.Parameters.Append(Parameter); rs = ADODB_Command.Execute(); Без where objectGUID = ? - работает, но потом перебирать кучу строк - не айс. А получить по одному GUID никак не получается. |
|||
1
Ёпрст
14.09.17
✎
15:54
|
не проще динамический запрос слепить и забить на параметр ?
|
|||
2
Ёпрст
14.09.17
✎
15:55
|
query = "SELECT ADsPath,objectGUID,sAMAccountName,userPrincipalName FROM 'LDAP://"+Адрес+"/"+ОбщиеФункции.Root()+"' where objectGUID = "+гуидтвой+"'";
|
|||
3
ELEA26
14.09.17
✎
16:00
|
(2) Вот как "гуидтвой" подставлять? Как он выглядеть должен?
Строка? С знаками {} с дефизами? Или как varbinary 0x0d836833fблабла? Я по всякому ставил. Или с ошибками валится или пустой запрос. |
|||
4
Ёпрст
14.09.17
✎
16:00
|
(3) подставляй так, как она хранится в ИБ.
|
|||
5
Ёпрст
14.09.17
✎
16:01
|
скорее, там будет 0x0d836833fблабла?
|
|||
6
ELEA26
14.09.17
✎
16:05
|
(4) в ИБ это реквизит строка:
{E2B589DD-DE54-475E-BCD4-DD894F6BF9EE} Добывается ранее при создании таким же запросом. Но возвращается COM объект. Чтобы его сохранить делаю так: Функция ПреобразоватьGUID(COMobjectGUID) Экспорт objectGUID = COMobjectGUID.Выгрузить(); GUID = "{"; GUID = GUID + НЕХ(Из10В(objectGUID[3],16)); GUID = GUID + НЕХ(Из10В(objectGUID[2],16)); GUID = GUID + НЕХ(Из10В(objectGUID[1],16)); GUID = GUID + НЕХ(Из10В(objectGUID[0],16)); GUID = GUID + "-"; GUID = GUID + НЕХ(Из10В(objectGUID[5],16)); GUID = GUID + НЕХ(Из10В(objectGUID[4],16)); GUID = GUID + "-"; GUID = GUID + НЕХ(Из10В(objectGUID[7],16)); GUID = GUID + НЕХ(Из10В(objectGUID[6],16)); GUID = GUID + "-"; GUID = GUID + НЕХ(Из10В(objectGUID[8],16)); GUID = GUID + НЕХ(Из10В(objectGUID[9],16)); GUID = GUID + "-"; GUID = GUID + НЕХ(Из10В(objectGUID[10],16)); GUID = GUID + НЕХ(Из10В(objectGUID[11],16)); GUID = GUID + НЕХ(Из10В(objectGUID[12],16)); GUID = GUID + НЕХ(Из10В(objectGUID[13],16)); GUID = GUID + НЕХ(Из10В(objectGUID[14],16)); GUID = GUID + НЕХ(Из10В(objectGUID[15],16)); GUID = GUID + "}"; Возврат GUID; КонецФункции А COMobjectGUID - это: GUIDСтр = ОбщиеФункции.ПреобразоватьGUID(rs.Fields("objectGUID").Value); В чистом виде rs.Fields("objectGUID").Value хранить не получается. Как из строки обратно сделать COM объект и тем более как потом вставить в запрос не понятно. Пробовал обратно в COM так: Функция ПреобразоватьGUIDвCOM(GUID) Экспорт НашМассив = Новый Массив; НашМассив.Добавить(СРЕД(GUID,8,2)); НашМассив.Добавить(СРЕД(GUID,6,2)); НашМассив.Добавить(СРЕД(GUID,4,2)); НашМассив.Добавить(СРЕД(GUID,2,2)); НашМассив.Добавить(СРЕД(GUID,13,2)); НашМассив.Добавить(СРЕД(GUID,11,2)); НашМассив.Добавить(СРЕД(GUID,18,2)); НашМассив.Добавить(СРЕД(GUID,16,2)); НашМассив.Добавить(СРЕД(GUID,21,2)); НашМассив.Добавить(СРЕД(GUID,23,2)); НашМассив.Добавить(СРЕД(GUID,26,2)); НашМассив.Добавить(СРЕД(GUID,28,2)); НашМассив.Добавить(СРЕД(GUID,30,2)); НашМассив.Добавить(СРЕД(GUID,32,2)); НашМассив.Добавить(СРЕД(GUID,34,2)); НашМассив.Добавить(СРЕД(GUID,36,2)); КомМассив = New COMSafeArray(НашМассив,"VT_VARIANT",16); КонецФункции Но тоже не катит. |
|||
7
Филиал-msk
14.09.17
✎
16:06
|
Оно в CAST умеет?
|
|||
8
ELEA26
14.09.17
✎
16:06
|
Да, валится с ошибкой:
{ОбщийМодуль.ОбменLDAP.Модуль(287)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Provider): Произошла одна или несколько ошибок во время обработки команды. |
|||
9
ELEA26
14.09.17
✎
16:07
|
(7) И cast и convert в условии пробовал. Тоже не получается :(
|
|||
10
Филиал-msk
14.09.17
✎
16:09
|
(9) а теперь в выборке попробуй чтобы строку получить.
|
|||
11
ELEA26
14.09.17
✎
16:12
|
(10) я в выборке пробовал. без условия, просто добавлял в выборку:
cast(objectGUID as varchar) as test пробовал и cast(objectGUID as uniqueidentifier) as test и convert(varchar,objectGUID,1) и все это в разных комбинациях. Все время запрос падает с ошибкой из (8) |
|||
12
Ёпрст
14.09.17
✎
16:14
|
(6) подставляй в запрос просто строкой 0x0d836833.....
|
|||
13
Ёпрст
14.09.17
✎
16:17
|
текст запроса должен быть такой в результате:
where objectGUID = 0xBFD7C8600001E2D711E2BC5E73199D7F |
|||
14
Ёпрст
14.09.17
✎
16:17
|
ну и как получить hex из 10-ого числа, наверное , напишешь :)
|
|||
15
Ёпрст
14.09.17
✎
16:28
|
Или вот, гений тут распинался
v8: Как перевести ГУИД в число и обратно? |
|||
16
ELEA26
14.09.17
✎
16:32
|
(13) Вот из отладчика:
SELECT ADsPath,objectGUID,sAMAccountName,userPrincipalName FROM 'LDAP://172.10.10.15/DC=ad,DC=domain,DC=corp' Where objectGUID = 0xDD89B5E254DE5E47DBD4DD894F6BF9EE выпало в исключение, текст ошибки тот же: {ОбщийМодуль.ОбменLDAP.Модуль(287)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Provider): Произошла одна или несколько ошибок во время обработки команды. |
|||
17
Ёпрст
14.09.17
✎
16:49
|
(16) без where хотя бы работает ?
|
|||
18
ELEA26
14.09.17
✎
16:51
|
(17) да.
И даже другой запрос по логину: query = "SELECT ADsPath,objectGUID,sAMAccountName,userPrincipalName FROM 'LDAP://"+Адрес+"/"+ОбщиеФункции.Root()+"' where UPPER(sAMAccountName) = '"+Логин+"'"; отлично работает. sAMAccountName - строка. А вот objectGUID - OctetString А как с этим OctetString работать - не понимаю... |
|||
19
Ёпрст
14.09.17
✎
16:54
|
(18) не понял, у тебя objectGUID бинари16 или OctetString ?
|
|||
20
ELEA26
14.09.17
✎
16:56
|
(19) да вот фиг пойми. В ActiveDirectoryExplorer - пишет, что OctetString все же.
|
|||
21
Ёпрст
14.09.17
✎
17:00
|
(20) да нифига :)
https://msdn.microsoft.com/en-us/library/ms679021(v=vs.85).aspx |
|||
22
Ёпрст
14.09.17
✎
17:05
|
И это, а нафига тебе вообще впёрся objectGUID?
Пользуй просто guid |
|||
23
ELEA26
14.09.17
✎
17:07
|
(22) Всмысле? В LDAP есть только этот.
|
|||
24
Ёпрст
14.09.17
✎
17:15
|
(23) есть там и поле guid
|
|||
25
Ёпрст
14.09.17
✎
17:15
|
ghjdthm
|
|||
26
Ёпрст
14.09.17
✎
17:15
|
проверь
|
|||
27
Ёпрст
14.09.17
✎
17:24
|
Вот так еще, работает?
where objectGUID=\90\39\5F\B9\9A\B5\1B\4A\9E\96 \86\C6\6C\B1\8D\99 |
|||
28
Ёпрст
14.09.17
✎
17:27
|
или так ?
where objectGUID={b95f3990-b59a-4a1b-9e96-86c66cb18d99} |
|||
29
ELEA26
14.09.17
✎
17:38
|
(27) (28) пробовал. Если
where objectGUID='{b95f3990-b59a-4a1b-9e96-86c66cb18d99}' то не находит, а если без кавычек: where objectGUID={b95f3990-b59a-4a1b-9e96-86c66cb18d99} то с ошибкой выпадает. |
|||
30
mexanik_96
14.09.17
✎
17:44
|
(29) не взлетит ибо тип октет стринг, те бинарь. нужно через обертку делать. делал c использованием с#.
|
|||
31
mexanik_96
14.09.17
✎
17:47
|
+(30) var entry = new DirectoryEntry(strDEntry, username, password);
if (entry != null) { if (property == "objectGUID") { Guid guid = new Guid((Byte[])(Array)entry.Properties["objectGUID"][0]); strDEntry = LDAP:\\и поехали |
|||
32
ELEA26
14.09.17
✎
19:35
|
Все же:
where objectGUID='\90\39\5F\B9\9A\B5\1B\4A\9E\96 \86\C6\6C\B1\8D\99' С кавычками одиночными. Но порядок байтов надо менять местами (от обычного строкового ГУИД). 1 - 4 в 4 - 1 5-6 в 6-5 7-8 в 8-7 остальные по порядку. Хотя у меня такое ощущения, что такой вариант я пробовал. Провозился знатно :( |
|||
33
Йохохо
14.09.17
✎
19:42
|
а что за запись такая? '\90\39\5F\B9\9A\B5\1B\4A\9E\96
\86\C6\6C\B1\8D\99' Синхронизация с Active Directory |
|||
34
ELEA26
14.09.17
✎
20:00
|
(33) Ну гуид в ввиде констаны в запросе.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |