скрипт 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