{"id":258183,"date":"2015-05-28T19:29:02","date_gmt":"2015-05-28T15:29:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=258183"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=258183","title":{"rendered":"Samba4 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Python Scripting Interface"},"content":{"rendered":"<p>             Samba4 \u0438\u043c\u0435\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430 Python. \u041c\u043d\u043e\u0433\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (samba-tool, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043d\u0430 Python \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>  \u0412\u0441\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u043e\u0441\u044c \u0438\u0437 LDAP-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 Samba 4 Python Scripting. \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u2014 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0438\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 LDAP. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0445\u044d\u0448 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0438 \u043f\u0435\u0440\u0435\u043a\u0438\u043d\u0443\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0443\u044e. \u0414\u0430 \u0438 \u0441\u0430\u043c\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441 \u0438\u0445 SID\u0430\u043c\u0438, \u043f\u0430\u0440\u043e\u043b\u044f\u043c\u0438 \u0438 \u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0447\u0438\u043c \u043f\u0435\u0440\u0435\u043a\u0438\u043d\u0443\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u043e\u043c\u0435\u043d (\u0431\u0435\u0437 \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0435\u043a \u0441 SID-history).<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u0430\u043b\u043e\u0432\u0430\u0442\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 <i>&lt;samba-source&gt;\/python\/samba<\/i>, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u0438\u043d\u0430\u0447\u0435 \u0433\u0434\u0435-\u0442\u043e \u0432 <i>\/usr\/lib\/python2.7\/dist-packages\/samba<\/i>.<\/p>\n<p>  \u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0430\u0439\u043b samdb.py \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 AD.<\/p>\n<p>  \u041f\u0443\u0441\u0442\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0443\u044e Samba4 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 AD domain controller. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0431\u0430\u0437\u0435 AD \u0438\u0437 Python-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python # -*- coding: utf-8 -*- import ldb from samba.samdb import SamDB from samba.auth import system_session from samba.ndr import ndr_pack, ndr_unpack from samba.dcerpc import security import samba.param import base64 import binascii <\/code><\/pre>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \/sam.ldb:<\/p>\n<pre><code class=\"python\">lp = samba.param.LoadParm() lp.load(samba.param.default_path()) #\u0438\u043b\u0438 lp.load(&quot;\/etc\/samba\/smb.conf&quot;) sam = SamDB(lp=lp,session_info=system_session()) <\/code><\/pre>\n<p>  (\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0438 Samba4 \u0438 \u0434\u0430\u0436\u0435 \u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435. \u041e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435.)<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u044a\u0435\u043a\u0442 sam \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0431\u0430\u0437\u044b AD \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c LDAP.<br \/>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0431\u0430\u0437\u0435 (base \u2014 \u0443\u0437\u0435\u043b \u0434\u0435\u0440\u0435\u0432\u0430 LDAP \u0442\u0438\u043f\u0430 \u00abCN=Users,DC=myDom,DC=lan\u00bb, expression \u2014 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043e\u0442\u0431\u043e\u0440\u0430, attrs \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432):<\/p>\n<pre><code class=\"python\">res = sam.search(base=base, expression=expression, attrs=[*])<\/code><\/pre>\n<p>  \u041f\u0443\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043b\u0435\u0436\u0430\u0442 \u0432 \u041e\u0423:<\/p>\n<pre><code class=\"python\">base = &quot;OU=myUsers,DC=myDom,DC=lan&quot; # \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u041e\u0423 \u0438 \u0442\u043e\u0433\u0434\u0430 base = &quot;CN=Users,DC=myDom,DC=lan&quot;<\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u00abtst\u00bb c \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u00absecret\u00bb. \u041a\u043b\u0430\u0441\u0441 SamDB \u0438\u043c\u0435\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u2014 newuser(), \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438 \u0442\u0430\u043a: <\/p>\n<pre><code class=\"python\">newUsr = &quot;tst&quot; usrPass = &quot;secret&quot;  ld = {'dn': 'CN=%s,%s' % (newUsr,base),     &quot;sAMAccountName&quot;: newUsr,     &quot;userPrincipalName&quot;: &quot;%s@%s&quot; % (newUsr,&quot;myDom.lan&quot;),     &quot;objectClass&quot;: &quot;user&quot;,     &quot;displayName&quot;: newUsr,     &quot;description&quot;: newUsr,     &quot;homeDirectory&quot;: r&quot;\\\\%s\\users\\%s&quot; % (&quot;myHost&quot;,newUsr),     'scriptPath': &quot;loginScr.cmd&quot;,     } sam.transaction_start() try:\t     sam.add(ld)\t     sam.setpassword(&quot;(samAccountName=%s)&quot; % ldb.binary_encode(newUsr), usrPass, False) except:\t     sam.transaction_cancel()\t     print '!!!error'\t else:\t     sam.transaction_commit()\t <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, SamDB \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.<\/p>\n<p>  \u0412\u0441\u044e \u0431\u0430\u0437\u0443 AD, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c (\u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c) \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"bash\">:~# ldbedit  -e nano -H \/var\/lib\/samba\/private\/sam.ldb<\/code><\/pre>\n<p>  \u041d\u043e \u043b\u0443\u0447\u0448\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0446\u0438\u0438 -s \u0438\u043b\u0438 -b (\u0431\u0430\u0437\u0430), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <i>-b &#8216;CN=RID Manager$,CN=System,DC=myDom,DC=com&#8217;<\/i>.<\/p>\n<p>  \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0445\u0435\u0448\u0435\u0439 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0435:<\/p>\n<p>  \u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0440\u0430\u044f \u0431\u0430\u0437\u0430 AD \u2014 \u0442\u043e\u0436\u0435 \u043d\u0430 Samba4. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u0431\u0430\u0437\u044b \u0438\u0437 Win AD, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432 \u043d\u043e\u0432\u0443\u044e \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u044e Samba4 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e AD DC \u2014 \u0445\u043e\u0440\u043e\u0448\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u2014 \u0441\u043c. <a href=\"https:\/\/wiki.samba.org\/index.php\/Join_a_domain_as_a_DC\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043a \u043d\u0435\u0439 \u2014 \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 sam0. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438 (\u043f\u0443\u0441\u0442\u044c  \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \/tmp\/priv \u0438 \u0442\u0430\u043c \u0436\u0435 \u0435\u0433\u043e smb.conf):<\/p>\n<pre><code class=\"python\">lp0 = samba.param.LoadParm() lp0.load('\/tmp\/priv\/smb.conf')  lp0.set('private directory','\/tmp\/priv') sam0 = SamDB(lp=lp0,session_info=system_session()) <\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0434\u0430 \u0435\u0449\u0435 \u0441 \u043f\u0430\u0440\u043e\u043b\u044f\u043c\u0438, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"python\">res = sam0.search(base=&quot;DC=oldDom,DC=myDom,DC=ru&quot;,expression=&quot;(&(objectCategory=person)(objectClass=user))&quot;, attrs=['*','unicodePwd'])<\/code><\/pre>\n<p>  \u0411\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u0430\u0437\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0432 \u043d\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443. \u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">for r in res:     dn = str(r.dn)# \u044d\u0442\u043e \u0441\u0442\u0430\u0440\u044b\u0439 DN \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0442\u0432. \u043d\u043e\u0432\u043e\u043c\u0443 \u0434\u043e\u043c\u0435\u043d\u0443! \t------- \tsd = ndr_unpack(security.dom_sid,r['objectSid'][0])# \u044d\u0442\u043e SID \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043c\u043e\u0436\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0435\u0436\u043d\u0438\u043c     (dom_sid, rid) = sd.split()# \u0442\u0430\u043a SID \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 SID \u0434\u043e\u043c\u0435\u043d\u0430 \u0438 RID \t------- \t#.... \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043d\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443 - sam.add(ld).  (\u0420\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 - \u043d\u0438\u0436\u0435) \t#\u0442\u0435\u043f\u0435\u0440\u044c \u0442\u0440\u044e\u043a \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u043f\u0430\u0440\u043e\u043b\u044f: \t \tsetpw = &quot;&quot;&quot; dn: %s changetype: modify replace: unicodePwd unicodePwd:: %s &quot;&quot;&quot; % (dn, base64.b64encode(str(r['unicodePwd']))) \tsam.transaction_start() \ttry: \t\tsam.modify_ldif(setpw,[&quot;local_oid:1.3.6.1.4.1.7165.4.3.12:0&quot;]) \texcept: \t\tsam.transaction_cancel() \t\tprint( '!!! ERROR SET PASSWORD USER : %s' % r['sAMAccountName']) \telse: \t\tsam.transaction_commit() <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 \u0434\u043e\u043c\u0435\u043d\u0430 \u043f\u043e\u0434 Win 2003 \u0432 Samba4. <\/p>\n<p>  \u0412 \u0441\u0442\u0430\u0440\u043e\u043c \u0434\u043e\u043c\u0435\u043d\u0435 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u0438\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b (\u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0434\u0430\u0436\u0435 \u0441 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0434\u043e\u043c\u0435\u043d\u0430). \u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0441 DC \u043d\u0430 Samba4 (\u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u2014 Samba4 DC -&gt; W2003 DC) \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0437\u0430\u0432\u0435\u043b\u0430\u0441\u044c, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0438\u0437-\u0437\u0430 \u0432\u043d\u0443\u0442\u0440\u0438\u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. <br \/>  \u0417\u0430\u0434\u0430\u0447\u0430 \u043e\u0442\u044f\u0433\u043e\u0449\u0430\u043b\u0430\u0441\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435\u043c \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 Samba3, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043c\u0430\u043f\u0438\u043d\u0433 sAMAccountName &lt;-&gt; (UID,GID), \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432 Samba3 (\u043e\u0431\u044b\u0447\u043d\u043e <i>\/var\/lib\/samba\/winbindd_idmap.tdb<\/i>). \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u044b\u043b\u0430 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e <a href=\"http:\/\/habrahabr.ru\/post\/216173\/\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  \u0412\u0441\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u0435\u043b\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 Ubuntu 14.04, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445 OpenVZ (CentOS 6)<br \/>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Samba4 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e, <a href=\"http:\/\/habrahabr.ru\/post\/216173\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0414\u043b\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f Unix ID \u0432 \u0441\u0445\u0435\u043c\u0435 \u0441 rfc2307 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f <a href=\"https:\/\/wiki.samba.org\/index.php\/Local_user_management_and_authentication\/sssd\">sssd<\/a>. \u041a\u0441\u0442\u0430\u0442\u0438, \u0441\u0431\u043e\u0440\u043a\u0443 Samba4 \u043e\u0442 sernet, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442, \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u2014 \u0435\u0435 \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c sssd.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u0438 \u0438 SID \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043d\u0430\u0434\u043e \u0438\u043c\u0435\u0442\u044c \u0441\u0442\u0430\u0440\u0443\u044e \u0431\u0430\u0437\u0443 AD \u0443\u0436\u0435 \u0432 \u0432\u0438\u0434\u0435 private directory Samba4, \u043a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0432\u044b\u0448\u0435. \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 (\u0441\u043c. <a href=\"https:\/\/wiki.samba.org\/index.php\/Join_a_domain_as_a_DC\">\u0437\u0434\u0435\u0441\u044c<\/a>), \u2014 \u00absamba-tool domain join samdom.example.com DC -Uadministrator &#8212;realm=samdom.example.com\u00bb \u2014 \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f, \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u0441\u0435\u0440\u0432\u0438\u0441 samba, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0431\u0430\u0437\u0430 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0430. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u0435\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u0443, \u0442\u043e \u0431\u0435\u0437 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 samba \u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c.<\/p>\n<p>  \u0412\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 Win AD \u0434\u043e\u043c\u0435\u043d \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e (\u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043b\u043e\u0433\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043e\u0448\u0438\u0431\u043e\u043a NTDS Replication), \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043e\u0439 \u0431\u0430\u0437\u044b AD \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u0440\u0438\u0441\u043a\u0430 \u043f\u043e\u0443\u043f\u0440\u0430\u0436\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0430\u0445. \u0415\u0441\u043b\u0438 MS Win \u0434\u043e\u043c\u0435\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0435\u0449\u0435 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043b\u0443\u0447\u0448\u0435 \u044d\u0442\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e Samba4 \u0443\u0431\u0438\u0442\u044c \u0438 \u0432\u044b\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u0442\u043e\u043c DC \u0438\u0437 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 DC.<\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e private directory (\u043e\u0431\u044b\u0447\u043d\u043e <i>\/var\/lib\/samba\/private<\/i> \u0438\u043b\u0438 <i>\/usr\/local\/samba\/private<\/i>) \u043d\u0430\u0434\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0443\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0438\u0439 Samba4 \u0438 \u0442\u0443\u0434\u0430 \u0436\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c smb.conf \u0438\u0437 \/etc\/samba. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0441\u0442\u0430\u0440\u043e\u043c \u0434\u043e\u043c\u0435\u043d\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0438 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0424\u0421. <\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0444\u0430\u0439\u043b-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 Samba3, \u0442\u043e \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u044f\u0434\u043e\u043c \u043d\u0430\u0434\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 <i>\/var\/lib\/samba<\/i> \u043e\u0442 Samba3 (\u0442\u0430\u043c \u043d\u0443\u0436\u043d\u044b 2 \u0444\u0430\u0439\u043b\u0430 \u2014 winbindd_idmap.tdb \u0438 group_mapping.tdb), \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0432 Samba3 idmap.<\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0444\u043e\u0440\u043c\u043b\u044f\u0435\u043c \u0432 \u0432\u0438\u0434\u0435 \u0444\u0430\u0439\u043b\u0430 conf.py:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python # -*- coding: utf-8 -*-  smb_conf = '\/etc\/samba\/smb.conf' smb_priv = '\/var\/lib\/samba\/private'  dom0 = 'olddom.mydom.ru' # \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 dom1 = 'newdom.lan' # \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430. (!)\u0442\u043e\u0447\u0435\u043a \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u0441\u0442\u0430\u0440\u043e\u043c - \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f host = 'newdc' # \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430  maildom = 'mydom.ru' #\u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0434\u043e\u043c\u0435\u043d. \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e #homeDirectory, homeDrive = r'\\\\newdc\\Users','Z:' # \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e smb_priv0 = '\/var\/lib\/samba\/private-0' #private directory \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 \u043d\u0430 samba4 (\u0438 \u0442\u0430\u043c \u0436\u0435 \u0435\u0433\u043e smb.conf!)  smb3db = '\/var\/lib\/samba\/samba3' #\u0435\u0441\u043b\u0438 \u0431\u044b\u043b \u0444\u0430\u0439\u043b-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u0441\u0430\u043c\u0431\u04303 (\u043e\u0431\u044b\u0447\u043d\u043e \/var\/lib\/samba (\u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c)), \u0438\u043d\u0430\u0447\u0435 None start_unix_id = 50000 # \u043d\u0430\u0447\u0430\u043b\u043e \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438 GID \u0438 UID \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   ############ \u043d\u0438\u0436\u0435 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c d0, d1 = dom0.split('.'), dom1.split('.') base0 = ','.join(['DC='+x for x in d0]) base, dom, realm = ','.join(['DC='+x for x in d1]), d1[0].upper(), '.'.join(d1).upper() <\/code><\/pre>\n<p>  \u0421\u043e\u0431\u0435\u0440\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0432 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b   <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">lib1.py<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">#!\/usr\/bin\/env python # -*- coding: utf-8 -*-  import sys import string import ldb from struct import unpack #from samba.idmap import IDmapDB  from samba.samdb import SamDB from samba.auth import system_session from samba.ndr import ndr_unpack from samba.dcerpc import security import samba.param import base64 from conf import *  def get_1out(cmd): #\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 1 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b     import subprocess     return subprocess.Popen(cmd, stdout=subprocess.PIPE).stdout.read().splitlines()[0]  if not 'host' in globals():    host = get_1out('hostname').upper() if not 'smb3db' in globals():  smb3db = None   my_log = lambda *x: None chgDc = lambda x: x  def set_my_log():  #\u0432\u044b\u0432\u043e\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043b\u043e\u0433-\u0444\u0430\u0439\u043b. \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0441\u043e\u043e\u0442\u0432. \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f     from datetime import datetime     global my_log     f_log = open(datetime.strftime(datetime.now(), &quot;log_%y-%m-%d_%H:%M:%S.txt&quot;),'w')     def my_log(*x):         try:             xx = ' '.join(x)         except:             xx = ' '.join(map(lambda a: str(a),x))         f_log.write(xx+'\\n')         print xx  def mk_chg(d0=d0,d1=d1): #\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u0435\u043d\u044b \u0438\u043c\u0435\u043d. d0,d1 \u0441\u043f\u0438\u0441\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430. !!!: len(d0) &gt;= len(d1)      import re     global chgDc     if d0 == d1: return     dif = len(d0)-len(d1)+1    #\u0435\u0441\u043b\u0438 \u0432 \u043d\u043e\u0432\u043e\u043c \u0434\u043e\u043c\u0435\u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043c\u0435\u043d\u0438,     ddx = [d0[0],] + d0[dif:]  #\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0440\u0430\u0432\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0438\u043d\u0430\u0447\u0435 ddx == d0     #1 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0435, 2 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b, 3 .\u0431\u043e\u043b\u044c\u0448\u0438\u0435. :     myRe = [('',re.compile(r'\\b(DC=)?%s\\b[,.]?' % x, re.I)) for x in d0[1:dif]] +\\         [(b,re.compile(r'\\b%s\\b' % a)) for (a,b) in zip(ddx,d1)] +\\         [(b.upper(),re.compile(r'\\b%s\\b' % a.upper(), re.I)) for (a,b) in zip(ddx,d1)]      def chg(s):     #\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0442\u0430\u0440\u043e\u0435 \u043d\u0430 \u043d\u043e\u0432\u043e\u0435 d0 -&gt; d1         for r in myRe: s = r[1].sub(r[0],s)          return s     chgDc = chg     return chg  def mk_sam0(smb_priv0=smb_priv0): #\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430. smb_priv0 - private directory \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 (\u0438 \u0442\u0430\u043c \u0436\u0435 \u0435\u0433\u043e smb.conf!)      import os     global sam0     lp0 = samba.param.LoadParm()     lp0.load(smb_priv0+'\/smb.conf')      # smb.conf \u043d\u0430\u0434\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 private directory!!!     lp0.set('private directory',smb_priv0)     sam0 = SamDB(lp=lp0,session_info=system_session())      os.unsetenv('SMB_CONF_PATH')     return sam0      def mk_sam(host=host): #\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 \u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432     global sam, ridSet, ridMan, sfu, idmap, minRid, nis     lp = samba.param.LoadParm()     lp.load(smb_conf)      lp.set('private directory',smb_priv)     sam = SamDB(lp=lp,session_info=system_session()) #    idmap = IDmapDB(lp=lp)     sfu = &quot;CN=%s,CN=ypservers,CN=ypServ30,CN=RpcServices,CN=System,%s&quot; % (dom,base) # dn \u0434\u043b\u044f sfu (msSFU30OrderNumber...)     ridSet = &quot;CN=RID Set,CN=%s,OU=Domain Controllers,%s&quot; % (host, base) # dn \u0434\u043b\u044f rIDNextRID     ridMan = &quot;CN=RID Manager$,CN=System,&quot;+base  # dn \u0434\u043b\u044f RID Manager     if not 'minRid' in globals():         minRid = int(sam.search(base = ridSet, attrs=[&quot;rIDNextRID&quot;])[0][&quot;rIDNextRID&quot;][0])         my_log('\\tminRid=%s' % str(minRid))     if not 'nis' in globals():         nis = str(sam.search(base=sfu, attrs=['msSFU30Domains'])[0]['msSFU30Domains'][0])     sam.nis = nis     return sam      def get_map0(i=None, path=smb3db, maps = {}):  # \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 sAMAccountName &lt;-&gt; UID \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 idmap smb3 - \u0441\u043b\u043e\u0432\u0430\u0440\u044c maps     if not maps:         if path != None:             from samba.samba3 import DbDatabase             mapdb = DbDatabase(path+'\/group_mapping')             for x in mapdb.db.iterkeys():                  if x.startswith('UNIXGROUP') :                     y = mapdb.db.get(x)                     maps[y[8:-2]] = ('GID',unpack('&lt;L',y[0:4])[0])             mapdb.close()             mapdb = DbDatabase(path+'\/winbindd_idmap')             for x in mapdb.db.iterkeys():                  if x.startswith('S-1'):                     y = mapdb.db.get(x)                     res = sam0.search(base=base0,expression=&quot;(objectSid=%s)&quot; % x.rstrip(&quot;\\x00&quot;),                          scope=ldb.SCOPE_SUBTREE, attrs=[&quot;sAMAccountName&quot;])                     if len(res) &gt; 0 and 'sAMAccountName' in res[0]:                           maps[str(res[0][&quot;sAMAccountName&quot;][0])] = y.rstrip(&quot;\\x00&quot;).split(&quot; &quot;)             mapdb.close()         else: # \u0435\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u0430 \u0431\u0430\u0437\u0430 idmap, \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0430\u0434\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0438\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c ID 'Domain Users'             my_log('!? Not MAP0')             maps['Domain Users'] = ['GID',start_unix_id]             if 'sam' in globals():                 res = sam.search(base=base,expression=&quot;(sAMAccountName=Domain Users)&quot;,attrs=['gidNumber'])                 if len(res) &gt; 0 and 'gidNumber' in res[0]:                     maps['Domain Users'][1] = int(res[0]['gidNumber'][0])         maps['_users'] = maps['Domain Users'][1] # \u0441\u043f\u0435\u0446. \u0433\u0440\u0443\u043f\u043f\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445         my_log('Set Domain Users = %d' %  maps['_users'])         maps['Administrator'] = ('UID',0)         maps['Administrators'] = ('GID',0)     if i == None: return maps     return maps[i] if i in maps else False      def mk_fill_matrix(m,r): # helper \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044f m \u0432 cp_usr() \u0438 cp_grp()     def rp(k,chg=0): # \u0435\u0441\u043b\u0438 chg!=0 - \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043c\u0435\u043d!         if k in r:             m[k] = str(r[k][0]) if chg==0 else chgDc(str(r[k][0]))     return rp  def mk_fill_ldb_msg(dn): # helper \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 ldb.Message m2     m2 = ldb.Message()     m2.dn = ldb.Dn(sam, str(dn))     def rp(fld=None,val='',flg=ldb.FLAG_MOD_REPLACE):         if fld:              m2[fld] = ldb.MessageElement(str(val), flg, fld)         return m2     return rp  def usn_sort(res): # \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 res \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f - \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (ou, grp)     x = [r for r in res]     x.sort(key = lambda r: int(r[&quot;uSNCreated&quot;][0]))     return x      def rid_sort(res): # \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 res \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 RID      x = [r for r in res]     x.sort(key = lambda r: int(unpack('&lt;I',r['objectSid'][0][-4:])[0]))     return x  def set_grp_gid(r,gid): #\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Unix GID \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u044b     rp = mk_fill_ldb_msg(r.dn)     rp(&quot;msSFU30NisDomain&quot;,nis)     rp(&quot;msSFU30Name&quot;,r['sAMAccountName'][0])     rp(&quot;gidNumber&quot;,gid)     sam.modify(rp())  def set_usr_gid_uid(r,uid): #\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Unix GID, UID \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     rp = mk_fill_ldb_msg(r.dn)     rp(&quot;msSFU30NisDomain&quot;,nis)     rp(&quot;uid&quot;,r['sAMAccountName'][0])     rp(&quot;uidNumber&quot;,uid)     rp(&quot;gidNumber&quot;,get_map0('_users')) #    rp('objectClass','posixAccount',ldb.FLAG_MOD_ADD)     sam.modify(rp())  def map_grp(): # \u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043e\u043e\u0442\u0432 GID \u0438\u0437 IdMap \u0431\u0430\u0437\u044b Samba 3     res = sam.search(base=base,expression=&quot;(objectClass=group)&quot;)     my_log( &quot;\\tmap_grp ALL GRP COUNT: %s&quot; % len(res))     sam.transaction_start()     try:         for r in res:             x = get_map0(str(r['sAMAccountName'][0]))             if x:                 set_grp_gid(r,x[1])     except:         sam.transaction_cancel()         my_log( '!!! ERROR MAP GRP %s' % r['sAMAccountName'])     else:         sam.transaction_commit()  def map_usr(): # \u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043e\u043e\u0442\u0432 UID \u0438\u0437 IdMap \u0431\u0430\u0437\u044b Samba 3     res = sam.search(base=base,expression=&quot;(&(objectCategory=person)(objectClass=user))&quot;,attrs=[&quot;sAMAccountName&quot;])     my_log( &quot;\\tmap_usr ALL USR COUNT: %s&quot; % len(res))     sam.transaction_start()     try:         for r in res:             x = get_map0(str(r['sAMAccountName'][0]))             if x:                 set_usr_gid_uid(r,x[1])     except:         sam.transaction_cancel()         my_log( '!!! ERROR SET SFU30 ATTR. USER %s !!!' % x[1])     else:         sam.transaction_commit()  def cp_ou(): # \u043f\u0435\u0440\u0435\u043d\u043e\u0441 organizationalUnit     ous = [str(r.dn) for r in sam.search(base=base,expression=&quot;(objectClass=organizationalUnit)&quot;, attrs=[])]     res = sam0.search(base=base0,expression=&quot;(objectClass=organizationalUnit)&quot;)     my_log( &quot;\\tOU COUNT: %s&quot; % len(res))     for r in usn_sort(res):         dn = chgDc(str(r.dn))         if not dn in ous:             m = {&quot;dn&quot;: dn, &quot;objectClass&quot;: &quot;organizationalUnit&quot;, &quot;name&quot;: str(r[&quot;name&quot;][0])}             try: sam.add(m)             except: my_log(&quot;!!!Error Add OU : %s&quot; % dn)  def cp_usr(): # \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439     users = [str(r.dn) for r in sam.search(base=base,expression=&quot;(&(objectCategory=person)(objectClass=user))&quot;, attrs=[])]     res = sam0.search(base=base0,expression=&quot;(&(objectCategory=person)(objectClass=user))&quot;, attrs=['*','unicodePwd'])     my_log( &quot;\\tNEW USR COUNT: %s&quot; % len(res))     for r in res:         dn = chgDc(str(r.dn))         if dn in users: continue         sd = ndr_unpack(security.dom_sid,r['objectSid'][0])         (group_dom_sid, rid) = sd.split()         if rid &lt;= minRid:              my_log( '!! MinRid ERR : ', r['sAMAccountName'][0]  )             continue         m = {&quot;dn&quot;: dn, &quot;objectClass&quot;: &quot;user&quot;}         rp = mk_fill_matrix(m,r)         rp('userPrincipalName',1)         rp('sAMAccountName')         rp('sn')         rp('name')         rp('initials')         rp('displayName')         rp('scriptPath')         rp('description')         rp('userAccountControl')         rp('pwdLastSet')         m[&quot;nTSecurityDescriptor&quot;] = r['objectSid']         if 'maildom' in globals():             m[&quot;mail&quot;] = &quot;%s@%s&quot; % (r['sAMAccountName'][0], maildom)         if 'homeDirectory' in globals():             m[&quot;homeDirectory&quot;] = r&quot;%s\\%s&quot; % (homeDirectory,r['sAMAccountName'][0])         if 'homeDrive' in globals():             m[&quot;homeDrive&quot;] = homeDrive         sam.transaction_start()         try:             sam.add(m)         except:             sam.transaction_cancel()             my_log( '!!! ERROR ADD USER : %s' % m['sAMAccountName'])         else:             sam.transaction_commit()         # Copy the password for it         if not 'unicodePwd' in r:             my_log( '!!! NOT PASSWD FOR USER : %s' % m['sAMAccountName'])             continue         setpw = &quot;&quot;&quot; dn: %s changetype: modify replace: unicodePwd unicodePwd:: %s &quot;&quot;&quot; % (dn, base64.b64encode(str(r['unicodePwd'])))         sam.transaction_start()         try:             sam.modify_ldif(setpw,[&quot;local_oid:1.3.6.1.4.1.7165.4.3.12:0&quot;])         except:             sam.transaction_cancel()             my_log( '!!! ERROR SET PASSWORD USER : %s' % m['sAMAccountName'])         else:             sam.transaction_commit()   def cp_grp(): # \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0433\u0440\u0443\u043f\u043f     grps = [str(r.dn) for r in sam.search(base=base,expression=&quot;(objectClass=group)&quot;, attrs=[])]     res = sam0.search(base=base0,expression=&quot;(&(objectClass=group)(objectCategory=Group))&quot;)     my_log( &quot;\\tNEW GRP COUNT: %s&quot; % len(res))     for r in usn_sort(res):         dn = chgDc(str(r.dn))         if dn in grps: continue         sd = ndr_unpack(security.dom_sid,r['objectSid'][0])         (group_dom_sid, rid) = sd.split()         if rid &lt;= minRid:              my_log( '!! MinRid ERR : ', r['name'][0]  )             continue         m = {&quot;dn&quot;: dn, &quot;objectClass&quot;: &quot;group&quot;}         rp = mk_fill_matrix(m,r)         rp('sAMAccountName')         rp('groupType')         rp('description')         m[&quot;nTSecurityDescriptor&quot;] = r['objectSid']         sam.transaction_start()         try:               sam.add(m)         except:             sam.transaction_cancel()             my_log( '!!! ERROR add GRP %s !!!' % m['sAMAccountName'])         else:             sam.transaction_commit()              def grp_fill(): #\u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0447\u043b\u0435\u043d\u0430\u043c\u0438     my_log( &quot;\\tgrp_fill&quot;)     grps ={}     for r in sam.search(base=base,expression=&quot;(&(objectClass=group)(objectCategory=Group))&quot;,attrs=['member']):         grps[str(r.dn)] = r['member'] if 'member' in r else []     users = [str(r.dn) for r in sam.search(base=base,expression=&quot;(&(objectCategory=person)(objectClass=user))&quot;, attrs=[])]     for r in sam0.search(base=base0,expression=&quot;(&(objectClass=group)(objectCategory=Group))&quot;,attrs=['member']):         if not 'member' in r: continue         grp = chgDc(str(r.dn))         if not grps.has_key(grp):              my_log( &quot;!!not found group:\\t&quot;,grp)             continue         add_m = ''         for m in r['member']:             m = chgDc(m)             if m in grps[grp]: continue             if not m in users:                 try: sam.search(base=m, attrs=[])                 except:                     my_log( &quot;!? err (not found) add %s \\tto %s&quot; % (m,grp))                     continue             add_m += &quot;add: member\\nmember: %s\\n&quot; % (m)         if add_m == '': continue         add_m = &quot;\\ndn: %s\\nchangetype: modify\\n%s\\n&quot; % (grp,add_m)         sam.transaction_start()         try:             sam.modify_ldif(add_m)         except:             sam.transaction_cancel()             my_log( &quot;!!!Error fill grp &quot;+grp)         else:             sam.transaction_commit()  def set_max_gid_uid(max_gid=start_unix_id, max_uid=start_unix_id): # \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c max GID, UID \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435     my_log('set_max_gid_uid start: set max_gid=%s, max_uid=%s' % (max_gid, max_uid))     chg = ''     r = sam.search(base=sfu)[0]     for x in (['msSFU30MaxGidNumber',max_gid],['msSFU30MaxUidNumber',max_uid]):         x[1] = max(x[1],start_unix_id)         if not x[0] in r or x[1] &gt; int(r[x[0]][0]):             chg += &quot;replace: %s\\n%s: %d\\n&quot; % (x[0],x[0],x[1])     if chg != '':         chg = &quot;\\ndn: %s\\nchangetype: modify\\n%s\\n&quot; % (sfu,chg)         sam.transaction_start()         try:             sam.modify_ldif(chg)         except:             sam.transaction_cancel()             my_log( &quot;!!!Error set msSFU30Max...&quot;)         else:             sam.transaction_commit()              def get_next_uid(): # \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 UID \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435     nm = 'msSFU30MaxUidNumber'     r = sam.search(base=sfu)[0]     x = start_unix_id     if nm in r:         x = max(x, int(r[nm][0]))     sam.transaction_start()     try:         sam.modify_ldif(&quot;\\ndn: %s\\nchangetype: modify\\nreplace: %s\\n%s: %d\\n&quot; % (sfu,nm,nm,x+1))     except:         sam.transaction_cancel()         my_log( &quot;!!!Error set msSFU30Max...&quot;)         raise     else:         sam.transaction_commit()     return x                  def set_max_id(): #\u043d\u0430\u0439\u0442\u0438 max GID, UID, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435  \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c +1     max_gid = max([int(r['gidNumber'][0]) for r in sam.search(base=base,expression=&quot;(&(objectClass=group)(gidNumber=*))&quot;,attrs=['gidNumber'])]+[0])     max_uid = max([int(r['uidNumber'][0]) for r in sam.search(base=base,expression=&quot;(&(objectCategory=person)(objectClass=user)(uidNumber=*))&quot;,attrs=['uidNumber'])]+[0])     set_max_gid_uid(max_gid=max_gid+1,max_uid=max_uid+1)          def check_id(): #\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432. GID, UID \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c     r = sam.search(base=sfu)[0]     (max_gid,max_uid) = [int(r[x][0]) if x in r else start_unix_id for x in ('msSFU30MaxGidNumber','msSFU30MaxUidNumber')]      my_log('check_id start: initial max_gid=%d, max_uid=%d' % (max_gid, max_uid))     sam.transaction_start()     try:         for r in rid_sort(sam.search(base=base,expression=&quot;(&(objectClass=group)(!(gidNumber=*)))&quot;,attrs=['sAMAccountName','objectSid'])):             set_grp_gid(r,max_gid)             max_gid += 1         for r in usn_sort(sam.search(base=base,expression=&quot;(&(objectCategory=person)(objectClass=user)(!(uidNumber=*)))&quot;,attrs=['sAMAccountName','uSNCreated'])):             set_usr_gid_uid(r,max_uid)             max_uid += 1     except:         sam.transaction_cancel()         my_log( '!!! ERROR check_id %s' % r['sAMAccountName'])     else:         sam.transaction_commit()         set_max_gid_uid(max_gid=max_gid,max_uid=max_uid)  def set_max_rid(): #\u043d\u0430\u0439\u0442\u0438 max RID \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 &quot;RID Set&quot; \u0438 &quot;RID Manager&quot;     res = sam.search(base=base,expression=&quot;(&(sAMAccountName=*)(objectSid=*))&quot;,attrs=[&quot;objectSid&quot;])     my_log( &quot;\\tSID COUNT: %s&quot; % len(res))     x = max([int(unpack('&lt;I',r['objectSid'][0][-4:])[0]) for r in res])     rmin = (x-100)\/500*500+100     pool = rmin + ((rmin + 499) &lt;&lt; 32)     my_log(&quot;\\tRid Set: %d %d %d &quot; % (rmin,x,rmin + 499))     m = mk_fill_ldb_msg(ridSet)     m('rIDNextRID',x)     m('rIDAllocationPool',pool)     m('rIDPreviousAllocationPool',pool)     m2 = mk_fill_ldb_msg(ridMan)     m2('rIDAvailablePool',rmin + 500 + (1073741823 &lt;&lt; 32))     sam.transaction_start()     try:         sam.modify(m())         sam.modify(m2())     except:         sam.transaction_cancel()         my_log( '!!! ERROR Set rIDNextRID %s' % x)     else:         sam.transaction_commit()     return x               def mk_dom(): # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 \u043d\u0430 samba 4 \u0441 \u043f\u0440\u0435\u0436\u043d\u0438\u043c SID, \u0441\u0431\u0440\u043e\u0448\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u043c administrator = &quot;1&quot; !!!     from samba.netcmd.main import cmd_sambatool     def cmd(args, subcom='domain'):         cmd = cmd_sambatool()         try:             retval = cmd._run(&quot;samba-tool&quot;, subcom, *args)         except SystemExit, e:             retval = e.code         except Exception, e:             cmd.show_command_error(e)             retval = 1         if retval: sys.exit(retval)     cmd(('provision',          '--host-name=%s' % host,         '--realm=%s' % realm,         '--domain=%s' % dom,         '--domain-sid=%s' % get_1out('.\/get_dom_sid.py'),         '--adminpass=UJHkjhm7KH$$2vrXy',         '--function-level=2003',         '--server-role=dc',         '--use-rfc2307',         '--dns-backend=SAMBA_INTERNAL'))     cmd(('passwordsettings', 'set', '--complexity=off', '--history-length=0', '--min-pwd-length=0', '--min-pwd-age=0', '--max-pwd-age=0'))     cmd(('setpassword', 'administrator', '--newpassword=1'),subcom='user') # \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0430 1. \u041d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u043e\u0442\u043e\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439!! <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 get_dom_sid.py \u043a\u0430\u043a \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 mk_dom() \u2014 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430. <br \/>  get_dom_sid.py \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 SID \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python from lib1 import mk_sam0 print mk_sam0().domain_sid <\/code><\/pre>\n<p>  \u0422\u0430\u043a \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u0431\u0430\u0437\u0435 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0435, \u0447\u0442\u043e \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u0437\u0430\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0440\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.  <\/div>\n<\/div>\n<p>  \u0418\u0442\u0430\u043a, \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b (samba4, sssd \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438), \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u0431\u0430\u0437, \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430.<\/p>\n<p>  \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u043c\u0435\u043d\u0430 \u2014 \u0437\u0430\u043f\u0443\u0441\u043a mk_dom.py:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python # -*- coding: utf-8 -*- from lib1 import *  set_my_log() mk_dom() <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e (\u043b\u043e\u0433-\u0444\u0430\u0439\u043b \u0438\u043c\u0435\u0435\u0442 \u0438\u043c\u044f log_%y-%m-%d_%H:%M:%S.txt) \u0441\u043c\u043e\u0442\u0440\u0438\u043c smb.conf, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 [global] <br \/>  dns forwarder = &lt;\u0430\u0434\u0440\u0435\u0441 \u0441\u0442\u0430\u0440\u043e\u0433\u043e DC&gt; (\u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0441\u0442\u0430\u043d\u0446\u0438\u0439 \u0432 \u043d\u043e\u0432\u044b\u0439 \u0434\u043e\u043c\u0435\u043d).<\/p>\n<p>  \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c krb5.conf \u0438\u0437 \/var\/lib\/samba\/private \u0432 \/etc (\u0438\u043b\u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043b\u0438\u043d\u043a). \u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 cp_dom.py:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python # -*- coding: utf-8 -*- from lib1 import *  set_my_log() my_log(base0,' -&gt;',base, dom, realm) mk_chg()        #\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0435\u043e\u0440\u0431\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043c\u0435\u043d mk_sam0()       #\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0442\u0430\u0440\u043e\u0439 \u0431\u0430\u0437\u0435 mk_sam()        #\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u043d\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435 cp_ou()         #\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 organizationalUnit cp_grp()        #\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f cp_usr()        #\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 grp_fill()      #\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f \u0447\u043b\u0435\u043d\u0430\u043c\u0438 get_map0()      #\u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f sAMAccountName &lt;-&gt; UID (\u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u044f idmap Samba3) map_grp()       #\u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c unix GID \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f map_usr()       #\u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c unix GID, UID \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 set_max_rid()   #\u043d\u0430\u0439\u0442\u0438 max RID \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 &quot;RID Set&quot; \u0438 &quot;RID Manager&quot; set_max_id()    #\u043d\u0430\u0439\u0442\u0438 max GID, UID, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435  \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c +1 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 check_id()      #\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 GID, UID \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c <\/code><\/pre>\n<p>  \u0412 \u043b\u043e\u0433 \u0444\u0430\u0439\u043b \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u0432\u0430\u043b\u044f\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0438. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0435 \u2014 \u0441 \u0442\u0440\u0435\u043c\u044f \u0437\u043d\u0430\u043a\u0430\u043c\u0438 &quot;!&quot; \u0432\u043f\u0435\u0440\u0435\u0434\u0438. \u0422\u0438\u043f\u0430:<br \/>  <i>!!! ERROR ADD USER: 5CA6ADDF-A2C8-46E5-A<br \/>  !!! ERROR SET PASSWORD USER: 5CA6ADDF-A2C8-46E5-A<\/i><br \/>  \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 \u0438 \u043f\u043e \u0441\u0443\u0442\u0438 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435. \u0415\u0441\u043b\u0438 \u0432 \u0434\u043e\u043c\u0435\u043d\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 \u043b\u0435\u0441\u0430, \u0438\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0438 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0432 \u043b\u043e\u0433. \u041d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b \u043e\u0448\u0438\u0431\u043a\u0438 \u0442\u0438\u043f\u0430 <i>!! MinRid ERR: \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 DCOM<\/i><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0442\u0435\u0440\u043f\u0438\u043c\u043e, \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c Samba:<\/p>\n<pre><code class=\"bash\">start  samba-ad-dc<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 sssd<\/b><\/p>\n<div class=\"spoiler_text\">\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e <a href=\"https:\/\/wiki.samba.org\/index.php\/Local_user_management_and_authentication\/sssd\">\u0437\u0434\u0435\u0441\u044c<\/a> (Method 1: Connecting to AD via Kerberos).<br \/>  \u0413\u043e\u0442\u043e\u0432\u0438\u043c \u043a\u0435\u0440\u0431\u0435\u0440\u043e\u0441 \u0434\u043b\u044f sssd:<\/p>\n<pre><code class=\"bash\">samba-tool domain exportkeytab \/etc\/krb5.sssd.keytab --principal=&lt;myHostName&gt;$ chown root:root \/etc\/krb5.sssd.keytab chmod 600 \/etc\/krb5.sssd.keytab <\/code><\/pre>\n<p>  \u0424\u0430\u0439\u043b \/etc\/sssd\/sssd.conf:<\/p>\n<pre><code>[sssd] services = nss, pam config_file_version = 2 domains = newdom.lan  [nss]  [pam]  [domain\/newdom.lan] id_provider = ad auth_provider = ad ldap_schema = ad krb5_keytab = \/etc\/krb5.sssd.keytab access_provider = ad ldap_id_mapping=false enumerate = true <\/code><\/pre>\n<p>  \u0421\u0431\u0440\u043e\u0441 \u043a\u044d\u0448 sssd:<\/p>\n<pre><code class=\"bash\">sss_cache -GU<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a sssd:<\/p>\n<pre><code class=\"bash\">restart sssd<\/code><\/pre>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u0441\u0431\u0440\u043e\u0441 \u043a\u044d\u0448 sssd \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043f\u043e\u043c\u043e\u0447\u044c \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 AD. \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e, \u043f\u0440\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c sssd, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0438\u0437 \/var\/lib\/sss\/ \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0445 \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 (\u0438\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430).  <\/div>\n<\/div>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0433\u0440\u0443\u043f\u043f (\u0431\u0430\u0437\u0430 sssd \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f):<\/p>\n<pre><code class=\"bash\">getent passwd getent group<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 <i>netdom.exe<\/i> (netdom.exe move \/?), \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0435\u0435 \u0432 \u043b\u043e\u0433\u043e\u043d-\u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0422\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0434\u043b\u044f \u041e\u0421 \u0432\u0435\u0440\u0441\u0438\u044e <i>netdom.exe<\/i>. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 SID, GID, UID \u0438 \u043f\u0430\u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f, \u0442\u043e \u043f\u0435\u0440\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u0438 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u2014 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0441 \u043d\u0438\u043c\u0438, \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0442\u043e\u0436\u0435. \u041d\u0430\u0434\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043c\u0435\u043d \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Samba. <\/p>\n<p>  \u0423 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u043e \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435 \u2014 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0435\u0441\u044c \u044d\u0442\u043e \u0437\u043e\u043e\u043f\u0430\u0440\u043a \u0436\u0438\u043b \u043f\u043e\u0434 OpenVZ, \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0424\u0421 \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a \u0440\u0430\u0437\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e (\u043c\u043e\u0436\u043d\u043e \u0438 DC \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u2014 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e), \u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0448\u0430\u043b\u0438\u0441\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u043c GID \u0438 UID. <\/p>\n<p>  \u041e\u0431\u044a\u0435\u043a\u0442\u044b Group Policy \u043d\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043b\u0438\u0441\u044c \u0432 \u043d\u043e\u0432\u044b\u0439 \u0434\u043e\u043c\u0435\u043d.             <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/259029\/\"> http:\/\/habrahabr.ru\/post\/259029\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>             Samba4 \u0438\u043c\u0435\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430 Python. \u041c\u043d\u043e\u0433\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (samba-tool, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043d\u0430 Python \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>  \u0412\u0441\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u043e\u0441\u044c \u0438\u0437 LDAP-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 Samba 4 Python Scripting. \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u2014 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0438\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 LDAP. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0445\u044d\u0448 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0438 \u043f\u0435\u0440\u0435\u043a\u0438\u043d\u0443\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0443\u044e. \u0414\u0430 \u0438 \u0441\u0430\u043c\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441 \u0438\u0445 SID\u0430\u043c\u0438, \u043f\u0430\u0440\u043e\u043b\u044f\u043c\u0438 \u0438 \u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0447\u0438\u043c \u043f\u0435\u0440\u0435\u043a\u0438\u043d\u0443\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u043e\u043c\u0435\u043d (\u0431\u0435\u0437 \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0435\u043a \u0441 SID-history).  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-258183","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/258183","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=258183"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/258183\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=258183"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=258183"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=258183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}