<?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: заметки с тегом ActiveDirectory</title>
<link>https://itscience.pro/tags/activedirectory/</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>поиск пользователей с заданным паролем в домене</title>
<guid isPermaLink="false">18</guid>
<link>https://itscience.pro/all/poisk-polzovateley-s-zadannym-parolem-v-domene/</link>
<pubDate>Tue, 30 Jul 2019 18:28:51 +0300</pubDate>
<author></author>
<comments>https://itscience.pro/all/poisk-polzovateley-s-zadannym-parolem-v-domene/</comments>
<description>
&lt;p&gt;Представьте ситуацию: новые пользователи заводятся в домен автоматически с заранее известным паролем, например password. Т. е. политика сложности пароля позволяет использовать простые пароли, хоть 111111. Смена пароля лежит на совести пользователя, а значит — не меняется. С помощью данного vbs-скрипта можно проверить какие пользователи используют словарные пароли&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Dim adoCommand, adoConnection, strBase, strFilter, strAttributes 
Dim objRootDSE, strDNSDomain, strQuery, adoRecordset 
Dim strUser, strPassword, objDomain, objNS 
Dim iplus, iall 
Dim fso, f1 
Dim WshShell, Path 

Const ADS_SECURE_AUTHENTICATION = &amp;amp;H1 
Const ADS_USE_ENCRYPTION = &amp;amp;H2 

Set fso = CreateObject(&amp;quot;Scripting.FileSystemObject&amp;quot;) 
Set f1 = fso.CreateTextFile(&amp;quot;c:\testfile.txt&amp;quot;, True) 
iplus = 1 
iall = 1 
Set objNS = GetObject(&amp;quot;LDAP:&amp;quot;) 
strPassword = InputBox(&amp;quot;Введите пароль для проверки&amp;quot;) 
Set adoCommand = CreateObject(&amp;quot;ADODB.Command&amp;quot;) 
Set adoConnection = CreateObject(&amp;quot;ADODB.Connection&amp;quot;) 
adoConnection.Provider = &amp;quot;ADsDSOObject&amp;quot; 
adoConnection.Open &amp;quot;Active Directory Provider&amp;quot; 
adoCommand.ActiveConnection = adoConnection 

