Имя: Пароль:
1C
1С v8
Интеграция/Получение данных из Active Directory в 1С
, ,
0 mao
 
19.09.19
06:04
Не могу получить два атрибута (pwdlastset,lastlogon) из AD, возвращает COMОбъект.

Оба атрибута имеют тип Integer8, 64-битное значение, представляющее дату в UTC - количество интервалов в 100 наносекунд, начиная с 12:00 01.01.1601.

Подскажите, пожалуйста, как вытащить эти поля.
1 ppa32
 
19.09.19
07:30
А можно код, которым ты это делаешь?
2 mao
 
19.09.19
07:46
Фильтр = "(&(objectCategory=person)(objectClass=user)(sn="+AD_User_sAMAccountName+"))";

КомандаАДО    = Новый COMОбъект("ADODB.Command");
СоединениеАДО = Новый COMОбъект("ADODB.Connection");
    
СоединениеАДО.Provider = "ADSDSOObject";
Попытка
   СоединениеАДО.Open("Active Directory Provider");    
Исключение
   Сообщить("Ошибка при открытии Active Directory Provider: " + ОписаниеОшибки());
   Возврат;
КонецПопытки;
    
КомандаАДО.ActiveConnection = СоединениеАДО;
    
Попытка
   RootDSE = ПолучитьCOMОбъект("LDAP://RootDSE");
Исключение
   Сообщить("Ошибка ПолучитьCOMОбъект(LDAP://RootDSE): " + ОписаниеОшибки());
   Возврат;
КонецПопытки;

ТекущийДомен = RootDSE.Get("defaultNamingContext");
Попытка
   ОбъектТекущегоДомена = ПолучитьCOMОбъект("LDAP://" + ТекущийДомен);
Исключение
   Сообщить("Ошибка ПолучитьCOMОбъект "+"LDAP://" + ТекущийДомен+": " + ОписаниеОшибки());
   Возврат;
КонецПопытки;

КомандаАДО.CommandText = "<LDAP://" +ТекущийДомен + ">;" +Фильтр+ ";displayName,Description,title,department,company,EmployeeID,badPwdCount,physicalDeliveryOfficeName,telephoneNumber,mail,sAMAccountName,LastLogon,pwdlastset,useraccountcontrol,userworkstations;subtree";
КомандаАДО.Properties("Page Size").Value     = 100;
КомандаАДО.Properties("Timeout").Value       = 30;
КомандаАДО.Properties("Cache Results").Value = Ложь;

Попытка
   ВыборкаАДО = КомандаАДО.Execute();  
Исключение
   Сообщить("Ошибка Execute(): " + ОписаниеОшибки());
   Возврат;
КонецПопытки;

Пока НЕ ВыборкаАДО.EOF Цикл
        
   Сообщить("ФИО: "                           + СокрЛП(ВыборкаАДО.Fields("displayName").Value));
   Сообщить("Должность: "                     + СокрЛП(ВыборкаАДО.Fields("title").Value));
   Сообщить("Подразделение: "                 + СокрЛП(ВыборкаАДО.Fields("department").Value));
   Сообщить("Организация: "                   + СокрЛП(ВыборкаАДО.Fields("company").Value));
   Сообщить("Отпуск: "                    + СокрЛП(ВыборкаАДО.Fields("EmployeeID").Value));
   Сообщить("Кабинет: "                          + СокрЛП(ВыборкаАДО.Fields("physicalDeliveryOfficeName").Value));
   Сообщить("Телефон: "                            + СокрЛП(ВыборкаАДО.Fields("telephoneNumber").Value));
   Сообщить("Время последнего входа: "              + ВыборкаАДО.Fields("lastlogon").Value);
   Сообщить("Дата смены пароля: "                   + СокрЛП(ВыборкаАДО.Fields("pwdlastset").Value));
  
   ВыборкаАДО.MoveNext();
        
КонецЦикла;
    
ВыборкаАДО.Close();
СоединениеАДО.Close();
3 ppa32
 
19.09.19
09:01
4 mao
 
20.09.19
08:13
РЕШЕНИЕ НАЙДЕНО!

Функция TimeZoneBias()
    
    objWMIService = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2");
      colTimeZone = objWMIService.ExecQuery("Select * from Win32_TimeZone");
    
    Для каждого objTimeZone Из colTimeZone Цикл
        TimeZoneBias = objTimeZone.Bias;
        Возврат TimeZoneBias;
    КонецЦикла;
    
    objWMIService = "";
      colTimeZone = "";

КонецФункции
_______
intBias = TimeZoneBias();    
__________
objDate = ВыборкаАДО.Fields("pwdlastset").Value;

dtmDate = ((((objDate.Highpart * pow(2,32)) + objDate.LowPart)/(600000000 - intBias))/1440) ;
dtmDate = Дата(1601,1,1)+dtmDate*60*60*24;
Сообщить(dtmDate);
________

Получаю необходимую дату.