Синхронизация с ad

Добрый день, подскажите советом, ребята.
Itop установлен на windows 2008 r2.
Насколько написано в документации, если я не ошибаюсь, пользователь в itop должен быть external, чтобы работала сквозная аутентификация. Это сделано.
Если создавать пользователя LDAP, то сквозная не работает, по крайней мере у меня ничего вышло.

Для синхронизации с AD используется скрипт ad_import_accounts.php, так вот этот скрипт создает только ldap пользователей.

Как быть в этой ситуации? Хотелось бы либо найти решение для сквозной аутентификации пользователей типа ldap или заставить скрипт сихронизировать пользователей external.

нашел решение:
Поменял в ad_import_accounts.php:

	$sAction = 'created';
	echo "<h2>User $sLogin will be <em>created</em> in iTop</h2>";
	$oITopUser = new UserLDAP;
	$oITopUser->Set('login', $sLogin);
	$oITopUser->Set('contactid', $oPerson->GetKey());
	$oITopUser->Set('language', $aConfig['default_language']);
	// Update the profiles
	$oLinkSet = DBObjectSet::FromScratch('URP_UserProfile');
	foreach($aITopProfiles as $sProfile)
	{

Вместо UserLDAP прописал UserExternal

Правда все равно есть куча вопросов не решенных по синхронизации, например, как синхронизировать отдел пользователя, ведь это отдельная таблица (Команда), а также несколько других нюансов…

1 лайк

К сожалению, с AD я помочь пока не могу.

Когда найдешь ответы на вопросы, не стесняйся публиковать их здесь. Уверен, за это многие скажут тебе спасибо!

Кстати, спасибо, Владимир, за этот прекрасный сайт, нашел здесь много интересного!

В продолжение темы импорта из ad решил продолжить эксперименты.
Для начала добавил отчество для персоны, как тут уже описывалось в другой теме, дам полный код, если кому пригодится (правда, на 100% код не протестирован и серч позицианируется не там где надо):

<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <classes>
      <class id="Person">
      <properties>
          <naming _delta="redefine">
           <attributes>
           <attribute id="name"/>
           <attribute id="first_name"/>
           <attribute id="middle_name"/>
           </attributes>
          </naming>
        <reconciliation>
          <attributes>
            <attribute id="first_name"/>
            <attribute id="name"/>
            <attribute id="middle_name"/>
            <attribute id="org_id"/>
            <attribute id="org_name"/>
            <attribute id="email"/>
            <attribute id="employee_number"/>
          </attributes>
        </reconciliation>
      </properties>
      <fields>
        <field id="middle_name" xsi:type="AttributeString" _delta="define">
          <sql>middle_name</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
        <field id="team_id" xsi:type="AttributeExternalKey" _delta="define">
          <filter><![CDATA[SELECT Team]]></filter>
          <dependencies>
            <attribute id="org_id"/>
          </dependencies>
          <sql>team_id</sql>
          <target_class>Team</target_class>
          <is_null_allowed>true</is_null_allowed>
          <on_target_delete>DEL_MANUAL</on_target_delete>
        </field>
        <field id="team_name" xsi:type="AttributeExternalField" _delta="define">
          <extkey_attcode>team_id</extkey_attcode>
          <target_attcode>name</target_attcode>
        </field>
      </fields>
      <presentation>
        <details _delta="redefine">
          <items>
            <item id="team_list">
              <rank>10</rank>
            </item>
            <item id="tickets_list">
              <rank>20</rank>
            </item>
            <item id="cis_list">
              <rank>30</rank>
            </item>
            <item id="col:col1">
              <rank>40</rank>
              <items>
                <item id="fieldset:Person:info">
                  <rank>10</rank>
                  <items>
                    <item id="name">
                      <rank>10</rank>
                    </item>
                    <item id="first_name">
                      <rank>20</rank>
                    </item>
                    <item id="middle_name">
                      <rank>30</rank>
                    </item>
                    <item id="org_id">
                      <rank>40</rank>
                    </item>
                    <item id="status">
                      <rank>50</rank>
                    </item>
                    <item id="location_id">
                      <rank>60</rank>
                    </item>
                     <item id="team_id">
                      <rank>70</rank>
                    </item>                                 
                    <item id="function">
                      <rank>80</rank>
                    </item>
                    <item id="manager_id">
                      <rank>90</rank>
                    </item>
                    <item id="employee_number">
                      <rank>100</rank>
                    </item>
                  </items>
                </item>
              </items>
            </item>
            <item id="col:col2">
              <rank>50</rank>
              <items>
                <item id="fieldset:Person:notifiy">
                  <rank>10</rank>
                  <items>
                    <item id="email">
                      <rank>10</rank>
                    </item>
                    <item id="notify">
                      <rank>20</rank>
                    </item>
                    <item id="phone">
                      <rank>30</rank>
                    </item>
                    <item id="mobile_phone">
                      <rank>40</rank>
                    </item>
                  </items>
                </item>
              </items>
            </item>
          </items>
        </details>
                <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="first_name">
              <rank>20</rank>
            </item>
            <item id="middle_name">
              <rank>30</rank>
            </item>            
            <item id="org_id">
              <rank>40</rank>
            </item>
            <item id="status">
              <rank>50</rank>
            </item>
            <item id="location_id">
              <rank>60</rank>
            </item>
            <item id="email">
              <rank>70</rank>
            </item>
            <item id="phone">
              <rank>80</rank>
            </item>
            <item id="employee_number">
              <rank>90</rank>
            </item>
            <item id="manager_id">
              <rank>100</rank>
            </item>
            <item id="mobile_phone">
              <rank>110</rank>
            </item>
            <item id="notify">
              <rank>120</rank>
            </item>
          </items>
        </search>
      </presentation>
    </class>
  </classes>
</itop_design>

Также я выложил модуль, т.к. мне нужна помощь.
В модуль я впихнул еще поле team_id, кстати я использую “команды” для указания отдела персоны, а для чего на самом деле используются “команды” в itop?

Так вот, поле я добавил, через него я назначаю команду персоне, но при этом мне нужно, чтобы происходила привязка команды к персоне, которой не происходит.

Как видно на скрине:

В team id команда есть, а в team list сверху команды нет, т.е. нужно при назначении поля team_id, делать еще привязку в lnkPersonToTeam, а как это сделать, у кого-нибудь есть идеи?

Этот функционал есть “из коробки”, не пойму, зачем поле? Делаем команду, добавляем участников в редактировании команды, готово!

Как гласит документация, команды в iTop могут использоваться, чтобы связать группу лиц с конкретной конфигурационной единицей, создать “рабочую группу” для назначения тикетов или группу лиц для получения уведомлений.

Про отделы речи нет. Я бы предложит использовать команды для организации кроссфункционального взаимодействия. Например, в вашем IT департаменте есть два отдела: сети и ПО. В каждом отделе есть руководитель, ведущий инженер и специалист. Отделы создаем через иерархическую структуру Организации (что при необходимости позволит разграничить доступ к КЕ), а в командах создаем “1-ю линию”, “2-ю линию” и “Руководство”, куда помещаем соответственно специалистов, ведущих и руководителей отделов. В последствии можно будет легко посчитать, сколько тикетов решили специалисты, а сколько дошло до верхов. Процент тикетов, решенных специалистами той или иной квалификации, является одним из ключевых показателей работы сервисдеска.
Команды используются, когда разные клиенты обслуживаются разными специалистами одних и тех же отделов. Для каждого клиента в iTop определяется модель предоставления услуг, в которой перечисляются команды и персоны, задействованные в предоставлении услуг данному клиенту.

В общем это нужно, т.к. при синхронизации из АД я не могу синхронизировать team list, а подобное поле, как team id, могу.

Ясно, спасибо за разъяснение, что-то не догадался там прочитать.

Вот тут не понял, что Вы имели ввиду…

Насколько я понял указания отдела для сотрудника, в функционале “из коробки”, все же нет.
Тогда, наверное, проще создать в модуле “персона” поле с выпадающим списком и назвать его “Отдел”, как считаете?

Или имеете ввиду, что отдел создается в модуле “организация”? т.е. каждый отдел - это одна организация, а название компании могу отнести к вышестоящей организации. Я правильно понял? это так реализовано в itop?

Я не говорил про отдел. Я говорил про команды. Наличие отдела “из коробки” зачисит от того, что вы понимаете по отделом и как собираетесь его использовать.
Если нужно разграничение доступа к объектам в системе (за сеть одни отвечают, за серверы другие и тд), отражение организационной структуры, создавайте отделы как организации. Это в меню Административных данных → Организации. Делайте отделы доченими по отношению к головной организации и выбирайте их в персонах.
Если нужно одну услугу оказывать одним отделом, другую – другим, делайте отделами команды и распределяйте персоны по командам.
Полагаю, применительно к ad первый вариант предпочтительнее, он проще для синхронизации и логичнее, поскольку не специфические ad функции, связанные с оказанием услуг оставляет целиком внутри iTop.

1 лайк

Ок, спасибо. Понимание теперь есть.

5 сообщений перенесены в новую тему: Отделы в iTop: Команды или Организации?

Добрый день.
Подскажите пожалуйста, мне необходимо добавить отчество для персоны.
Выше в теме я увидел код но куда его вставлять я так и не разобрался.
Я так понял надо делать новый модуль или же редактировать уже имеющийся?
Так же вопрос, в какой директории лежат уже готовые модули?.
С уважением.

Добрый день, @dima_Golovanev. Вот тут есть пошаговая инструкция по добавлению нового поля к Серверу. С Персоной всё аналогично, за исключением типа поля: вместо AttributeText нужно использовать AttributeString. Про типы полей смотри тут: https://wiki.openitop.org/doku.php?id=2_1_0:customization:xml_reference#fields. Весь код пишется в собственном модуле, модуль кладется в папку itop/extensions и устанавливается в iTop через процедуру установки. Это всё рассмотрено в инструкции по первой ссылке.

Да там есть одна засада, привожу кусок кода из config-itop.php в качестве пример как надо сделать.

    'authent-ldap' => array (
	'host' => '<полное имя домен-контроллера в виде name.domain.tld>',
	'port' => 389,
	'default_user' => '<domain\user>', \\ А вот тут - сокращенное имя домена!
	'default_pwd' => '<password>',
	'base_dn' => 'DC=domain,DC=tld',
	'user_query' => '(&(samaccountname=%1$s))', \\ Тут тоже надо убрать лишнее
	'options' => array (
	  17 => 3,
	  8 => 0,
	),
	'start_tls' => false,
	'debug' => false,
),

Вообщем ключевых момента два - использовать в качестве имени пользователя для доступа к LDAP нотацию domainname\username, а не просто username как можно подумать исходя из документации и два - убрать все лишнее из user_query, приведя ее к виду как выше, а не как в примерах.
Ну и указать два домен-контроллера у меня не получилось - если указывать как в документации. через пробел, то ничего не работает.

2 лайка

@Irsi

Не обязательно указывать все контроллеры домена, проще указать имя домена

'host' => 'domain.ru',

тогда DNS случайным образом будет возвращать один из контроллеров домена.

В user_query лучше добавить фильтр по пользователям

'user_query' => '(&(samaccountname=%1$s)(objectCategory=User))',

Вот в таком виде почему-то не работает авторизация.

У Вас пользователь внутри itop создан, как ldap пользователь или как external?

Сквозная то работает нормально, но пользователь у меня создан в itop как external, т.е. для itop пользователь в нашем ad - является внешним.
в default_user я прописал пользователя в виде user@domain

Можно было бы так и оставить, проблема только в том, что при использовании скрипта ad_import для синхронизации из ad, синхронизируются только пользователи, созданные в itop как ldap пользователи, а не как external.

Для авторизации через AD пользователь в ITOP должен быть типа LDAP, тогда все работает отлично.

У меня работает сквозная авторизация через AD только если пользователь external и в настройках соответсвенно стоит:

‘allowed_login_types’ => ‘external|basic|form’

'authent-ldap' => array (
	'host' => 'ad ip',
	'port' => 389,
	'default_user' => 'userxxx@xx.xxx.local',
	'default_pwd' => 'pw',
	'base_dn' => 'dc=xx,dc=xxx,dc=local',
	'user_query' => '(samaccountname=%1$s)',
	'options' => array (
	  17 => 3,
	  8 => 0,
	),
	'start_tls' => false,
	'debug' => true,

тип входа external

Если создать пользователя как ldap пользователя, то сквозная не срабатывает и появляется форма входа, где данные логин и пароль не принимаются.

Если говорите, что оно должно работать для ldap пользователей, то как?

1 лайк