Set objRootDSE = GetObject(&amp;quot;LDAP://RootDSE&amp;quot;) 
strDNSDomain = objRootDSE.Get(&amp;quot;defaultNamingContext&amp;quot;) 
strBase = &amp;quot;&amp;lt;LDAP://&amp;quot; &amp;amp; strDNSDomain &amp;amp; &amp;quot;&amp;gt;&amp;quot; 

strFilter = &amp;quot;(&amp;amp;(objectCategory=person)(objectClass=user))&amp;quot; 
strAttributes = &amp;quot;sAMAccountName&amp;quot; 
strQuery = strBase &amp;amp; &amp;quot;;&amp;quot; &amp;amp; strFilter &amp;amp; &amp;quot;;&amp;quot; &amp;amp; strAttributes &amp;amp; &amp;quot;;subtree&amp;quot; 
adoCommand.CommandText = strQuery 
adoCommand.Properties(&amp;quot;Page Size&amp;quot;) = 100 
adoCommand.Properties(&amp;quot;Timeout&amp;quot;) = 30 
adoCommand.Properties(&amp;quot;Cache Results&amp;quot;) = False 

Set adoRecordset = adoCommand.Execute 
Do Until adoRecordset.EOF 
    strUser = adoRecordset.Fields(&amp;quot;sAMAccountName&amp;quot;).Value 
    On Error Resume Next 
    Set objDomain = objNS.OpenDSObject(&amp;quot;LDAP://&amp;quot; &amp;amp; strDNSDomain, _ 
        strUser, strPassword, ADS_SECURE_AUTHENTICATION) 
    If (Err.Number = 0) Then 
        On Error GoTo 0 
   f1.WriteLine(iplus &amp;amp; &amp;quot; User : &amp;quot; &amp;amp; strUser &amp;amp; vbTab &amp;amp; vbTab &amp;amp; &amp;quot; Пароль : &amp;#039;&amp;quot; &amp;amp; strPassword &amp;amp; &amp;quot;&amp;#039;&amp;quot;) 
   iplus = iplus + 1 
    End If 
    On Error GoTo 0 
    adoRecordset.MoveNext 
   iall = iall + 1 
Loop 

f1.WriteLine(&amp;quot;Всего проверено &amp;quot; &amp;amp; iall &amp;amp; &amp;quot; пользователей&amp;quot;) 
f1.Close 
adoRecordset.Close 
adoConnection.Close 

Set WshShell = WScript.CreateObject(&amp;quot;WScript.Shell&amp;quot;) 
On Error Resume Next 
Path = &amp;quot;notepad c:\testfile.txt&amp;quot; 
WshShell.Run Path&lt;/code&gt;&lt;/pre&gt;</description>
</item>

<item>
<title>ldapsend, получаем sid в hex формате</title>
<guid isPermaLink="false">5</guid>
<link>https://itscience.pro/all/ldapsend-poluchaem-sid-v-hex-formate/</link>
<pubDate>Mon, 08 Apr 2019 11:58:04 +0300</pubDate>
<author></author>
<comments>https://itscience.pro/all/ldapsend-poluchaem-sid-v-hex-formate/</comments>
<description>
&lt;p&gt;функция для тех, кто работает с LDAP (ActiveDirectory)&lt;/p&gt;
&lt;p&gt;Все знают, что sid LDAP возвращает в формате bin, сконвертируем в hex строку. Функция делает запрос к серверу и получает objectSid пользователя по sAMAccountName, затем конвертирует его в строку hex с разделителями запятыми. Результатом работы функции будет строка: 01,05,00,00,00,00,00,05,15,00,00,00,8a,1c,a9,8e,20,29,32,58,4f,d1,a7,56,50,04,00,00&lt;/p&gt;
&lt;p&gt;фильтр запроса (&amp;(objectClass=user)(sAMAccountName=’+user_name+’)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) исключает заблокированные учетные записи.&lt;/p&gt;
&lt;p&gt;не забудьте подключить модуль ldapsend из библиотеки Synapse &lt;a href="http://synapse.ararat.cz/doku.php/"&gt;http://synapse.ararat.cz/doku.php/&lt;/a&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;function get_bin_sid_by_name(user_name,server,user,password,namingContexts: string): string;
var
  ldap: TLDAPsend;
  attr: TStringList;
  s,str:string;
  l:PAnsiChar;
  l_l:integer;
begin
  ldap:= TLDAPsend.Create;
  attr := TStringList.Create;
  attr.Add(&amp;#039;cn&amp;#039;);
  attr.Add(&amp;#039;sAMAccountName&amp;#039;);
  attr.Add(&amp;#039;objectSid&amp;#039;);
  result:=&amp;#039;&amp;#039;;

  try
    ldap.TargetHost := server;
    ldap.TargetPort := &amp;#039;389&amp;#039;;
    ldap.UserName := user+&amp;#039;@&amp;#039;+copy(namingContexts,4,pos(&amp;#039;,&amp;#039;, namingContexts)-4);
    ldap.Password := password;
    ldap.SearchScope:=SS_WholeSubtree;
    ldap.SearchSizeLimit:=0;
    ldap.SearchTimeLimit:=0;


    if ldap.Login then
     begin
       if ldap.Bind then
        begin
          if ldap.Search(&amp;#039;CN=users,&amp;#039;+namingContexts, False, &amp;#039;(&amp;amp;(objectClass=user)(sAMAccountName=&amp;#039;+user_name+&amp;#039;)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))&amp;#039;, attr) then
             begin
               s:=ldap.SearchResult.Items[0].Attributes.Get(&amp;#039;objectSid&amp;#039;);
               GetMem(l,length(s));
               BinToHex((@s[1]),l,length(s));
               result:=copy(l,1,length(s)*2);
               str:=&amp;#039;&amp;#039;;
               for l_l:=0 to length(s)*2 do
                 begin
                   if ((l_l mod 2 = 0) and (l_l&amp;lt;&amp;gt;0) and (l_l&amp;lt;&amp;gt;length(s)*2)) then
                     begin
                      str:=str+result[l_l]+&amp;#039;,&amp;#039;;
                     end
                   else
                     begin
                       str:=str+result[l_l];
                     end;
                 end;
               result:=trim(str);
             end;
        end;
     end;
  finally
     ldap.Free;
     attr.Free;
  end;
end;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;user_name — sAMAccountName пользователя, чей sid хотим получить&lt;br /&gt;
server — адрес сервера LDAP&lt;br /&gt;
user — логин для авторизации&lt;br /&gt;
password — пароль пользователя (достаточно прав обычного пользователя домена для чтения атрибутов)&lt;br /&gt;
namingContexts — корень нашего домена, например dc=server,dc=loc&lt;/p&gt;
</description>
</item>

<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>