Позднее Ctrl + ↑

скрипт php, возвращает SID пользователя по sAMAccountName

Очередная часть глобального проекта по смене домена в корпорации, по сути переезд из домена ActiveDirectory в домен Samba4.

Сегодня мы публикуем вспомогательный скрипт, который возвращает SID пользователя используя sAMAccountName. Написан скрипт на php, состоит из двух частей — конфига и самого скрипта. Нам потребуются эти данные для миграции профилей пользователей на локальных машинах., но не будем забегать вперед.

конфиг вынесен в отдельный файл, т. к. будет использоваться в других утилитах

config.php

<?php
  define('SOURCE_AD_SERVER', 'old_domain.loc');
  define('SOURCE_AD_USER', 'user_name');
  define('SOURCE_AD_PASSWORD', 'secret_password');
  
  define('TARGET_AD_SERVER', 'new_domain.loc');
  define('TARGET_AD_USER', 'user_name');
  define('TARGET_AD_PASSWORD', 'secret_password');
?>

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

Мы будем подключаться к корню одного или другого домена, поэтому озаботьтесь, чтобы ваш DNS разрешал оба домена, т. е. ’old_domain.loc’ и ’new_domain.loc’ должны одновременно пинговаться на нашем сервере.

get_data.php

<?php

include("config.php");

function SIDtoString($ADsid)
{
   $sid = "S-";
   //$ADguid = $info[0]['objectguid'][0];
   $sidinhex = str_split(bin2hex($ADsid), 2);
   // Byte 0 = Revision Level
   $sid = $sid.hexdec($sidinhex[0])."-";
   // 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 < $subauths; $i++) {
      $start = 8 + (4 * $i);
      // X amount of 32Bit (4 Byte) Sub Authorities
      $sid = $sid."-".hexdec($sidinhex[$start+3].$sidinhex[$start+2].$sidinhex[$start+1].$sidinhex[$start]);
   }
   return $sid;
}

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

        ldap_close($ldapconn);
    }
} else {
    echo 'off';
}
?>

функция SIDtoString заимствована из интернета, остальное критикуйте =)

работает следующим образом:

http://ip_server/get_data.php?action=get_sid&domain=new&samaccountname=user_login

возвращает SID в виде строки, параметр «domain» может принимать значения «new» и «old»

S-1-5-21-2225672442-1781935378-3171287829-1104

http://ip_server/get_data.php?action=get_bin_sid&domain=new&samaccountname=user_login

возвращает SID в виде hex строки (потребуется для добавления в реестр)

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