<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>IT science: заметки с тегом ldap</title>
<link>https://itscience.pro/tags/ldap/</link>
<description>IT science — статьи и инструкции из мира IT</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.4 (v4171)</generator>

<itunes:subtitle>IT science — статьи и инструкции из мира IT</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>скрипт php, возвращает SID пользователя по sAMAccountName</title>
<guid isPermaLink="false">2</guid>
<link>https://itscience.pro/all/skript-php-vozvraschaet-sid-polzovatelya-po-samaccountname/</link>
<pubDate>Wed, 03 Apr 2019 11:28:13 +0300</pubDate>
<author></author>
<comments>https://itscience.pro/all/skript-php-vozvraschaet-sid-polzovatelya-po-samaccountname/</comments>
<description>
&lt;p&gt;Очередная часть глобального проекта по смене домена в корпорации, по сути переезд из домена ActiveDirectory в домен Samba4.&lt;/p&gt;
&lt;p&gt;Сегодня мы публикуем вспомогательный скрипт, который возвращает SID пользователя используя sAMAccountName. Написан скрипт на php, состоит из двух частей — конфига и самого скрипта. Нам потребуются эти данные для миграции профилей пользователей на локальных машинах., но не будем забегать вперед.&lt;/p&gt;
&lt;p&gt;конфиг вынесен в отдельный файл, т. к. будет использоваться в других утилитах&lt;/p&gt;
&lt;p&gt;&lt;b&gt;config.php&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;?php
  define(&amp;#039;SOURCE_AD_SERVER&amp;#039;, &amp;#039;old_domain.loc&amp;#039;);
  define(&amp;#039;SOURCE_AD_USER&amp;#039;, &amp;#039;user_name&amp;#039;);
  define(&amp;#039;SOURCE_AD_PASSWORD&amp;#039;, &amp;#039;secret_password&amp;#039;);
  
  define(&amp;#039;TARGET_AD_SERVER&amp;#039;, &amp;#039;new_domain.loc&amp;#039;);
  define(&amp;#039;TARGET_AD_USER&amp;#039;, &amp;#039;user_name&amp;#039;);
  define(&amp;#039;TARGET_AD_PASSWORD&amp;#039;, &amp;#039;secret_password&amp;#039;);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;настроек минимум, указаны старый и новый домен, логины и пароли пользователей у которых есть права читать LDAP атрибуты, по сути рядовые пользователи домена.&lt;/p&gt;
&lt;p&gt;Мы будем подключаться к корню одного или другого домена, поэтому озаботьтесь, чтобы ваш DNS разрешал оба домена, т. е. ’old_domain.loc’ и ’new_domain.loc’ должны одновременно пинговаться на нашем сервере.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;get_data.php&lt;/b&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;?php

include(&amp;quot;config.php&amp;quot;);

function SIDtoString($ADsid)
{
   $sid = &amp;quot;S-&amp;quot;;
   //$ADguid = $info[0][&amp;#039;objectguid&amp;#039;][0];
   $sidinhex = str_split(bin2hex($ADsid), 2);
   // Byte 0 = Revision Level
   $sid = $sid.hexdec($sidinhex[0]).&amp;quot;-&amp;quot;;
   // Byte 1-7 = 48 Bit Authority
   $sid = $sid.hexdec($sidinhex[6].$sidinhex[5].$sidinhex[4].$sidinhex[3].$sidinhex[2].$sidinhex[1]);
   // Byte 8 count of sub authorities - Get number of sub-authorities
   $subauths = hexdec($sidinhex[7]);
   //Loop through Sub Authorities
   for($i = 0; $i &amp;lt; $subauths; $i++) {
      $start = 8 + (4 * $i);
      // X amount of 32Bit (4 Byte) Sub Authorities
      $sid = $sid.&amp;quot;-&amp;quot;.hexdec($sidinhex[$start+3].$sidinhex[$start+2].$sidinhex[$start+1].$sidinhex[$start]);
   }
   return $sid;
}

if ((($_REQUEST[&amp;#039;action&amp;#039;] == &amp;#039;get_sid&amp;#039;) or ($_REQUEST[&amp;#039;action&amp;#039;] == &amp;#039;get_bin_sid&amp;#039;)) and ($_REQUEST[&amp;#039;domain&amp;#039;] != &amp;#039;&amp;#039;) and ($_REQUEST[&amp;#039;samaccountname&amp;#039;] != &amp;#039;&amp;#039;))
{
    if ($_REQUEST[&amp;#039;domain&amp;#039;] == &amp;#039;new&amp;#039;) {
        $ldap_server = TARGET_AD_SERVER;
        $ldap_user = TARGET_AD_USER;
        $ldap_password = TARGET_AD_PASSWORD;
    } elseif ($_REQUEST[&amp;#039;domain&amp;#039;] == &amp;#039;old&amp;#039;) {
        $ldap_server = SOURCE_AD_SERVER;
        $ldap_user = SOURCE_AD_USER;
        $ldap_password = SOURCE_AD_PASSWORD;
    }
    $ldapconn = ldap_connect($ldap_server) or die(&amp;quot;Could not connect to LDAP server.&amp;quot;); 
    if($ldapconn) {
        ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3) or die (&amp;quot;Could not set ldap protocol&amp;quot;);
        ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); 
        ldap_set_option($ldapconn, LDAP_OPT_SIZELIMIT, 10000);
        $source_ldapbind = ldap_bind($ldapconn, $ldap_user.&amp;quot;@&amp;quot;.$ldap_server, $ldap_password) or die (&amp;quot;Error trying to bind: &amp;quot;.ldap_error($ldapconn));
        
        $tree_pieces = explode(&amp;quot;.&amp;quot;, $ldap_server);
        $ldaptree = &amp;quot;DC=&amp;quot;.$tree_pieces[0].&amp;quot;,DC=&amp;quot;.$tree_pieces[1];
      
        $attributes = array(&amp;quot;cn&amp;quot;, &amp;quot;samaccountname&amp;quot;, &amp;quot;objectsid&amp;quot;);
       
        $query = &amp;quot;(samaccountname=&amp;quot;.$_REQUEST[&amp;#039;samaccountname&amp;#039;].&amp;quot;)&amp;quot;;
        
        $result = ldap_search($ldapconn,$ldaptree, $query, $attributes) or die (&amp;quot;Error in search query: &amp;quot;.ldap_error($ldapconn));
     $data = ldap_get_entries($ldapconn, $result);
        
        for ($i=0; $i&amp;lt;$data[&amp;quot;count&amp;quot;]; $i++) {
           if ($_REQUEST[&amp;#039;action&amp;#039;] == &amp;#039;get_sid&amp;#039;) {
            echo SIDtoString($data[$i][&amp;quot;objectsid&amp;quot;][0]);
            //echo $i.&amp;#039;. - &amp;#039;.$data[$i][&amp;quot;cn&amp;quot;][0].&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;
           }
           elseif ($_REQUEST[&amp;#039;action&amp;#039;] == &amp;#039;get_bin_sid&amp;#039;) {
            echo wordwrap(bin2hex($data[$i][&amp;quot;objectsid&amp;quot;][0]), 2, &amp;#039;,&amp;#039;, true);
           }
        }

        ldap_close($ldapconn);
    }
} else {
    echo &amp;#039;off&amp;#039;;
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;функция SIDtoString заимствована из интернета, остальное критикуйте =)&lt;/p&gt;
&lt;p&gt;работает следующим образом:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://ip_server/get_data.php?action=get_sid&amp;domain=new&amp;samaccountname=user_login"&gt;http://ip_server/get_data.php?action=get_sid&amp;domain=new&amp;samaccountname=user_login&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;возвращает SID в виде строки, параметр «domain» может принимать значения «new» и «old»&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;S-1-5-21-2225672442-1781935378-3171287829-1104&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://ip_server/get_data.php?action=get_bin_sid&amp;domain=new&amp;samaccountname=user_login"&gt;http://ip_server/get_data.php?action=get_bin_sid&amp;domain=new&amp;samaccountname=user_login&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;возвращает SID в виде hex строки (потребуется для добавления в реестр)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;01,05,00,00,00,00,00,05,15,00,00,00,f6,4b,a9,84,8e,0d,2f,6a,25,71,0f,bd,a2,04,00,00&lt;/p&gt;
&lt;/blockquote&gt;
</description>
</item>


</channel>
</rss>