<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.nntc.nnov.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Madnessman777</id>
	<title>wiki.nntc.nnov.ru - Вклад участника [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.nntc.nnov.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Madnessman777"/>
	<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Madnessman777"/>
	<updated>2026-10-25T04:24:33Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=FreePBX&amp;diff=11024</id>
		<title>FreePBX</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=FreePBX&amp;diff=11024"/>
		<updated>2025-09-11T13:19:40Z</updated>

		<summary type="html">&lt;p&gt;Madnessman777: /* Маршрутизация звонков с ВиртуальнойАТС Ростелеком */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
=Термины= &lt;br /&gt;
'''Direct Inward Dialing (DID)''' - полный номер телефона, на который поступил входящий звонок. Для FreePBX - уникальный идентификатор, по которому происходит маршрутизация звонков. Именно благодаря ему FreePBX отличает звонок в тех поддержку от звонка в отдел продаж. &amp;lt;br /&amp;gt;&lt;br /&gt;
'''Транк (trunk)''' - это виртуальный канал связи, который соединяет вашу АТС с телефонным провайдером. Через него проходят все звонки (входящие и исходящие), при этом он позволяет обрабатывать несколько вызовов одновременно.&lt;br /&gt;
=Проблемы=&lt;br /&gt;
==Маршрутизация звонков==&lt;br /&gt;
При работе с несколькими транками, которые зарегистрированы у крупных провайдеров (например, Ростелеком), вы можете столкнуться с тем, что провайдер не присылает DID.&lt;br /&gt;
&lt;br /&gt;
Допустим, у вас настроено два номера и для каждого из них создан свой отдельный входящий маршрут в FreePBX. Однако при поступлении звонка на любой из этих номеров провайдер не передает системе информацию о том, какой именно номер был набран.&lt;br /&gt;
&lt;br /&gt;
В результате FreePBX не может найти соответствующий маршрут по DID, и вся логика маршрутизации ломается или же работает неправильно. Чаще всего это приводит к тому, что все входящие вызовы направляются по одному маршруту по умолчанию, игнорируя созданные вами правила.&lt;br /&gt;
&lt;br /&gt;
Поскольку система не получает DID извне, мы должны &amp;quot;подсказать&amp;quot; его самостоятельно. Идея заключается в том, чтобы перехватить входящий звонок еще до того, как он попадет в стандартный механизм маршрутизации, и принудительно присвоить ему правильный DID.&lt;br /&gt;
&lt;br /&gt;
Для этого мы создадим для каждого транка (читай: для каждого городского номера) свой собственный кастомный контекст. Этот контекст — небольшой сценарий, который будет выполнять простую команду: «Если звонок пришел с этого транка, значит, его DID равен 78311234567 (любой нужный номер)». После этого звонок, уже с корректным DID, отправляется на дальнейшую обработку, и вся ваша стандартная маршрутизация начинает работать как часы. &amp;lt;br /&amp;gt;&lt;br /&gt;
;1. Подключитесь к вашему серверу. &amp;lt;br /&amp;gt;&lt;br /&gt;
;2. Добавьте в конец файла '''extensions_override_freepbx.conf''' &amp;lt;u&amp;gt;'''(этот файл не затрагивается обновлениями системы)'''&amp;lt;/u&amp;gt;: &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[from-pstn-route1]&lt;br /&gt;
exten =&amp;gt; _.,1,NoOp(--- Перехват 's' с транка! Назначаю DID 7831-123-45-67 ---)&lt;br /&gt;
exten =&amp;gt; _.,n,Set(CALLERID(dnid)=78311234567); &lt;br /&gt;
exten =&amp;gt; _.,n,Goto(from-pstn,78311234567,1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Давайте разберём что делает каждая строка:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[from-pstn-route1]&amp;lt;/code&amp;gt; &amp;lt;- после '''from-pstn-''' может быть любое нужное название. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;exten =&amp;gt; _.,1,NoOp(--- Перехват 's' с транка! Назначаю DID 7831-123-45-67 ---)&amp;lt;/code&amp;gt; - логгирование. &amp;lt;br /&amp;gt; &lt;br /&gt;
&amp;lt;code&amp;gt;exten =&amp;gt; _.,n,Set(CALLERID(dnid)=78311234567);&amp;lt;/code&amp;gt; - установка DID на 78311234567. На месте номера может быть любой нужный нам номер. &amp;lt;br /&amp;gt;  &lt;br /&gt;
&amp;lt;code&amp;gt;exten =&amp;gt; _.,n,Goto(from-pstn,78311234567,1)&amp;lt;/code&amp;gt; - отправка звонка в главный контекст с нужный нам DID. Номер должен быть такой-же как и в строке выше &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После изменения конфигурации не забудьте перезагрузить командой &amp;lt;code&amp;gt;fwconsole reload --verbose&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Контекст мы сделали, но работать наша магия пока не будет. Для этого нужно: &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;1. Зайдите в панель управления FreePBX.&lt;br /&gt;
;2. Перейдите в Connectivity -&amp;gt; Trunks и откройте настройки нужного вам транка. &lt;br /&gt;
;3. Откройте вкладку pjsip settings&lt;br /&gt;
;4. В поле контекст впишите нужный вам контекст и примените изменения &lt;br /&gt;
&lt;br /&gt;
После этого машрутизация должна заработать как часы&lt;/div&gt;</summary>
		<author><name>Madnessman777</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=FreePBX&amp;diff=11023</id>
		<title>FreePBX</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=FreePBX&amp;diff=11023"/>
		<updated>2025-09-11T11:00:08Z</updated>

		<summary type="html">&lt;p&gt;Madnessman777: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
=Термины= &lt;br /&gt;
'''Direct Inward Dialing (DID)''' - полный номер телефона, на который поступил входящий звонок. Для FreePBX - уникальный идентификатор, по которому происходит маршрутизация звонков. Именно благодаря ему FreePBX отличает звонок в тех поддержку от звонка в отдел продаж. &amp;lt;br /&amp;gt;&lt;br /&gt;
'''Транк (trunk)''' - это виртуальный канал связи, который соединяет вашу АТС с телефонным провайдером. Через него проходят все звонки (входящие и исходящие), при этом он позволяет обрабатывать несколько вызовов одновременно.&lt;br /&gt;
=Проблемы=&lt;br /&gt;
==Маршрутизация звонков с ВиртуальнойАТС Ростелеком==&lt;br /&gt;
При работе с несколькими транками, которые зарегистрированы у крупных провайдеров (например, Ростелеком), вы можете столкнуться с тем, что провайдер не присылает DID.&lt;br /&gt;
&lt;br /&gt;
Допустим, у вас настроено два номера и для каждого из них создан свой отдельный входящий маршрут в FreePBX. Однако при поступлении звонка на любой из этих номеров провайдер не передает системе информацию о том, какой именно номер был набран.&lt;br /&gt;
&lt;br /&gt;
В результате FreePBX не может найти соответствующий маршрут по DID, и вся логика маршрутизации ломается или же работает неправильно. Чаще всего это приводит к тому, что все входящие вызовы направляются по одному маршруту по умолчанию, игнорируя созданные вами правила.&lt;br /&gt;
&lt;br /&gt;
Поскольку система не получает DID извне, мы должны &amp;quot;подсказать&amp;quot; его самостоятельно. Идея заключается в том, чтобы перехватить входящий звонок еще до того, как он попадет в стандартный механизм маршрутизации, и принудительно присвоить ему правильный DID.&lt;br /&gt;
&lt;br /&gt;
Для этого мы создадим для каждого транка (читай: для каждого городского номера) свой собственный кастомный контекст. Этот контекст — небольшой сценарий, который будет выполнять простую команду: «Если звонок пришел с этого транка, значит, его DID равен 78311234567 (любой нужный номер)». После этого звонок, уже с корректным DID, отправляется на дальнейшую обработку, и вся ваша стандартная маршрутизация начинает работать как часы. &amp;lt;br /&amp;gt;&lt;br /&gt;
;1. Подключитесь к вашему серверу. &amp;lt;br /&amp;gt;&lt;br /&gt;
;2. Добавьте в конец файла '''extensions_override_freepbx.conf''' &amp;lt;u&amp;gt;'''(этот файл не затрагивается обновлениями системы)'''&amp;lt;/u&amp;gt;: &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[from-pstn-route1]&lt;br /&gt;
exten =&amp;gt; _.,1,NoOp(--- Перехват 's' с транка! Назначаю DID 7831-123-45-67 ---)&lt;br /&gt;
exten =&amp;gt; _.,n,Set(CALLERID(dnid)=78311234567); &lt;br /&gt;
exten =&amp;gt; _.,n,Goto(from-pstn,78311234567,1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Давайте разберём что делает каждая строка:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[from-pstn-route1]&amp;lt;/code&amp;gt; &amp;lt;- после '''from-pstn-''' может быть любое нужное название. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;exten =&amp;gt; _.,1,NoOp(--- Перехват 's' с транка! Назначаю DID 7831-123-45-67 ---)&amp;lt;/code&amp;gt; - логгирование. &amp;lt;br /&amp;gt; &lt;br /&gt;
&amp;lt;code&amp;gt;exten =&amp;gt; _.,n,Set(CALLERID(dnid)=78311234567);&amp;lt;/code&amp;gt; - установка DID на 78311234567. На месте номера может быть любой нужный нам номер. &amp;lt;br /&amp;gt;  &lt;br /&gt;
&amp;lt;code&amp;gt;exten =&amp;gt; _.,n,Goto(from-pstn,78311234567,1)&amp;lt;/code&amp;gt; - отправка звонка в главный контекст с нужный нам DID. Номер должен быть такой-же как и в строке выше &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После изменения конфигурации не забудьте перезагрузить командой &amp;lt;code&amp;gt;fwconsole reload --verbose&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Контекст мы сделали, но работать наша магия пока не будет. Для этого нужно: &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;1. Зайдите в панель управления FreePBX.&lt;br /&gt;
;2. Перейдите в Connectivity -&amp;gt; Trunks и откройте настройки нужного вам транка. &lt;br /&gt;
;3. Откройте вкладку pjsip settings&lt;br /&gt;
;4. В поле контекст впишите нужный вам контекст и примените изменения &lt;br /&gt;
&lt;br /&gt;
После этого машрутизация должна заработать как часы&lt;/div&gt;</summary>
		<author><name>Madnessman777</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=FreePBX&amp;diff=11022</id>
		<title>FreePBX</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=FreePBX&amp;diff=11022"/>
		<updated>2025-09-11T10:47:39Z</updated>

		<summary type="html">&lt;p&gt;Madnessman777: Новая страница: «__FORCETOC__ =Термины=  Direct Inward Dialing (DID) - полный номер телефона, на который поступил входящий зв…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
=Термины= &lt;br /&gt;
Direct Inward Dialing (DID) - полный номер телефона, на который поступил входящий звонок. Для FreePBX - уникальный идентификатор, по которому происходит маршрутизация звонков. Именно благодаря ему FreePBX отличает звонок в тех поддержку от звонка в отдел продаж.&lt;br /&gt;
=Проблемы=&lt;br /&gt;
==Особенность подключения ВиртуальнойАТС к FreePBX==&lt;br /&gt;
==Маршрутизация звонков с ВиртуальнойАТС Ростелеком==&lt;br /&gt;
При работе с несколькими транками, которые зарегистрированы у крупных провайдеров (например, Ростелеком), вы можете столкнуться с тем, что провайдер не присылает DID.&lt;br /&gt;
&lt;br /&gt;
Допустим, у вас настроено два номера и для каждого из них создан свой отдельный входящий маршрут в FreePBX. Однако при поступлении звонка на любой из этих номеров провайдер не передает системе информацию о том, какой именно номер был набран.&lt;br /&gt;
&lt;br /&gt;
В результате FreePBX не может найти соответствующий маршрут по DID, и вся логика маршрутизации ломается или же работает неправильно. Чаще всего это приводит к тому, что все входящие вызовы направляются по одному маршруту по умолчанию, игнорируя созданные вами правила.&lt;br /&gt;
&lt;br /&gt;
Поскольку система не получает DID извне, мы должны &amp;quot;подсказать&amp;quot; его самостоятельно. Идея заключается в том, чтобы перехватить входящий звонок еще до того, как он попадет в стандартный механизм маршрутизации, и принудительно присвоить ему правильный DID.&lt;br /&gt;
&lt;br /&gt;
Для этого мы создадим для каждого транка (читай: для каждого городского номера) свой собственный кастомный контекст. Этот контекст — небольшой сценарий, который будет выполнять простую команду: «Если звонок пришел с этого транка, значит, его DID равен 78311234567 (любой нужный номер)». После этого звонок, уже с корректным DID, отправляется на дальнейшую обработку, и вся ваша стандартная маршрутизация начинает работать как часы.&lt;br /&gt;
&lt;br /&gt;
Сделать это можно добавлением нескольких строк в файл '''extensions_override_freepbx.conf''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[from-pstn-route1]&lt;br /&gt;
exten =&amp;gt; _.,1,NoOp(--- Перехват 's' с транка! Назначаю DID 7831-123-45-67 ---)&lt;br /&gt;
exten =&amp;gt; _.,n,Set(CALLERID(dnid)=78311234567); &lt;br /&gt;
exten =&amp;gt; _.,n,Goto(from-pstn,78311234567,1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Давайте разберём что делает каждая строка:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;[from-pstn-route1]&amp;lt;/code&amp;gt; &amp;lt;- после '''from-pstn-''' может быть любое нужное название. &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;exten =&amp;gt; _.,1,NoOp(--- Перехват 's' с транка! Назначаю DID 7831-123-45-67 ---)&amp;lt;/code&amp;gt; - логгирование. &amp;lt;br /&amp;gt; &lt;br /&gt;
&amp;lt;code&amp;gt;exten =&amp;gt; _.,n,Set(CALLERID(dnid)=78311234567);&amp;lt;/code&amp;gt; - установка DID на 78311234567. На месте номера может быть любой нужный нам номер. &amp;lt;br /&amp;gt;  &lt;br /&gt;
&amp;lt;code&amp;gt;exten =&amp;gt; _.,n,Goto(from-pstn,78311234567,1)&amp;lt;/code&amp;gt; - отправка звонка в главный контекст с нужный нам DID. Номер должен быть такой-же как и в строке выше &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После изменения конфигурации не забудьте перезагрузить командой &amp;lt;code&amp;gt;fwconsole reload --verbose&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Контекст мы сделали, но работать наша магия пока не будет. Нам в настройках транка во вкладке '''pjsip settings''' в поле '''Context''' нужно указать нужный нам контекст и применить изменения. &lt;br /&gt;
&lt;br /&gt;
После описанных выше действий маршрутизация будет работать как надо&lt;/div&gt;</summary>
		<author><name>Madnessman777</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=ALTDC&amp;diff=10768</id>
		<title>ALTDC</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=ALTDC&amp;diff=10768"/>
		<updated>2024-09-04T14:03:50Z</updated>

		<summary type="html">&lt;p&gt;Madnessman777: Добавил лайфхак&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Порядок развёртывания на Альт Стартеркит MATE=&lt;br /&gt;
&lt;br /&gt;
==Подготовка и установка необходимых пакетов==&lt;br /&gt;
&lt;br /&gt;
После обновления системы и ядра...&lt;br /&gt;
&lt;br /&gt;
Выставляем часовой пояс и синхронизируем время&lt;br /&gt;
&lt;br /&gt;
 timedatectl set-timezone Europe/Moscow&lt;br /&gt;
 ntpdate pool.ntp.org&lt;br /&gt;
&lt;br /&gt;
Отключаем сервисы и устанавливаем необходимые пакеты&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for service in smb nmb; do systemctl disable $service; systemctl stop $service; done&lt;br /&gt;
apt-get install -y task-samba-dc admc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Подготовка конфигурационных файлов ситемы==&lt;br /&gt;
&lt;br /&gt;
Задаём имя хоста&lt;br /&gt;
&lt;br /&gt;
 hostnamectl set-hostname dc.domain.alt&lt;br /&gt;
&lt;br /&gt;
Также проверить и при необходимости поправить имя хоста в файле&lt;br /&gt;
&lt;br /&gt;
 /etc/sysconfig/network&lt;br /&gt;
&lt;br /&gt;
Перезагрузиться для проверки&lt;br /&gt;
&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
Далее настраиваем 127.0.0.1 в качестве DNS сервера системы (далее в команде создания домена мы добавим возможность для этого DNS сервера делать запросы к внешним DNS серверам)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/resolv.conf&lt;br /&gt;
# Generated by resolvconf&lt;br /&gt;
# Do not edit manually, use&lt;br /&gt;
# /etc/net/ifaces/&amp;lt;interface&amp;gt;/resolv.conf instead.&lt;br /&gt;
search alt&lt;br /&gt;
nameserver 127.0.0.1&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь приведена команда конфигурирования файла /etc/hosts, исходя из того, что у настраиваемого сервера локальный IP-адрес: 192.168.0.249&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/hosts&lt;br /&gt;
192.168.0.249 dc.domain.alt domain.alt&lt;br /&gt;
127.0.0.1 localhost&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание домена одной командой==&lt;br /&gt;
&lt;br /&gt;
Перед выполнением команды создания домена нужно удалить конфигурационный файл:&lt;br /&gt;
&lt;br /&gt;
 /bin/rm -rf /etc/samba/smb.conf /var/lib/samba /var/cache/samba&lt;br /&gt;
 mkdir -p /var/lib/samba/sysvol&lt;br /&gt;
&lt;br /&gt;
Для домена&lt;br /&gt;
&lt;br /&gt;
 domain.alt&lt;br /&gt;
&lt;br /&gt;
с паролем&lt;br /&gt;
&lt;br /&gt;
 Pa$$word&lt;br /&gt;
&lt;br /&gt;
и адресом внешнего DNS сервера&lt;br /&gt;
&lt;br /&gt;
 8.8.8.8&lt;br /&gt;
&lt;br /&gt;
команда создания домена будет такой:&lt;br /&gt;
&lt;br /&gt;
 samba-tool domain provision --realm=domain.alt --domain domain --adminpass='Pa$$word' --dns-backend=SAMBA_INTERNAL --server-role=dc --option=&amp;quot;dns forwarder=8.8.8.8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Включение сервиса и проверка работы домена==&lt;br /&gt;
&lt;br /&gt;
Включение&lt;br /&gt;
&lt;br /&gt;
 systemctl enable --now samba&lt;br /&gt;
&lt;br /&gt;
Проверка&lt;br /&gt;
&lt;br /&gt;
 samba-tool domain info 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
В ответ должно прилететь что-то типа этого:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Forest           : domain.alt&lt;br /&gt;
Domain           : domain.alt&lt;br /&gt;
Netbios domain   : DOMAIN&lt;br /&gt;
DC name          : dc.domain.alt&lt;br /&gt;
DC netbios name  : DC&lt;br /&gt;
Server site      : Default-First-Site-Name&lt;br /&gt;
Client site      : Default-First-Site-Name&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Настройка Kerberos==&lt;br /&gt;
&lt;br /&gt;
 /bin/cp /var/lib/samba/private/krb5.conf /etc/krb5.conf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Управление пользователями из командной строки==&lt;br /&gt;
&lt;br /&gt;
===Создать пользователя с паролем===&lt;br /&gt;
&lt;br /&gt;
Например, создаём пользователя ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
 samba-tool user create ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
Устанавливаем срок действия пароля&lt;br /&gt;
&lt;br /&gt;
 samba-tool user setexpiry ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
Создаём пользователя с указанием полного имени, адреса электронной почты и пароль будет действовать всегда&lt;br /&gt;
&lt;br /&gt;
 samba-tool user create ivanov_ivan --given-name='Иванов Иван' --mail-address='ivanovi@mail.ru'&lt;br /&gt;
 samba-tool user setexpiry ivanov_ivan --noexpiry&lt;br /&gt;
&lt;br /&gt;
===Удалить пользователя===&lt;br /&gt;
&lt;br /&gt;
 samba-tool user delete ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
===Отключить пользователя===&lt;br /&gt;
&lt;br /&gt;
 samba-tool user disable ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
===Включить пользователя===&lt;br /&gt;
&lt;br /&gt;
 samba-tool user enable ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
===Изменить пароль пользователя===&lt;br /&gt;
&lt;br /&gt;
 samba-tool user setpassword ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
===Просмотреть доступных пользователей===&lt;br /&gt;
&lt;br /&gt;
 samba-tool user list&lt;br /&gt;
&lt;br /&gt;
===Просмотр информации о пользователе===&lt;br /&gt;
&lt;br /&gt;
 samba-tool user show ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
или, чтобы узнать UID и GID (например, для установки владельца на каталог samba)&lt;br /&gt;
&lt;br /&gt;
 wbinfo -i ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
в ответ должно прийти что-то типа&lt;br /&gt;
&lt;br /&gt;
 DOMAIN\ivanov_ivan:*:3000023:100::/home/DOMAIN.ALT/ivanov_ivan:/bin/bash&lt;br /&gt;
&lt;br /&gt;
где UID это 3000023 а GID это 100&lt;br /&gt;
&lt;br /&gt;
===Создание домашнего каталога для пользователя===&lt;br /&gt;
&lt;br /&gt;
Пока вручную. Ведётся работа над интеграцией соответствующего скрипта в процесс добавления пользователя в SAMBA&lt;br /&gt;
&lt;br /&gt;
Перед выполнением команд добавления домашнего каталога на основе /etc/skel конкретно в контексте этой статьи нужно добавить в /etc/skel каталог, который позже буде монтироваться каждому пользователю посредством pam_mount. Для этого нужно выполнить команду&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/skel/share&lt;br /&gt;
&lt;br /&gt;
далее на базе скелетона создаём каталог&lt;br /&gt;
&lt;br /&gt;
 cp -rp /etc/skel /home/DOMAIN.ALT/ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
потом меняем пользователя владельца и группу владельца на этот каталог на базе информации из wbinfo (пример команды -- выше)&lt;br /&gt;
&lt;br /&gt;
 chown 3000023:100 /home/DOMAIN.ALT/ivanov_ivan -R&lt;br /&gt;
&lt;br /&gt;
===Создание домашнего каталога для пользователя при первом входе===&lt;br /&gt;
&lt;br /&gt;
В контексте этой статьи это решается запуском скрипта через параметр&lt;br /&gt;
&lt;br /&gt;
 root preexec = /usr/local/samba/bin/create_homedir %U&lt;br /&gt;
&lt;br /&gt;
, добавленный к ресурсу&lt;br /&gt;
&lt;br /&gt;
 [share]&lt;br /&gt;
&lt;br /&gt;
Задача, которую решает этот скрипт -- создание домашних каталогов для доменных пользователей на основе скелетона /etc/skel. В будущем это будет нужно для монтирования каталогов на клиентских машинах посредством pam_mount.&lt;br /&gt;
&lt;br /&gt;
Полный конфиг ресурса&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[share]&lt;br /&gt;
        path = /home/DOMAIN.ALT/%U/share&lt;br /&gt;
        root preexec = /usr/local/samba/bin/create_homedir %U&lt;br /&gt;
        read only = No&lt;br /&gt;
        browseable = yes&lt;br /&gt;
        writable = yes&lt;br /&gt;
        valid users = &amp;quot;@DOMAIN\Domain Users&amp;quot; &amp;quot;@DOMAIN\Domain Admins&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметр указывает на выполнение скрипта, параметром в который прилетает имя пользователя. Создаём скрипт&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /usr/local/samba/bin/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; /usr/local/samba/bin/create_homedir &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
[ -z ${1} ] &amp;amp;&amp;amp; echo &amp;quot;Try: $0 &amp;lt;username&amp;gt;&amp;quot; &amp;amp;&amp;amp; exit 1&lt;br /&gt;
user=&amp;quot;${1}&amp;quot;&lt;br /&gt;
homepath=&amp;quot;/home/DOMAIN.ALT/${user}&amp;quot;&lt;br /&gt;
[ -d ${homepath} ] || /bin/cp -rp /etc/skel ${homepath}&lt;br /&gt;
[ -d ${homepath} ] &amp;amp;&amp;amp; /bin/chown `wbinfo -i ${user} | awk -F ':' {'print $3 &amp;quot;:&amp;quot; $4'}` ${homepath} -R&lt;br /&gt;
exit 0&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 chmod +x /usr/local/samba/bin/create_homedir&lt;br /&gt;
&lt;br /&gt;
 mkdir /home/DOMAIN.ALT&lt;br /&gt;
&lt;br /&gt;
Теперь при обращении пользователя к ресурсу [share] от суперпользователя будет запускаться скрипт, который:&lt;br /&gt;
&lt;br /&gt;
1. Создаёт домашний каталог на основе /etc/skel (создаёт, только, если каталога несуществует)&lt;br /&gt;
&lt;br /&gt;
2. Обновляет пользователя-владельца и группу-владельца для созданного каталога. UID пользователя-владельца и GID группы-владельца скрипт получает из команды (обновляет, только если каталог существует)&lt;br /&gt;
 wbinfo -i ${user} | awk -F ':' {'print $3 &amp;quot;:&amp;quot; $4'}&lt;br /&gt;
&lt;br /&gt;
==Запуск ADMC==&lt;br /&gt;
&lt;br /&gt;
 Для корректной работы приложения ADMC необходимо получить билет Kerberos командой&lt;br /&gt;
&lt;br /&gt;
 kinit Administrator&lt;br /&gt;
&lt;br /&gt;
В ответ необходимо ввести пароль от доменного администратора&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Чтобы это автоматизировать, можно, например, сделать скрипт автоматического запуска admc&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; /opt/admc.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
echo 'Pa$$word' | kinit Administrator&lt;br /&gt;
admc&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
chmod +x /opt/admc.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если необходимо, то:&lt;br /&gt;
&lt;br /&gt;
 ln -s /opt/admc.sh /home/administrator/Рабочий\ стол/&lt;br /&gt;
&lt;br /&gt;
=Порядок ввода в домен компьютера под управлением ОС Альт Стартеркит MATE=&lt;br /&gt;
&lt;br /&gt;
==Подготовка==&lt;br /&gt;
&lt;br /&gt;
Устанавливаем пакеты&lt;br /&gt;
&lt;br /&gt;
 apt-get install alterator-auth sssd-ad samba-common-tools realmd&lt;br /&gt;
&lt;br /&gt;
Выставляем часовой пояс и синхронизируем время&lt;br /&gt;
&lt;br /&gt;
 timedatectl set-timezone Europe/Moscow&lt;br /&gt;
 ntpdate pool.ntp.org&lt;br /&gt;
&lt;br /&gt;
Задаём имя хоста&lt;br /&gt;
&lt;br /&gt;
 hostnamectl set-hostname host-arm01&lt;br /&gt;
&lt;br /&gt;
Также проверить и при необходимости поправить имя хоста в файле&lt;br /&gt;
&lt;br /&gt;
 /etc/sysconfig/network&lt;br /&gt;
&lt;br /&gt;
Перезагрузиться для проверки&lt;br /&gt;
&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
==Ввод компьютера в домен одной командой==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Команда ввода компьютера с именем хоста&lt;br /&gt;
&lt;br /&gt;
 host-arm01&lt;br /&gt;
&lt;br /&gt;
в домен&lt;br /&gt;
&lt;br /&gt;
 domain.alt&lt;br /&gt;
&lt;br /&gt;
с паролем&lt;br /&gt;
&lt;br /&gt;
 Pa$$word&lt;br /&gt;
&lt;br /&gt;
будет такой:&lt;br /&gt;
&lt;br /&gt;
 system-auth write ad domain.alt host-arm01 domain 'administrator' 'Pa$$word'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Включить применение групповых политик==&lt;br /&gt;
&lt;br /&gt;
 apt-get install -y gpupdate alterator-auth alterator-gpupdate&lt;br /&gt;
&lt;br /&gt;
 gpupdate-setup write enable workstation&lt;br /&gt;
&lt;br /&gt;
==Вывод компьютера из домена==&lt;br /&gt;
&lt;br /&gt;
В контексте этой статьи компьютер из домена выводится командой, вводимой на самом компьютере (не на сервере):&lt;br /&gt;
&lt;br /&gt;
 realm leave domain.alt Administrator&lt;br /&gt;
&lt;br /&gt;
Проверка текущего типа аутентификации&lt;br /&gt;
&lt;br /&gt;
 control system-auth&lt;br /&gt;
&lt;br /&gt;
=Монтирование каталогов по SAMBA=&lt;br /&gt;
&lt;br /&gt;
==На сервере==&lt;br /&gt;
&lt;br /&gt;
===Добавляем параметры в конфиг самбы и перезапускаем сервис===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt;&amp;gt; /etc/samba/smb.conf&lt;br /&gt;
[share]&lt;br /&gt;
	path = /home/DOMAIN.ALT/%U/share&lt;br /&gt;
	read only = No&lt;br /&gt;
	browseable = yes&lt;br /&gt;
	writable = yes&lt;br /&gt;
	valid users = &amp;quot;@DOMAIN\Domain Users&amp;quot; &amp;quot;@DOMAIN\Domain Admins&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 systemctl restart samba&lt;br /&gt;
&lt;br /&gt;
==На клиентском компьютере, введённом в домен==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Устанавливаем необходимые пакеты===&lt;br /&gt;
&lt;br /&gt;
 apt-get install -y pam_mount cifs-utils systemd-settings-enable-kill-user-processes pam_script mate-file-manager-extensions fuse-smb gvfs-backend-smb&lt;br /&gt;
&lt;br /&gt;
===Конфигурируем PAM===&lt;br /&gt;
&lt;br /&gt;
Готовая команда для создания рабочего конфига&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; /etc/pam.d/system-auth-sss&lt;br /&gt;
#%PAM-1.0&lt;br /&gt;
&lt;br /&gt;
auth [success=5 perm_denied=ignore default=die] pam_localuser.so&lt;br /&gt;
auth [success=1 default=bad] pam_succeed_if.so uid &amp;gt;= 500 quiet&lt;br /&gt;
auth [default=1] pam_permit.so&lt;br /&gt;
auth optional pam_mount.so&lt;br /&gt;
auth substack system-auth-sss-only&lt;br /&gt;
auth [default=1] pam_permit.so&lt;br /&gt;
auth substack system-auth-local-only&lt;br /&gt;
auth substack system-auth-common&lt;br /&gt;
#auth optional pam_exec.so expose_authtok /opt/pam_exec_hook_auth&lt;br /&gt;
&lt;br /&gt;
account [success=4 perm_denied=ignore default=die] pam_localuser.so&lt;br /&gt;
account [success=1 default=bad] pam_succeed_if.so uid &amp;gt;= 500 quiet&lt;br /&gt;
account [default=1] pam_permit.so&lt;br /&gt;
account substack system-auth-sss-only&lt;br /&gt;
account [default=1] pam_permit.so&lt;br /&gt;
account substack system-auth-local-only&lt;br /&gt;
account substack system-auth-common&lt;br /&gt;
&lt;br /&gt;
password [success=4 perm_denied=ignore default=die] pam_localuser.so&lt;br /&gt;
password [success=1 default=bad] pam_succeed_if.so uid &amp;gt;= 500 quiet&lt;br /&gt;
password [default=1] pam_permit.so&lt;br /&gt;
password substack system-auth-sss-only&lt;br /&gt;
password [default=1] pam_permit.so&lt;br /&gt;
password substack system-auth-local-only&lt;br /&gt;
password substack system-auth-common&lt;br /&gt;
&lt;br /&gt;
session [success=5 perm_denied=ignore default=die] pam_localuser.so&lt;br /&gt;
session [success=1 default=bad] pam_succeed_if.so uid &amp;gt;= 500 quiet&lt;br /&gt;
session [default=1] pam_permit.so&lt;br /&gt;
session required pam_mkhomedir.so silent&lt;br /&gt;
session optional pam_mount.so disable_interactive&lt;br /&gt;
session substack system-auth-sss-only&lt;br /&gt;
session [default=1] pam_permit.so&lt;br /&gt;
session substack system-auth-local-only&lt;br /&gt;
session substack system-auth-common&lt;br /&gt;
session optional pam_script.so&lt;br /&gt;
#session optional pam_exec.so /opt/pam_exec_hook_session&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если этого конфига недостаточно чтобы заработало монтирование через pam_mount, то добавить эти две строчки&lt;br /&gt;
&lt;br /&gt;
 session         [success=1 default=ignore] pam_succeed_if.so  service = systemd-user&lt;br /&gt;
 session         optional        pam_mount.so disable_interactive&lt;br /&gt;
&lt;br /&gt;
в конец файла&lt;br /&gt;
&lt;br /&gt;
 /etc/pam.d/system-auth&lt;br /&gt;
&lt;br /&gt;
====Добавляем скрипт в pam_script====&lt;br /&gt;
&lt;br /&gt;
Практика показала, что при завершении пользователем сеанса НЕ происходит отмонтирования сетевого каталога share. Поэтому пришлось дополнительно использовать pam_script и настроить для завершения сессии вот такой скрипт, который выполняет команду отмонтирования при завершении сессии (который, в отличии от &amp;lt;cifsumount&amp;gt;&amp;lt;/cifsumount&amp;gt; секции в конфиге pam_mount, работает корректно!).&lt;br /&gt;
&lt;br /&gt;
Готовая команда для создания скрипта&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; /etc/pam-script/pam-script.d/umount_share_if_ses_close&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
systemd-mount -u /home/DOMAIN.ALT/${PAM_USER}/share&lt;br /&gt;
exit 0&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Разрешаем для всех доступ к fuse под root===&lt;br /&gt;
&lt;br /&gt;
 control fusermount public&lt;br /&gt;
&lt;br /&gt;
===Проверка доступности ресурсов для пользователя===&lt;br /&gt;
&lt;br /&gt;
В приведённой ниже команде проверяются ресурсы пользователя ivanov_ivan:&lt;br /&gt;
&lt;br /&gt;
 smbclient -L dc.domain.alt -U ivanov_ivan -m SMB2&lt;br /&gt;
&lt;br /&gt;
===Монтирование ресурса вручную===&lt;br /&gt;
&lt;br /&gt;
В приведённой ниже команде проверяются монтирование ресурса вручную для пользователя ivanov_ivan:&lt;br /&gt;
&lt;br /&gt;
 mount.cifs //dc.domain.alt/share ~/share -o vers=2.0,user=ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
Под вошедшим в ведённый в домен компьютер пользователем ivanov_ivan команда должна монтировать ресурс без запроса пароля!&lt;br /&gt;
&lt;br /&gt;
Если проверка и монтирование вручную работает корректно, то можно настраивать pam_mount&lt;br /&gt;
&lt;br /&gt;
====Конфигурируем pam_mount====&lt;br /&gt;
&lt;br /&gt;
Делаем бэкап&lt;br /&gt;
&lt;br /&gt;
 cp /etc/security/pam_mount.conf.xml /etc/security/pam_mount.conf.xml.orig&lt;br /&gt;
&lt;br /&gt;
Создаём сразу готовый файл конфигурации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; /etc/security/pam_mount.conf.xml&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE pam_mount SYSTEM &amp;quot;pam_mount.conf.xml.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pam_mount&amp;gt;&lt;br /&gt;
    &amp;lt;debug enable=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;volume uid=&amp;quot;10000-2000200000&amp;quot; fstype=&amp;quot;cifs&amp;quot; server=&amp;quot;dc.domain.alt&amp;quot; path=&amp;quot;share&amp;quot; mountpoint=&amp;quot;~/share&amp;quot; options=&amp;quot;sec=krb5,cruid=%(USERUID),nounix,uid=%(USERUID),gid=%(USERGID),file_mode=0664,dir_mode=0775&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;cifsmount&amp;gt;/sbin/mount.cifs //%(SERVER)/%(VOLUME) %(MNTPT) -o %(OPTIONS)&amp;lt;/cifsmount&amp;gt;&lt;br /&gt;
    &amp;lt;mntoptions allow=&amp;quot;nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other,sec&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mntoptions require=&amp;quot;nosuid,nodev&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;logout wait=&amp;quot;0&amp;quot; hup=&amp;quot;no&amp;quot; term=&amp;quot;no&amp;quot; kill=&amp;quot;no&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mkmountpoint enable=&amp;quot;1&amp;quot; remove=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pam_mount&amp;gt;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Основной принцип работы===&lt;br /&gt;
&lt;br /&gt;
В контексте данной статьи сервер и pam_mount на клиентской машине настроены таким образом, чтобы при входе доменного пользователя в систему в домашний каталог этого пользователя автоматически подключался ресурс, который на компьютере пользователя будет находиться в каталоге&lt;br /&gt;
&lt;br /&gt;
 /home/DOMAIN.ALT/ivanov_ivan/share&lt;br /&gt;
&lt;br /&gt;
и будет смонтирован в каталог на сервере с точно таким же расположением, т.е.&lt;br /&gt;
&lt;br /&gt;
 /home/DOMAIN.ALT/ivanov_ivan/share&lt;br /&gt;
&lt;br /&gt;
Следовательно, локально пользователь ivanov_ivan будет работать на конкретной машине, введённой в домен в локальном каталоге&lt;br /&gt;
&lt;br /&gt;
 /home/DOMAIN.ALT/ivanov_ivan&lt;br /&gt;
&lt;br /&gt;
и результат работы будет сохраняться только на локальной машине.&lt;br /&gt;
&lt;br /&gt;
Но файлы, с которыми пользователь ivanov_ivan работает на локальной машине A именно в каталоге&lt;br /&gt;
&lt;br /&gt;
 /home/DOMAIN.ALT/ivanov_ivan/share&lt;br /&gt;
&lt;br /&gt;
, будут фактически сохраняться в каталоге&lt;br /&gt;
&lt;br /&gt;
 /home/DOMAIN.ALT/ivanov_ivan/share&lt;br /&gt;
&lt;br /&gt;
файлового сервера на машине контроллера домена (и не будут сохраняться в таком же каталоге локальной машины) и в случае, когда пользователь ivanov_ivan будет работать на машине B, введённой в этот же домен, то в каталоге &lt;br /&gt;
 &lt;br /&gt;
 /home/DOMAIN.ALT/ivanov_ivan/share&lt;br /&gt;
&lt;br /&gt;
пользователю ivanov_ivan будут доступны те же файлы, с которыми он работал на машине A.&lt;br /&gt;
&lt;br /&gt;
=Готовые конфиги для клиента и сервера, в контексте задачи, описанной в данной статье=&lt;br /&gt;
&lt;br /&gt;
==Для сервера==&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/samba/smb.conf===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Global parameters&lt;br /&gt;
[global]&lt;br /&gt;
	dns forwarder = 8.8.8.8&lt;br /&gt;
	netbios name = DC&lt;br /&gt;
	realm = DOMAIN.ALT&lt;br /&gt;
	server role = active directory domain controller&lt;br /&gt;
	workgroup = DOMAIN&lt;br /&gt;
&lt;br /&gt;
[sysvol]&lt;br /&gt;
	path = /var/lib/samba/sysvol&lt;br /&gt;
	read only = No&lt;br /&gt;
&lt;br /&gt;
[netlogon]&lt;br /&gt;
	path = /var/lib/samba/sysvol/domain.alt/scripts&lt;br /&gt;
	read only = No&lt;br /&gt;
&lt;br /&gt;
[share]&lt;br /&gt;
	path = /home/DOMAIN.ALT/%U/share&lt;br /&gt;
	root preexec = /usr/local/samba/bin/create_homedir %U&lt;br /&gt;
	read only = No&lt;br /&gt;
	browseable = yes&lt;br /&gt;
	writable = yes&lt;br /&gt;
	valid users = &amp;quot;@DOMAIN\Domain Users&amp;quot; &amp;quot;@DOMAIN\Domain Admins&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Вывод команды testparm===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Load smb config files from /etc/samba/smb.conf&lt;br /&gt;
Loaded services file OK.&lt;br /&gt;
Weak crypto is allowed&lt;br /&gt;
&lt;br /&gt;
Server role: ROLE_ACTIVE_DIRECTORY_DC&lt;br /&gt;
&lt;br /&gt;
Press enter to see a dump of your service definitions&lt;br /&gt;
&lt;br /&gt;
# Global parameters&lt;br /&gt;
[global]&lt;br /&gt;
	dns forwarder = 8.8.8.8&lt;br /&gt;
	passdb backend = samba_dsdb&lt;br /&gt;
	realm = DOMAIN.ALT&lt;br /&gt;
	server role = active directory domain controller&lt;br /&gt;
	workgroup = DOMAIN&lt;br /&gt;
	rpc_server:tcpip = no&lt;br /&gt;
	rpc_daemon:spoolssd = embedded&lt;br /&gt;
	rpc_server:spoolss = embedded&lt;br /&gt;
	rpc_server:winreg = embedded&lt;br /&gt;
	rpc_server:ntsvcs = embedded&lt;br /&gt;
	rpc_server:eventlog = embedded&lt;br /&gt;
	rpc_server:srvsvc = embedded&lt;br /&gt;
	rpc_server:svcctl = embedded&lt;br /&gt;
	rpc_server:default = external&lt;br /&gt;
	winbindd:use external pipes = true&lt;br /&gt;
	idmap config * : backend = tdb&lt;br /&gt;
	map archive = No&lt;br /&gt;
	vfs objects = dfs_samba4 acl_xattr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[sysvol]&lt;br /&gt;
	path = /var/lib/samba/sysvol&lt;br /&gt;
	read only = No&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[netlogon]&lt;br /&gt;
	path = /var/lib/samba/sysvol/domain.alt/scripts&lt;br /&gt;
	read only = No&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[share]&lt;br /&gt;
	path = /home/DOMAIN.ALT/%U/share&lt;br /&gt;
	read only = No&lt;br /&gt;
	root preexec = /usr/local/samba/bin/create_homedir %U&lt;br /&gt;
	valid users = &amp;quot;@DOMAIN\Domain Users&amp;quot; &amp;quot;@DOMAIN\Domain Admins&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Файл /usr/local/samba/bin/create_homedir===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
[ -z ${1} ] &amp;amp;&amp;amp; echo &amp;quot;Try: $0 &amp;lt;username&amp;gt;&amp;quot; &amp;amp;&amp;amp; exit 1&lt;br /&gt;
user=&amp;quot;${1}&amp;quot;&lt;br /&gt;
homepath=&amp;quot;/home/DOMAIN.ALT/${user}&amp;quot;&lt;br /&gt;
[ -d ${homepath} ] || /bin/cp -rp /etc/skel ${homepath}&lt;br /&gt;
[ -d ${homepath} ] &amp;amp;&amp;amp; /bin/chown `wbinfo -i ${user} | awk -F ':' {'print $3 &amp;quot;:&amp;quot; $4'}` ${homepath} -R&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/krb5.conf===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[libdefaults]&lt;br /&gt;
	default_realm = DOMAIN.ALT&lt;br /&gt;
	dns_lookup_realm = false&lt;br /&gt;
	dns_lookup_kdc = true&lt;br /&gt;
&lt;br /&gt;
[realms]&lt;br /&gt;
DOMAIN.ALT = {&lt;br /&gt;
	default_domain = domain.alt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[domain_realm]&lt;br /&gt;
	dc = DOMAIN.ALT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/sysconfig/network===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# When set to no, this may cause most daemons' initscripts skip starting.&lt;br /&gt;
NETWORKING=yes&lt;br /&gt;
&lt;br /&gt;
# Used by hotplug/pcmcia/ifplugd scripts to detect current network config&lt;br /&gt;
# subsystem.&lt;br /&gt;
CONFMETHOD=etcnet&lt;br /&gt;
&lt;br /&gt;
# Used by rc.sysinit to setup system hostname at boot.&lt;br /&gt;
HOSTNAME=dc.alt&lt;br /&gt;
&lt;br /&gt;
# This is used by ALTLinux ppp-common to decide if we want to install&lt;br /&gt;
# nameserver lines into /etc/resolv.conf or not.&lt;br /&gt;
RESOLV_MODS=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/resolv.conf===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Generated by resolvconf&lt;br /&gt;
# Do not edit manually, use&lt;br /&gt;
# /etc/net/ifaces/&amp;lt;interface&amp;gt;/resolv.conf instead.&lt;br /&gt;
search domain.alt&lt;br /&gt;
nameserver 127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/hosts===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.249 dc.domain.alt domain.alt&lt;br /&gt;
127.0.0.1	localhost&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/hostname===&lt;br /&gt;
&lt;br /&gt;
 dc.domain.alt&lt;br /&gt;
&lt;br /&gt;
===Файл /opt/admc.sh===&lt;br /&gt;
&lt;br /&gt;
Файл не обязательный. Просто синтаксический сахар для запуска admc без необходимости выполнять вручную kinit Administrator и вводить пароль.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
echo 'Pa$$word' | kinit Administrator&lt;br /&gt;
admc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разместить симлинк на этот файл можно, например, так&lt;br /&gt;
&lt;br /&gt;
 ln -s /opt/admc.sh /home/administrator/Рабочий\ стол/&lt;br /&gt;
&lt;br /&gt;
==Для клиента==&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/resolv.conf===&lt;br /&gt;
&lt;br /&gt;
В этом примере файла адрес DNS сервера должен быть адресом домена, в который необходимо вводить клиента. Выше описана процедура развёртывания домена и сделан акцент на том, что домен через себя должен пропускать работу DNS сервера. Если DNS сервер не будет узнавать контроллер домена по имени, процедура ввода завершится с ошибкой.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/resolv.conf&lt;br /&gt;
# Generated by resolvconf&lt;br /&gt;
# Do not edit manually, use&lt;br /&gt;
# /etc/net/ifaces/&amp;lt;interface&amp;gt;/resolv.conf instead.&lt;br /&gt;
search domain.alt&lt;br /&gt;
nameserver 192.168.0.249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/hosts===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
127.0.0.1	localhost.localdomain localhost&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/hostname===&lt;br /&gt;
&lt;br /&gt;
 host-arm01.domain.alt&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/sysconfig/network===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# When set to no, this may cause most daemons' initscripts skip starting.&lt;br /&gt;
NETWORKING=yes&lt;br /&gt;
&lt;br /&gt;
# Used by hotplug/pcmcia/ifplugd scripts to detect current network config&lt;br /&gt;
# subsystem.&lt;br /&gt;
CONFMETHOD=etcnet&lt;br /&gt;
&lt;br /&gt;
# Used by rc.sysinit to setup system hostname at boot.&lt;br /&gt;
HOSTNAME=host-arm01.domain.alt&lt;br /&gt;
&lt;br /&gt;
# This is used by ALTLinux ppp-common to decide if we want to install&lt;br /&gt;
# nameserver lines into /etc/resolv.conf or not.&lt;br /&gt;
RESOLV_MODS=yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/pam.d/system-auth-sss===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#%PAM-1.0&lt;br /&gt;
&lt;br /&gt;
auth [success=5 perm_denied=ignore default=die] pam_localuser.so&lt;br /&gt;
auth [success=1 default=bad] pam_succeed_if.so uid &amp;gt;= 500 quiet&lt;br /&gt;
auth [default=1] pam_permit.so&lt;br /&gt;
auth optional pam_mount.so&lt;br /&gt;
auth substack system-auth-sss-only&lt;br /&gt;
auth [default=1] pam_permit.so&lt;br /&gt;
auth substack system-auth-local-only&lt;br /&gt;
auth substack system-auth-common&lt;br /&gt;
&lt;br /&gt;
account [success=4 perm_denied=ignore default=die] pam_localuser.so&lt;br /&gt;
account [success=1 default=bad] pam_succeed_if.so uid &amp;gt;= 500 quiet&lt;br /&gt;
account [default=1] pam_permit.so&lt;br /&gt;
account substack system-auth-sss-only&lt;br /&gt;
account [default=1] pam_permit.so&lt;br /&gt;
account substack system-auth-local-only&lt;br /&gt;
account substack system-auth-common&lt;br /&gt;
&lt;br /&gt;
password [success=4 perm_denied=ignore default=die] pam_localuser.so&lt;br /&gt;
password [success=1 default=bad] pam_succeed_if.so uid &amp;gt;= 500 quiet&lt;br /&gt;
password [default=1] pam_permit.so&lt;br /&gt;
password substack system-auth-sss-only&lt;br /&gt;
password [default=1] pam_permit.so&lt;br /&gt;
password substack system-auth-local-only&lt;br /&gt;
password substack system-auth-common&lt;br /&gt;
&lt;br /&gt;
session [success=5 perm_denied=ignore default=die] pam_localuser.so&lt;br /&gt;
session [success=1 default=bad] pam_succeed_if.so uid &amp;gt;= 500 quiet&lt;br /&gt;
session [default=1] pam_permit.so&lt;br /&gt;
session required pam_mkhomedir.so silent&lt;br /&gt;
session optional pam_mount.so disable_interactive&lt;br /&gt;
session substack system-auth-sss-only&lt;br /&gt;
session [default=1] pam_permit.so&lt;br /&gt;
session substack system-auth-local-only&lt;br /&gt;
session substack system-auth-common&lt;br /&gt;
session optional pam_script.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/security/pam_mount.conf.xml===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE pam_mount SYSTEM &amp;quot;pam_mount.conf.xml.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pam_mount&amp;gt;&lt;br /&gt;
    &amp;lt;debug enable=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;volume uid=&amp;quot;10000-2000200000&amp;quot; fstype=&amp;quot;cifs&amp;quot; server=&amp;quot;dc.domain.alt&amp;quot; path=&amp;quot;share&amp;quot; mountpoint=&amp;quot;~/share&amp;quot; options=&amp;quot;sec=krb5,cruid=%(USERUID),nounix,uid=%(USERUID),gid=%(USERGID),file_mode=0664,dir_mode=0775&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;cifsmount&amp;gt;/sbin/mount.cifs //%(SERVER)/%(VOLUME) %(MNTPT) -o %(OPTIONS)&amp;lt;/cifsmount&amp;gt;&lt;br /&gt;
    &amp;lt;mntoptions allow=&amp;quot;nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other,sec&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mntoptions require=&amp;quot;nosuid,nodev&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;logout wait=&amp;quot;0&amp;quot; hup=&amp;quot;no&amp;quot; term=&amp;quot;no&amp;quot; kill=&amp;quot;no&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;mkmountpoint enable=&amp;quot;1&amp;quot; remove=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pam_mount&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Файл /etc/pam-script/pam-script.d/umount_share_if_ses_close===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
systemd-mount -u /home/DOMAIN.ALT/${PAM_USER}/share&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Пакетное добавление пользователей=&lt;br /&gt;
&lt;br /&gt;
==Формат файла для импорта==&lt;br /&gt;
&lt;br /&gt;
На примере файла с тремя пользователями...&lt;br /&gt;
&lt;br /&gt;
Такой файл можно получить, например, на основе электронной таблицы .ods или .xls(x)&lt;br /&gt;
&lt;br /&gt;
Формат и порядок столбцов данных следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
фамилия,имя,отчество,логин,емэйл,пароль&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл демонстрирует то, что импортируемые пользователи могут не содержать имени или отчества, но на месте фамилии обязательно должен присутствовать какой-либо текст, должен быть обязательно логин, емэйл и пароль&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; /opt/users.csv &lt;br /&gt;
Петрова,Мария,Ивановна,petrova_mi,petrova_mi@mail.ru,Qwe123!@#&lt;br /&gt;
Сидоров,Иван,,sidorov_i,sidorov_i@mail.ru,Qwe123!@#&lt;br /&gt;
Вася,,,vasya,vasya@mail.ru,Qwe123!@#&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Скрипт для пакетного импорта==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; 'EOF' &amp;gt; /opt/batch_create_dc_users.sh &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
while read -r line;&lt;br /&gt;
do&lt;br /&gt;
f=`echo $line | awk -F ',' {'print $1'}`&lt;br /&gt;
i=`echo $line | awk -F ',' {'print $2'}`&lt;br /&gt;
o=`echo $line | awk -F ',' {'print $3'}`&lt;br /&gt;
login=`echo $line | awk -F ',' {'print $4'}`&lt;br /&gt;
email=`echo $line | awk -F ',' {'print $5'}`&lt;br /&gt;
password=`echo $line | awk -F ',' {'print $6'}`&lt;br /&gt;
&lt;br /&gt;
if [ -z $i ] &amp;amp;&amp;amp; [ -z $o ]; then&lt;br /&gt;
samba-tool user create &amp;quot;${login}&amp;quot; &amp;quot;${password}&amp;quot; --surname=&amp;quot;${f}&amp;quot; --mail-address=&amp;quot;${email}&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
given_name=''&lt;br /&gt;
if [ -z $o ]; then&lt;br /&gt;
given_name=&amp;quot;${i}&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
given_name=&amp;quot;${i} ${o}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
samba-tool user create &amp;quot;${login}&amp;quot; &amp;quot;${password}&amp;quot; --surname=&amp;quot;${f}&amp;quot; --given-name=&amp;quot;${given_name}&amp;quot; --mail-address=&amp;quot;${email}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
samba-tool user setexpiry &amp;quot;${login}&amp;quot; --noexpiry&lt;br /&gt;
done &amp;lt; /opt/users.csv&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Запуск скрипта==&lt;br /&gt;
&lt;br /&gt;
 chmod +x /opt/batch_create_dc_users.sh&lt;br /&gt;
&lt;br /&gt;
 /opt/batch_create_dc_users.sh&lt;br /&gt;
&lt;br /&gt;
=Лайфхаки=&lt;br /&gt;
&lt;br /&gt;
Отключаем требование сложного пароля:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# samba-tool domain passwordsettings set --complexity=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Источники=&lt;br /&gt;
&lt;br /&gt;
В разном порядке использовались следующие источники&lt;br /&gt;
&lt;br /&gt;
[https://docs.altlinux.org/ru-RU/alt-kworkstation/10.0/html/alt-kworkstation/ch52s07.html]&lt;br /&gt;
&lt;br /&gt;
[https://docs.altlinux.org/ru-RU/alt-workstation/10.0/html/alt-workstation/ch44s06s02.html]&lt;br /&gt;
&lt;br /&gt;
[https://docs.altlinux.org/ru-RU/alt-kworkstation/10.0/html/alt-kworkstation/system-management--sambadc--chapter.html]&lt;br /&gt;
&lt;br /&gt;
[https://docs.altlinux.org/ru-RU/domain/10.2/html/samba/index.html]&lt;br /&gt;
&lt;br /&gt;
[https://www.altlinux.org/Fileserver_start]&lt;br /&gt;
&lt;br /&gt;
[https://www.altlinux.org/ActiveDirectory/DC#Troubleshooting]&lt;br /&gt;
&lt;br /&gt;
[https://docs.altlinux.org/ru-RU/domain/10.2/html/samba/ch07s09s02.html]&lt;br /&gt;
&lt;br /&gt;
[https://www.altlinux.org/ActiveDirectory/Login/DC]&lt;/div&gt;</summary>
		<author><name>Madnessman777</name></author>
		
	</entry>
</feed>