{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "IT science: заметки с тегом ActiveDirectory",
    "_rss_description": "IT science — статьи и инструкции из мира IT",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/itscience.pro\/tags\/activedirectory\/",
    "feed_url": "https:\/\/itscience.pro\/tags\/activedirectory\/json\/",
    "icon": "https:\/\/itscience.pro\/pictures\/userpic\/userpic@2x.jpg?1658757154",
    "authors": [
        {
            "name": "IT science",
            "url": "https:\/\/itscience.pro\/",
            "avatar": "https:\/\/itscience.pro\/pictures\/userpic\/userpic@2x.jpg?1658757154"
        }
    ],
    "items": [
        {
            "id": "18",
            "url": "https:\/\/itscience.pro\/all\/poisk-polzovateley-s-zadannym-parolem-v-domene\/",
            "title": "поиск пользователей с заданным паролем в домене",
            "content_html": "<p>Представьте ситуацию: новые пользователи заводятся в домен автоматически с заранее известным паролем, например password. Т. е. политика сложности пароля позволяет использовать простые пароли, хоть 111111. Смена пароля лежит на совести пользователя, а значит — не меняется. С помощью данного vbs-скрипта можно проверить какие пользователи используют словарные пароли<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">Dim adoCommand, adoConnection, strBase, strFilter, strAttributes \nDim objRootDSE, strDNSDomain, strQuery, adoRecordset \nDim strUser, strPassword, objDomain, objNS \nDim iplus, iall \nDim fso, f1 \nDim WshShell, Path \n\nConst ADS_SECURE_AUTHENTICATION = &amp;H1 \nConst ADS_USE_ENCRYPTION = &amp;H2 \n\nSet fso = CreateObject(&quot;Scripting.FileSystemObject&quot;) \nSet f1 = fso.CreateTextFile(&quot;c:\\testfile.txt&quot;, True) \niplus = 1 \niall = 1 \nSet objNS = GetObject(&quot;LDAP:&quot;) \nstrPassword = InputBox(&quot;Введите пароль для проверки&quot;) \nSet adoCommand = CreateObject(&quot;ADODB.Command&quot;) \nSet adoConnection = CreateObject(&quot;ADODB.Connection&quot;) \nadoConnection.Provider = &quot;ADsDSOObject&quot; \nadoConnection.Open &quot;Active Directory Provider&quot; \nadoCommand.ActiveConnection = adoConnection \n\nSet objRootDSE = GetObject(&quot;LDAP:\/\/RootDSE&quot;) \nstrDNSDomain = objRootDSE.Get(&quot;defaultNamingContext&quot;) \nstrBase = &quot;&lt;LDAP:\/\/&quot; &amp; strDNSDomain &amp; &quot;&gt;&quot; \n\nstrFilter = &quot;(&amp;(objectCategory=person)(objectClass=user))&quot; \nstrAttributes = &quot;sAMAccountName&quot; \nstrQuery = strBase &amp; &quot;;&quot; &amp; strFilter &amp; &quot;;&quot; &amp; strAttributes &amp; &quot;;subtree&quot; \nadoCommand.CommandText = strQuery \nadoCommand.Properties(&quot;Page Size&quot;) = 100 \nadoCommand.Properties(&quot;Timeout&quot;) = 30 \nadoCommand.Properties(&quot;Cache Results&quot;) = False \n\nSet adoRecordset = adoCommand.Execute \nDo Until adoRecordset.EOF \n    strUser = adoRecordset.Fields(&quot;sAMAccountName&quot;).Value \n    On Error Resume Next \n    Set objDomain = objNS.OpenDSObject(&quot;LDAP:\/\/&quot; &amp; strDNSDomain, _ \n        strUser, strPassword, ADS_SECURE_AUTHENTICATION) \n    If (Err.Number = 0) Then \n        On Error GoTo 0 \n   f1.WriteLine(iplus &amp; &quot; User : &quot; &amp; strUser &amp; vbTab &amp; vbTab &amp; &quot; Пароль : &#039;&quot; &amp; strPassword &amp; &quot;&#039;&quot;) \n   iplus = iplus + 1 \n    End If \n    On Error GoTo 0 \n    adoRecordset.MoveNext \n   iall = iall + 1 \nLoop \n\nf1.WriteLine(&quot;Всего проверено &quot; &amp; iall &amp; &quot; пользователей&quot;) \nf1.Close \nadoRecordset.Close \nadoConnection.Close \n\nSet WshShell = WScript.CreateObject(&quot;WScript.Shell&quot;) \nOn Error Resume Next \nPath = &quot;notepad c:\\testfile.txt&quot; \nWshShell.Run Path<\/code><\/pre>",
            "date_published": "2019-07-30T18:28:51+03:00",
            "date_modified": "2019-07-30T18:28:25+03:00",
            "tags": [
                "ActiveDirectory",
                "windows"
            ],
            "_date_published_rfc2822": "Tue, 30 Jul 2019 18:28:51 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "18",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "5",
            "url": "https:\/\/itscience.pro\/all\/ldapsend-poluchaem-sid-v-hex-formate\/",
            "title": "ldapsend, получаем sid в hex формате",
            "content_html": "<p>функция для тех, кто работает с LDAP (ActiveDirectory)<\/p>\n<p>Все знают, что 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<\/p>\n<p>фильтр запроса (&(objectClass=user)(sAMAccountName=’+user_name+’)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) исключает заблокированные учетные записи.<\/p>\n<p>не забудьте подключить модуль ldapsend из библиотеки Synapse <a href=\"http:\/\/synapse.ararat.cz\/doku.php\/\">http:\/\/synapse.ararat.cz\/doku.php\/<\/a><\/p>\n<pre class=\"e2-text-code\"><code class=\"\">function get_bin_sid_by_name(user_name,server,user,password,namingContexts: string): string;\nvar\n  ldap: TLDAPsend;\n  attr: TStringList;\n  s,str:string;\n  l:PAnsiChar;\n  l_l:integer;\nbegin\n  ldap:= TLDAPsend.Create;\n  attr := TStringList.Create;\n  attr.Add(&#039;cn&#039;);\n  attr.Add(&#039;sAMAccountName&#039;);\n  attr.Add(&#039;objectSid&#039;);\n  result:=&#039;&#039;;\n\n  try\n    ldap.TargetHost := server;\n    ldap.TargetPort := &#039;389&#039;;\n    ldap.UserName := user+&#039;@&#039;+copy(namingContexts,4,pos(&#039;,&#039;, namingContexts)-4);\n    ldap.Password := password;\n    ldap.SearchScope:=SS_WholeSubtree;\n    ldap.SearchSizeLimit:=0;\n    ldap.SearchTimeLimit:=0;\n\n\n    if ldap.Login then\n     begin\n       if ldap.Bind then\n        begin\n          if ldap.Search(&#039;CN=users,&#039;+namingContexts, False, &#039;(&amp;(objectClass=user)(sAMAccountName=&#039;+user_name+&#039;)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))&#039;, attr) then\n             begin\n               s:=ldap.SearchResult.Items[0].Attributes.Get(&#039;objectSid&#039;);\n               GetMem(l,length(s));\n               BinToHex((@s[1]),l,length(s));\n               result:=copy(l,1,length(s)*2);\n               str:=&#039;&#039;;\n               for l_l:=0 to length(s)*2 do\n                 begin\n                   if ((l_l mod 2 = 0) and (l_l&lt;&gt;0) and (l_l&lt;&gt;length(s)*2)) then\n                     begin\n                      str:=str+result[l_l]+&#039;,&#039;;\n                     end\n                   else\n                     begin\n                       str:=str+result[l_l];\n                     end;\n                 end;\n               result:=trim(str);\n             end;\n        end;\n     end;\n  finally\n     ldap.Free;\n     attr.Free;\n  end;\nend;<\/code><\/pre><p>user_name — sAMAccountName пользователя, чей sid хотим получить<br \/>\nserver — адрес сервера LDAP<br \/>\nuser — логин для авторизации<br \/>\npassword — пароль пользователя (достаточно прав обычного пользователя домена для чтения атрибутов)<br \/>\nnamingContexts — корень нашего домена, например dc=server,dc=loc<\/p>\n",
            "date_published": "2019-04-08T11:58:04+03:00",
            "date_modified": "2019-04-08T11:57:37+03:00",
            "tags": [
                "ActiveDirectory",
                "free pascal",
                "lazarus",
                "ldapsend"
            ],
            "_date_published_rfc2822": "Mon, 08 Apr 2019 11:58:04 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "5",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "2",
            "url": "https:\/\/itscience.pro\/all\/skript-php-vozvraschaet-sid-polzovatelya-po-samaccountname\/",
            "title": "скрипт php, возвращает SID пользователя по sAMAccountName",
            "content_html": "<p>Очередная часть глобального проекта по смене домена в корпорации, по сути переезд из домена ActiveDirectory в домен Samba4.<\/p>\n<p>Сегодня мы публикуем вспомогательный скрипт, который возвращает SID пользователя используя sAMAccountName. Написан скрипт на php, состоит из двух частей — конфига и самого скрипта. Нам потребуются эти данные для миграции профилей пользователей на локальных машинах., но не будем забегать вперед.<\/p>\n<p>конфиг вынесен в отдельный файл, т. к. будет использоваться в других утилитах<\/p>\n<p><b>config.php<\/b><\/p>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;?php\n  define(&#039;SOURCE_AD_SERVER&#039;, &#039;old_domain.loc&#039;);\n  define(&#039;SOURCE_AD_USER&#039;, &#039;user_name&#039;);\n  define(&#039;SOURCE_AD_PASSWORD&#039;, &#039;secret_password&#039;);\n  \n  define(&#039;TARGET_AD_SERVER&#039;, &#039;new_domain.loc&#039;);\n  define(&#039;TARGET_AD_USER&#039;, &#039;user_name&#039;);\n  define(&#039;TARGET_AD_PASSWORD&#039;, &#039;secret_password&#039;);\n?&gt;<\/code><\/pre><p>настроек минимум, указаны старый и новый домен, логины и пароли пользователей у которых есть права читать LDAP атрибуты, по сути рядовые пользователи домена.<\/p>\n<p>Мы будем подключаться к корню одного или другого домена, поэтому озаботьтесь, чтобы ваш DNS разрешал оба домена, т. е. ’old_domain.loc’ и ’new_domain.loc’ должны одновременно пинговаться на нашем сервере.<\/p>\n<p><b>get_data.php<\/b><\/p>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;?php\n\ninclude(&quot;config.php&quot;);\n\nfunction SIDtoString($ADsid)\n{\n   $sid = &quot;S-&quot;;\n   \/\/$ADguid = $info[0][&#039;objectguid&#039;][0];\n   $sidinhex = str_split(bin2hex($ADsid), 2);\n   \/\/ Byte 0 = Revision Level\n   $sid = $sid.hexdec($sidinhex[0]).&quot;-&quot;;\n   \/\/ Byte 1-7 = 48 Bit Authority\n   $sid = $sid.hexdec($sidinhex[6].$sidinhex[5].$sidinhex[4].$sidinhex[3].$sidinhex[2].$sidinhex[1]);\n   \/\/ Byte 8 count of sub authorities - Get number of sub-authorities\n   $subauths = hexdec($sidinhex[7]);\n   \/\/Loop through Sub Authorities\n   for($i = 0; $i &lt; $subauths; $i++) {\n      $start = 8 + (4 * $i);\n      \/\/ X amount of 32Bit (4 Byte) Sub Authorities\n      $sid = $sid.&quot;-&quot;.hexdec($sidinhex[$start+3].$sidinhex[$start+2].$sidinhex[$start+1].$sidinhex[$start]);\n   }\n   return $sid;\n}\n\nif ((($_REQUEST[&#039;action&#039;] == &#039;get_sid&#039;) or ($_REQUEST[&#039;action&#039;] == &#039;get_bin_sid&#039;)) and ($_REQUEST[&#039;domain&#039;] != &#039;&#039;) and ($_REQUEST[&#039;samaccountname&#039;] != &#039;&#039;))\n{\n    if ($_REQUEST[&#039;domain&#039;] == &#039;new&#039;) {\n        $ldap_server = TARGET_AD_SERVER;\n        $ldap_user = TARGET_AD_USER;\n        $ldap_password = TARGET_AD_PASSWORD;\n    } elseif ($_REQUEST[&#039;domain&#039;] == &#039;old&#039;) {\n        $ldap_server = SOURCE_AD_SERVER;\n        $ldap_user = SOURCE_AD_USER;\n        $ldap_password = SOURCE_AD_PASSWORD;\n    }\n    $ldapconn = ldap_connect($ldap_server) or die(&quot;Could not connect to LDAP server.&quot;); \n    if($ldapconn) {\n        ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3) or die (&quot;Could not set ldap protocol&quot;);\n        ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); \n        ldap_set_option($ldapconn, LDAP_OPT_SIZELIMIT, 10000);\n        $source_ldapbind = ldap_bind($ldapconn, $ldap_user.&quot;@&quot;.$ldap_server, $ldap_password) or die (&quot;Error trying to bind: &quot;.ldap_error($ldapconn));\n        \n        $tree_pieces = explode(&quot;.&quot;, $ldap_server);\n        $ldaptree = &quot;DC=&quot;.$tree_pieces[0].&quot;,DC=&quot;.$tree_pieces[1];\n      \n        $attributes = array(&quot;cn&quot;, &quot;samaccountname&quot;, &quot;objectsid&quot;);\n       \n        $query = &quot;(samaccountname=&quot;.$_REQUEST[&#039;samaccountname&#039;].&quot;)&quot;;\n        \n        $result = ldap_search($ldapconn,$ldaptree, $query, $attributes) or die (&quot;Error in search query: &quot;.ldap_error($ldapconn));\n\t     $data = ldap_get_entries($ldapconn, $result);\n        \n        for ($i=0; $i&lt;$data[&quot;count&quot;]; $i++) {\n           if ($_REQUEST[&#039;action&#039;] == &#039;get_sid&#039;) {\n            echo SIDtoString($data[$i][&quot;objectsid&quot;][0]);\n            \/\/echo $i.&#039;. - &#039;.$data[$i][&quot;cn&quot;][0].&quot;&lt;\/br&gt;&quot;;\n           }\n           elseif ($_REQUEST[&#039;action&#039;] == &#039;get_bin_sid&#039;) {\n            echo wordwrap(bin2hex($data[$i][&quot;objectsid&quot;][0]), 2, &#039;,&#039;, true);\n           }\n        }\n\n        ldap_close($ldapconn);\n    }\n} else {\n    echo &#039;off&#039;;\n}\n?&gt;<\/code><\/pre><p>функция SIDtoString заимствована из интернета, остальное критикуйте =)<\/p>\n<p>работает следующим образом:<\/p>\n<blockquote>\n<p><a href=\"http:\/\/ip_server\/get_data.php?action=get_sid&domain=new&samaccountname=user_login\">http:\/\/ip_server\/get_data.php?action=get_sid&domain=new&samaccountname=user_login<\/a><\/p>\n<\/blockquote>\n<p>возвращает SID в виде строки, параметр «domain» может принимать значения «new» и «old»<\/p>\n<blockquote>\n<p>S-1-5-21-2225672442-1781935378-3171287829-1104<\/p>\n<\/blockquote>\n<blockquote>\n<p><a href=\"http:\/\/ip_server\/get_data.php?action=get_bin_sid&domain=new&samaccountname=user_login\">http:\/\/ip_server\/get_data.php?action=get_bin_sid&domain=new&samaccountname=user_login<\/a><\/p>\n<\/blockquote>\n<p>возвращает SID в виде hex строки (потребуется для добавления в реестр)<\/p>\n<blockquote>\n<p>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<\/p>\n<\/blockquote>\n",
            "date_published": "2019-04-03T11:28:13+03:00",
            "date_modified": "2019-04-03T11:39:06+03:00",
            "tags": [
                "ActiveDirectory",
                "hex",
                "ldap",
                "php",
                "sid"
            ],
            "_date_published_rfc2822": "Wed, 03 Apr 2019 11:28:13 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4171,
    "_e2_ua_string": "Aegea 11.4 (v4171)"
}