1
0
mirror of https://github.com/altlinux/admc.git synced 2025-02-13 05:57:40 +03:00

add .html manual generation from .wiki

delete old manual sources
closes #218
This commit is contained in:
Dmitry Degtyarev 2021-07-30 16:29:51 +04:00
parent 33d513382f
commit 57ce90a025
5 changed files with 962 additions and 40 deletions

View File

@ -1,21 +1,54 @@
set(ADMC_HELP_PROJECT ${CMAKE_CURRENT_SOURCE_DIR}/admc.qhp)
set(ADMC_HELP_WIKI ${CMAKE_CURRENT_SOURCE_DIR}/admc.wiki)
set(ADMC_HELP_PROJECT ${CMAKE_CURRENT_BINARY_DIR}/admc.qhp)
set(ADMC_COMPRESSED_HELP ${CMAKE_CURRENT_BINARY_DIR}/admc.qch)
find_package(Qt5 REQUIRED
COMPONENTS
Core
Help
)
add_executable(generate-manual
generate_manual.cpp
)
# NOTE: save generate-manual executable in the "doc" binary
# dir so that there's no error about unpackaged binaries in
# rpm build root
set_target_properties(generate-manual
PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
target_link_libraries(generate-manual
Qt5::Core
)
add_custom_command(
OUTPUT ${ADMC_HELP_PROJECT}
COMMAND generate-manual ${ADMC_HELP_WIKI} ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS generate-manual ${ADMC_HELP_WIKI}
)
# Test target that only generates the html files
add_custom_target(doc_html
ALL
DEPENDS ${ADMC_HELP_PROJECT} generate-manual
)
# NOTE: This also depends on all the generated .html files
# but we don't know their names so won't include them
# here...
add_custom_command(
OUTPUT ${ADMC_COMPRESSED_HELP}
COMMAND Qt5::qhelpgenerator ${ADMC_HELP_PROJECT} -o ${ADMC_COMPRESSED_HELP}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/*
DEPENDS ${ADMC_HELP_PROJECT}
)
add_custom_target(doc
ALL
DEPENDS ${ADMC_COMPRESSED_HELP}
DEPENDS ${ADMC_COMPRESSED_HELP} generate-manual
)
install(

View File

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<QtHelpProject version="1.0">
<namespace>alt.basealt.admc</namespace>
<virtualFolder>doc</virtualFolder>
<filterSection>
<toc>
<section title="ADMC" ref="index.html">
</section>
</toc>
<keywords>
</keywords>
<files>
<file>index.html</file>
</files>
</filterSection>
</QtHelpProject>

470
doc/admc.wiki Normal file
View File

@ -0,0 +1,470 @@
Инструмент '''ADMC''' был создан в качестве ответа на потребность в user-friendly инструменте для Linux для работы с доменом Active Directory и групповыми политиками. Проект находится в стадии активной разработки и ещё не готов для серьёзного применения.
'''ADMC''' предназначен для управления:
* объектами в домене (пользователями, группами, компьютерами, подразделениями);
* групповыми политиками.
== Запуск программы ==
Для использования программы необходимо сначала получить ключ Kerberos для администратора домена. Например, так:
<source>
$ kinit administrator
</source>
Далее запустить ADMC из меню («Системные»→«ADMC») или командой {{cmd|admc}}:
<source>
$ admc
</source>
[[File:admc1.png|Интерфейс ADMC]]
Для создания нового объекта (пользователь, группа, компьютер, организация) следует перейти в контейнер, в котором будет создан объект, далее в меню выбрать пункт «Действие»→«Создать»→Объект:
[[File:Admc-new2.png|ADMC. Меню «Действие»→«Создать»]]
Или в контекстном меню контейнера выбрать пункт «Создать»→Объект:
[[File:Admc-new1.png|ADMC. Контекстное меню контейнера]]
== Управление пользователями ==
Обратите внимание, что для доступа к некоторым операциям вы должны быть членом одной из этих групп: Account Operators, Domain Admins, Enterprise Admins.
=== Создание нового пользователя ===
# В контекстном меню контейнера выберите пункт «Создать»→«Пользователь».
# Откроется окно «Создать объект — Пользователь — ADMC»:
#:[[File:Admc-user-add.png|ADMC. Создание нового пользователя]]
# В поле «Имя» введите имя пользователя.
# В поле «Фамилия» введите фамилию пользователя.
# Измените поле «Полное имя», чтобы добавить отчество или поменять имя и фамилию местами.
# В поле «Инициалы» введите инициалы пользователя.
# В поле «Имя для входа» введите имя пользователя для входа (логин пользователя). Выберите домен имени входа в выпадающем списке.
# В поле «Имя для входа (пред-Windows 2000)» введите имя пользователя для входа в старые системы.
# В полях «Пароль» и «Подтвердите пароль» введите пароль пользователя.
# В разделе «Опции учетной записи» установите параметры учетной записи:
#* «Пользователь должен сменить пароль при следующем входе в систему» — пользователь должен изменить пароль при следующем входе в систему. Если эта опция включена, только пользователь будет знать свой пароль;
#* «Пользователь не может изменить пароль» — предотвращает изменение пароля пользователем;
#* «Пароль не истекает» — установить бессрочный пароль. Если эта опция включена, срок действия учетной записи пользователя не ограничен (по умолчанию срок действия пароля задан атрибутом minPwdAge);
#* «Учетная запись отключена» — отключить учетную запись пользователя. Если эта опция включена, пользователь не сможет войти в систему.
# Нажмите кнопку «Создать».
{{Note|При создании пользователя атрибут «Полное имя» по умолчанию создается в формате «Фамилия Имя». Формат автоматического заполнения поля «Полное имя» можно изменить в настройках:
[[File:Admc-user-settings.png|ADMC. Меню «Настройки»]]}}
=== Изменение учетной записи пользователя ===
Для изменения учетной записи пользователя следует в контекстном меню пользователя выбрать соответствующее действие:
[[File:Admc-user-edit1.png|ADMC. Контекстное меню пользователя]]
==== Переименовать пользователя ====
# В контекстном меню пользователя выберите пункт «Переименовать…».
# Откроется окно «Переименовать Объект — Пользователь — ADMC»:
#:[[File:Admc-user-edit.png|ADMC. Переименовать пользователя]]
# Если необходимо измените соответствующие поля.
# Нажмите кнопку «ОК» для сохранения изменений.
==== Изменить пароль пользователя ====
# В контекстном меню пользователя выберите пункт «Поменять пароль…».
# Откроется окно «Изменить Пароль — ADMC»:
#:[[File:Admc-user-changepassword.png|ADMC. Изменение пароля пользователя]]
# Введите пароль и подтвердите его.
# Если необходимо, чтобы пользователь изменил этот пароль при следующем входе в систему, установите отметку «Пользователь должен сменить пароль при следующем входе в систему».
# Установите отметку «Открыть учетную запись», если необходимо разблокировать учетную запись пользователя.
# Нажмите кнопку «ОК» для сохранения изменений.
==== Переместить пользователя ====
# В контекстном меню пользователя выбрать пункт «Переместить…».
# В диалоговом окне «Выберите контейнер — ADMC» выберите контейнер, в который следует переместить учетную запись пользователя.
#:[[File:Admc-user-move.png|ADMC. Диалоговое окно выбора контейнера]]
# Нажмите кнопку «ОК».
==== Включить/Выключить учетную запись пользователя ====
В контекстном меню пользователя, учетную запись которого вы хотите отключить или включить выберите пункт «Выключить учетную запись» или «Включить учетную запись» (в зависимости от состояния учетной записи будет доступно одно из этих действий).
==== Разблокировать учетную запись пользователя ====
# В контекстном меню пользователя выбрать пункт «Свойства».
# В диалоговом окне «Пользователь Свойства — ADMC» во вкладке «Учётная запись» отметьте пункт «Открыть учетную запись»:
#:[[File:Admc-user-settings1.png|ADMC. Разблокировать учетную запись пользователя]]
# Нажмите кнопку «ОК» или «Применить».
==== Удалить пользователя ====
# В контекстном меню пользователя выберите пункт «Удалить».
# Подтвердите удаление, нажав кнопку «Да»:
#:[[File:Admc-delete.png|ADMC. Подтверждение удаления объекта]]
==== Изменить параметры учетной записи пользователя ====
# В контекстном меню пользователя выберите пункт «Свойства».
# Перейдите на кладку «Учётная запись».
#:[[File:Admc-user-settings0.png|ADMC. Параметры учетной записи пользователя]]
# Измените параметры учетной записи:
#* «Имя для входа» — имя пользователя для входа (логин пользователя);
#* «Открыть учетную запись» — разблокировать учетную запись пользователя (если она была заблокирована, например, из-за слишком большого количества неудачных попыток входа);
#* «Срок действия учетной записи» — задать дату отключения учетной записи (по умолчанию «Никогда»);
#* «Время подключения…» — изменить время, в которое разрешен вход пользователя в домен (по умолчанию вход разрешен 24 часа в сутки, 7 дней в неделю);
#* «Подключение к компьютерам…» — задать компьютеры в домене, на которые будет разрешен вход пользователю (по умолчанию пользователь может входить на любую рабочую станцию, которая присоединена к домену);
#* Опции учетной записи:
#** «Учетная запись отключена» — отключить учетную запись пользователя. Если эта опция включена, пользователь не сможет войти в систему;
#** «Пользователь не может изменить пароль» — предотвращает изменение пароля пользователем;
#** «Пользователь должен сменить пароль при следующем входе в систему» — пользователь должен изменить пароль при следующем входе в систему. Если эта опция включена, только пользователь будет знать свой пароль;
#** «Пароль не истекает» — установить бессрочный пароль. Если эта опция включена, срок действия учетной записи пользователя не ограничен (по умолчанию срок действия пароля задан атрибутом minPwdAge);
#** «Хранить пароль с использованием обратимого шифрования» — определяет, используется ли операционной системой для хранения паролей обратимое шифрование. Эта политика обеспечивает поддержку приложений, использующих протоколы, требующие знание пароля пользователя для проверки подлинности;
#** «Смарт-карта необходима для интерактивного входа в систему» — определяет, требуется ли, чтобы у пользователя была смарт-карта, чтобы войти в систему. При этом пользователь не сможет выполнить вход введя имя пользователя и пароль на клавиатуре;
#** «Учетная запись является конфиденциальной и не может быть делегирована» — пользователю нельзя доверять делегирование полномочий;
#** «Не требовать предварительной аутентификации Kerberos» — для доступа к ресурсам сети не нужно предварительно проверять подлинность с помощью протокола Kerberos;
#** «Trusted for delegation» — позволяет службе, которая работает под этой учетной записью, выполнять операции от имени других учетных записей пользователей.
==== Редактировать разрешения пользователя ====
{{Note|Для возможности редактирования разрешений пользователя предварительно необходимо в меню «Настройки» отметить пункт «Дополнительные возможности».}}
# В контекстном меню пользователя выбрать пункт «Свойства».
# Перейти на кладку «Безопасность»:
#:[[File:Admc-user-settings3.png|ADMC. Параметры учетной записи пользователя — Вкладка «Безопасность»]]
== Управление группами ==
Группа состоит из учетных записей пользователей и компьютеров, контактов и других групп и может управляться как единое целое. Пользователи и компьютеры, входящие в определенную группу, являются членами группы.
=== Создание группы ===
# В контекстном меню контейнера выберите пункт «Создать»→«Группа».
# Откроется окно «Создать объект — Группа — ADMC»:
#:[[File:Admc-group-add.png|ADMC. Создание новой группы]]
# В поле «Имя» введите название группы.
# В поле «Имя входа (пред-Windows 2000)» введите название группы для старых систем.
# В выпадающем списке «Сфера группы» выберите область действия группы:
#* «Глобальная» — членами глобальной группы могут быть другие группы и учетные записи только из того домена, в котором определена группа. Членам этой группы разрешения могут назначаться в любом домене леса;
#* «Домен локальная» — членам такой группы разрешения могут назначаться только внутри домена (доступ к ресурсам одного домена);
#* «Универсальная» — членами универсальных групп могут быть другие группы и учетные записи из любого домена дерева доменов или леса. Членам такой группы разрешения могут назначаться в любом домене дерева доменов или леса.
# В выпадающем списке «Тип группы» выберите тип группы:
#* «Безопасность» — используется для назначения разрешений доступа к общим ресурсам;
#* «Рассылка» — используется для создания списков рассылки электронной почты.
# Нажмите кнопку «Создать».
=== Изменение группы ===
Для изменения группы следует в контекстном меню группы выбрать соответствующее действие:
[[File:Admc-group-edit1.png|ADMC. Контекстное меню группы]]
==== Добавить участника в группу ====
# В контекстном меню группы выбрать пункт «Добавить в группу…».
# Откроется окно «Выбрать объекты — ADMC»:
#:[[File:Admc-select.png|Диалоговое окно «Выбрать объекты — ADMC»]]
# Выберите объекты, которые вы хотите добавить в качестве участников.
==== Переименовать группу ====
# В контекстном меню группы выбрать пункт «Переименовать…».
# Откроется окно «Переименовать Объект — Группа — ADMC»:
#:[[File:Admc-group-rename.png|ADMC. Переименовать группу]]
# Если необходимо измените соответствующие поля.
# Нажмите кнопку «ОК» для сохранения изменений.
==== Изменить тип группы ====
# В контекстном меню группы выбрать пункт «Свойства».
# Откроется окно «Группа Свойства — ADMC»:
#:[[File:Admc-group-edit-type.png|ADMC. Изменить тип/сферу группы]]
# На вкладке «Общее» в выпадающем списке «Тип группы» измените тип группы.
# Нажмите кнопку «ОК» или «Применить» для сохранения изменений.
==== Изменить область группы ====
# В контекстном меню группы выбрать пункт «Свойства».
# Откроется окно «Группа Свойства — ADMC»:
#:[[File:Admc-group-edit-type.png|ADMC. Изменить тип/область действия группы]]
# На вкладке «Общее» в выпадающем списке «Область группы» измените область группы.
# Нажмите кнопку «ОК» или «Применить» для сохранения изменений.
==== Удалить группу ====
# В контекстном меню группы выберите пункт «Удалить».
# Подтвердите удаление, нажав кнопку «Да»:
#:[[File:Admc-delete.png|ADMC. Подтверждение удаления объекта]]
==== Найти группы, участником которых является пользователь ====
# В контекстном меню пользователя выбрать пункт «Свойства».
# На вкладке «Группы» диалогового окна «Свойства» будут отображаться группы, в которые входит данный пользователь:
#:[[File:Admc-user-settings2.png|ADMC. Группы пользователя]]
== Управление компьютерами ==
Учетные записи компьютеров представляют собой устройства, подключенные к AD.
=== Создание учетной записи компьютера ===
# В контекстном меню контейнера выберите пункт «Создать»→«Компьютер».
# Откроется окно «Создать Объект — Компьютер — ADMC»:
#:[[File:Admc-comp-add.png|ADMC. Создание учетной записи компьютера]]
# В поле «Имя» введите название компьютера.
# В поле «Имя входа (пред-Windows 2000)» введите название компьютера для старых систем.
# Нажмите кнопку «Создать».
=== Изменение учетной записи компьютера ===
Для изменения компьютера необходимо в контекстном меню компьютера выбрать соответствующее действие:
[[File:Admc-comp-edit.png|ADMC. Контекстное меню компьютера]]
==== Переименовать компьютер ====
# В контекстном меню компьютера выбрать пункт «Переименовать…».
# Откроется окно «Переименовать Объект — Компьютер — ADMC»:
#:[[File:Admc-comp-rename.png|ADMC. Переименовать объект компьютер]]
# Измените имя компьютера.
# Нажмите кнопку «ОК» для сохранения изменений.
==== Удалить учетную запись компьютера ====
# В контекстном меню компьютера выберите пункт «Удалить».
# Подтвердите удаление, нажав кнопку «Да»:
#:[[File:Admc-delete.png|ADMC. Подтверждение удаления объекта]]
==== Переместить компьютер ====
# В контекстном меню компьютера выбрать пункт «Переместить…».
# В диалоговом окне «Выберите Контейнер — ADMC» выберите контейнер, в который следует переместить компьютер.
#:[[File:Admc-user-move.png|ADMC. Диалоговое окно выбора контейнера]]
# Нажмите кнопку «ОК».
==== Включить/Выключить учетную запись компьютера====
В контекстном меню компьютера, учетную запись которого вы хотите выключить или включить выберите пункт «Выключить учетную запись» или «Включить учетную запись» (в зависимости от состояния учетной записи будет доступно одно из этих действий).
== Управление подразделениями ==
Организационная единица или, подразделение (OU) — это субконтейнер в AD, в который можно помещать пользователей, группы, компьютеры и другие объекты AD. OU могут быть вложенными, и к ним можно применять групповые политики.
=== Создание подразделения ===
# В контекстном меню контейнера выберите пункт «Создать»→«Организация».
# Откроется окно «Создать Объект — Подразделение — ADMC»:
#:[[File:Admc-ou-add.png|ADMC. Создание подразделения]]
# В поле «Имя» введите название подразделения.
# Нажмите кнопку «Создать».
=== Изменение подразделения ===
Для изменения подразделения следует в контекстном меню подразделения выбрать соответствующее действие:
[[File:Admc-ou-edit.png|ADMC. Контекстное меню подразделения]]
==== Переименовать подразделение ====
# В контекстном меню подразделения выбрать пункт «Переименовать…».
# Откроется окно «Переименовать Объект — Подразделение — ADMC»:
#:[[File:Admc-ou-rename.png|ADMC. Переименовать подразделение]]
# Измените название подразделения.
# Нажмите кнопку «ОК» для сохранения изменений.
==== Удалить подразделение ====
# В контекстном меню подразделения выберите пункт «Удалить».
# Подтвердите удаление, нажав кнопку «Да»:
#:[[File:Admc-delete.png|ADMC. Подтверждение удаления объекта]]
==== Переместить подразделение ====
# В контекстном меню подразделения выбрать пункт «Переместить…».
# В диалоговом окне «Выберите Контейнер — ADMC» выберите контейнер, в который следует переместить подразделение.
#:[[File:Admc-user-move.png|ADMC. Диалоговое окно выбора контейнера]]
# Нажмите кнопку «ОК».
== Управление объектами групповых политик ==
=== Создать объект групповой политики ===
# В контекстном меню папки «Объекты групповых политик» выбрать «Создать»→«Политика»:
#:[[File:Admc-gp-add.png|ADMC. Контекстное меню папки «Объекты групповых политик»]]
# В открывшемся окне «Создать политику — ADMC» в поле «Имя» введите имя политики:
#:[[File:Admc-gp-add2.png|ADMC. Создание объекта групповой политики]]
# Нажмите кнопку «Создать».
=== Изменение объекта групповой политики ===
Для изменения объекта групповой политики следует в контекстном меню политики выбрать соответствующее действие:
[[File:Admc-gp-edit.png|ADMC. Контекстное меню объекта групповой политики]]
==== Переименовать политику ====
# В контекстном меню политики выбрать пункт «Переименовать…».
# Откроется окно «Переименовать Политику — ADMC»:
#:[[File:Admc-gp-rename.png|ADMC. Переименовать политику]]
# Измените название политики.
# Нажмите кнопку «ОК» для сохранения изменений.
==== Удалить политику ====
# В контекстном меню политики выберите пункт «Удалить».
# Подтвердите удаление, нажав кнопку «Да»:
#:[[File:Admc-gp-delete.png|ADMC. Подтверждение удаления политики]]
==== Создать ссылку на политику ====
# В контекстном меню политики выберите пункт «Добавить линк...».
# Выберите обьекты, которые вы хотите связать с политикой (см. [[Групповые_политики/ADMC#Выбор объектов|Выбор объектов]]):
#:[[File:Admc-gp-select.png|ADMC. Создание ссылки на политику]]
==== Удалить ссылку на политику ====
# Разверните папку «Объекты групповых политик».
# Выберите политику, которую вы хотите изменить.
# В контекстном меню подразделения, связь с которым вы хотите отключить от политики, выберите «Удалить линк»:
#:[[File:Admc-gp-deletelink.png|ADMC. Удаление ссылки на политику]]
==== Редактировать параметры ссылки ====
# Разверните папку «Объекты групповых политик».
# Выберите политику, которую вы хотите отредактировать.
# На панели результатов найдите подразделение, для которого вы хотите изменить параметры ссылки.
# Включите опцию «Принудительно», чтобы изменить место применения политики.
# Включите опцию «Выключено», чтобы изменить место отключения политики.
#:[[File:Admc-gp-editlink.png|ADMC. Изменить параметры ссылки]]
== Использование сохраненных результатов поиска ==
Сохранение запросов (результатов поиска) — это удобный способ сохранять и воспроизводить поиск.
С помощью сохраненных запросов можно быстро и эффективно решать задачи поиска и выборки объектов в AD по различным критериям.
Сохраненные запросы можно организовать в древовидную структуру.
=== Создать папку запросов ===
# В контекстном меню папки «Сохраненные поиски» или её подпапки выберите пункт «Создать»→«Папка»:
#:[[File:Admc-search-save.png|ADMC. Контекстное меню папки «Сохраненные поиски»]]
# Откроется диалоговое окно «Создать Папку Поиска — ADMC»:
# В поле «Имя» введите название папки.
# В поле «Описание» введите описание папки.
# Нажмите кнопку «Создать»:
#:[[File:Admc-search-newfolder.png|ADMC. Создать папку запросов]]
=== Редактировать папку запросов ===
# В контекстном меню папки выберите пункт «Редактировать».
# Откроется диалоговое окно «Редактировать Папку Поиска — ADMC»:
#:[[File:Admc-search-editfolder.png|ADMC. Редактировать папку запросов]]
# В поле «Имя» введите название папки.
# В поле «Описание» введите описание папки.
# Нажмите кнопку «OK».
=== Создать запрос ===
# В контекстном меню папки запроса выбрать пункт «Создать»→«Поиск»:
#:[[File:Admc-search-save.png|ADMC. Контекстное меню папки «Сохраненные поиски»]]
# Откроется окно «Создать поиск — ADMC»:
#:[[File:Admc-search-newquery.png|ADMC. Создать запрос]]
# В поле «Имя» введите название.
# В поле «Описание» введите описание поиска.
# В выпадающем списке «Искать в» выберите объект, который будет использоваться в качестве основы для поиска.
# Отметьте пункт «Включать под-контейнеры», если хотите, чтобы поиск включал объекты более чем одного уровня.
# Нажмите кнопку «Редактировать…», чтобы отредактировать фильтр (для получения информации о том, как создавать фильтры см. раздел [[Групповые_политики/ADMC#Поиск объектов|Поиск объектов]]).
# После создания фильтра, он будет отображаться в поле «Фильтр» (в формате LDAP).
# Нажмите кнопку «ОК».
# При выборе созданного запроса, в правом окне появится список пользователей, который соответствует данному запросу:
#:[[File:Admc-search-result2.png|ADMC. Результаты запроса]]
=== Редактировать запрос ===
# В контекстном меню запроса выберите пункт «Редактировать»:
#:[[File:Admc-search-query3.png|Контекстное меню сохранённого запроса]]
# Внесите необходимые изменения (см. раздел [[Групповые_политики/ADMC#Создать запрос|Создать запрос]]).
# Нажмите кнопку «ОК».
=== Экспортировать запрос ===
# В контекстном меню запроса выберите пункт «Экспортировать поиск…».
# В открывшемся диалоговом окне укажите название файла (<имя_файла>.json) и место назначения.
# Нажмите кнопку «Сохранить».
=== Импортировать запрос ===
# В контекстном меню папки поиска, в которую вы хотите импортировать поиск, выберите пункт «Импортировать поиск…»:
#:[[File:Admc-search-save.png|ADMC. Контекстное меню папки «Сохраненные поиски»]]
# В открывшемся диалоговом окне выберите экспортированный файл поиска.
# Нажмите кнопку «Открыть».
=== Переместить/Копировать запрос или папку запросов ===
# В контекстном меню объекта, который вы хотите переместить, выберите пункт «Вырезать…»/»Копировать…».
# В контекстном меню целевой папки выберите пункт «Вставить».
=== Удалить поиск или папку поисков ===
В контекстном меню объекта, который вы хотите удалить выберите пункт «Удалить…»
== Другое ==
=== Добавление/Удаление UPN суффиксов ===
UserPrincipalName (UPN) — имя для входа пользователя в формате email адреса, например ivanov@test.alt. Здесь ivanov это UPN префикс (имя пользователя в домене AD), test.alt — UPN суффикс. По умолчанию в AD в качестве UPN суффикса используется DNS имя домена AD.
Для того чтобы добавить/удалить дополнительный UPN суффикс:
# В контекстном меню домена выберите «Редактировать UPN суффиксы»:
#:[[File:Admc-upn.png|ADMC. Контекстное меню домена]]
# В открывшемся диалоговом окне нажмите кнопку «Добавить...»:
#:[[File:Admc-upn-add.png|ADMC. Окно редактирования UPN суффиксов]]
# Введите новый суффикс:
#:[[File:Admc-upn-new.png|ADMC. Новый UPN суффикс]]
# Нажмите кнопку «ОК», чтобы добавить новый суффикс в список.
# Чтобы удалить существующий суффикс, выберите его в списке и нажмите кнопку «Удалить»:
#:[[File:Admc-upn-delete.png|ADMC. Список UPN суффиксов домена]]
=== Выбор объектов ===
Выбор объектов осуществляется в диалоговом окне «Выбрать Объекты — ADMC»:
[[File:Admc-select.png|ADMC. Диалоговое окно «Выбрать Объекты — ADMC»]]
Доступ к этому диалоговому окну можно получить из разных мест, например, при выборе действия «Добавить в группу...» в контекстном меню группы.
Для выбора объектов:
# В поле «Классы», нажав кнопку «Выбрать…», выберите тип объектов (в большинстве случаев это поле будет заполнено автоматически):
#:[[File:Admc-search-type.png|ADMC. Выбор объектов поиска]]
# В поле «Искать в» выберите объект, который будет использоваться в качестве основы для поиска.
# В поле «Имя» введите имя объекта (можно ввести часть имени или выполнить поиск по имени для входа).
# Нажмите кнопку «Добавить» для поиска объекта по названию.
# Если объект найден, он будет добавлен в список найденных объектов.
# Если объект не найден, исправьте имя и повторите попытку.
# Если есть несколько совпадений, откроется диалоговое окно, в котором вы сможете выбрать одно или несколько совпадений:
#:[[File:Admc-select2.png|ADMC. Выбор объектов из списка найденных совпадений]]
# Повторите пункты 1-7, пока не добавите все объекты, которые хотите выбрать.
# Чтобы удалить объекты из списка, выберите объекты и нажмите кнопку «Удалить».
Для выбора объектов можно также использовать продвинутый поиск, который можно открыть, нажав кнопку «Продвинутый» (см. [[Групповые_политики/ADMC#Поиск объектов|Поиск объектов]]).
=== Поиск объектов ===
Поиск объектов осуществляется в диалоговом окне «Искать Объекты — ADMC»:
[[File:Admc-search.png|ADMC. Диалоговое окно «Искать Объекты — ADMC»]]
Доступ к этому диалоговому окну можно получить, выбрав пункт «Поиск…» в меню «Действие» или в контекстном меню контейнера.
Для поиска объектов:
# В списке «Искать в» выберите объект, который будет использоваться в качестве основы для поиска.
# Определите критерий поиска на одной из вкладок ([[Групповые_политики/ADMC#Простой_поиск|«Упрощенный»]], [[Групповые_политики/ADMC#Обычный_поиск|«Обычный»]], [[Групповые_политики/ADMC#Продвинутый_поиск|«Продвинутый»]]).
# Нажмите кнопку «Поиск».
# Результаты будут отображены в списке справа.
{{Note|В диалоговом окне, вызываемом меню «Вид»→«Выбрать колонки» можно выбрать поля, которые будут отображаться в списке результатов поиска:
[[File:Admc-search-result.png|ADMC. Поля, отображаемые в результатах поиска]]}}
==== Простой поиск ====
# Выберите вкладку «Упрощенный».
# В поле «Классы», нажав кнопку «Выбрать…», выберите тип объектов:
#:[[File:Admc-search-type.png|ADMC. Выбор объектов поиска]]
# В поле «Имя» введите имя объекта.
# Нажмите кнопку «Поиск».
#:[[File:Admc-search-simple.png|ADMC. Простой поиск]]
==== Обычный поиск ====
# Выберите вкладку «Обычный».
# В поле «Классы», нажав кнопку «Выбрать…», выберите тип объектов:
#:[[File:Admc-search-type.png|ADMC. Выбор объектов поиска]]
# Создать фильтр:
#* в списке «Класс атрибута» выберите класс атрибута.
#* в списке «Атрибут» выберите атрибут (список атрибутов зависит от выбранного класса атрибутов).
#* в списке «Состояние» выберите условие, которое будет использоваться для фильтра.
#* в поле «Значение» введите значение условия. Обратите внимание, что не для всех условий необходимо вводить значения.
# Нажмите кнопку «Добавить».
# Повторите пункты 2-3, чтобы добавить больше фильтров (фильтры для создания критериев поиска объединяются логическим И).
# Нажмите кнопку «Удалить», если хотите удалить фильтр из списка.
# Нажмите кнопку «Очистить», если хотите очистить список фильтров.
# Нажмите кнопку «Поиск».
#:[[File:Admc-search-common.png|ADMC. Обычный поиск]]
==== Продвинутый поиск ====
# Выберите вкладку «Продвинутый».
# Введите LDAP-фильтр в поле «Введите фильтр LDAP».
# Нажмите кнопку «Поиск».
#:[[File:Admc-search-advanced.png|ADMC. Продвинутый поиск]]
== Страница проекта ==
https://github.com/altlinux/admc
[[Категория:Active Directory]]
{{Category navigation|title=Samba|category=Samba|sortkey={{SUBPAGENAME}}}}

456
doc/generate_manual.cpp Normal file
View File

@ -0,0 +1,456 @@
/*
* ADMC - AD Management Center
*
* Copyright (C) 2020-2021 BaseALT Ltd.
* Copyright (C) 2020-2021 Dmitry Degtyarev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Generate manual files (.html and .qhp) from the manual in
* wiki format (.wiki).
*/
#include <QtCore>
enum LineType {
LineType_Normal,
LineType_OL,
LineType_UL,
LineType_UL_2,
};
const QString OL_string = "# ";
const QString UL_string = "#* ";
const QString UL_2_string = "#** ";
const QString LI_start = "<li>";
const QString LI_end = "</li>";
const QString UL_start = "<ul>";
const QString UL_end = "</ul>";
const QString OL_start = "<ol>";
const QString OL_end = "</ol>";
const QString BR_string = "<br>";
QString get_section_title(const QList<QString> &section);
QString get_section_path(const QList<QString> &section);
LineType get_line_type(const QList<QString> &line_list);
QList<QString> generate_body(const QList<QString> &line_list_const);
QList<QString> generate_OL(QList<QString> &line_list);
QList<QString> generate_UL(QList<QString> &line_list);
QList<QString> generate_UL_2(QList<QString> &line_list);
int main(int argc, char **argv) {
if (argc != 3) {
qCritical() << "Incorrect arguments! Need: \"src_wiki\" \"dest_dir\"";
return 1;
}
const QString wiki_file_path = argv[1];
const QString dest_dir = argv[2];
//
// Read contents of wiki file
//
const QList<QString> line_list = [&]() {
QFile wiki_file(wiki_file_path);
const bool open_wiki_success = wiki_file.open(QIODevice::ReadOnly);
if (!open_wiki_success) {
qCritical() << "Failed to open wiki file:" << wiki_file_path;
return QList<QString>();
}
const QString file_string = wiki_file.readAll();
wiki_file.close();
const QList<QString> out = file_string.split("\n");
return out;
}();
if (line_list.isEmpty()) {
qCritical() << "Failed to read wiki file";
return 1;
}
// Split into sections
const QList<QList<QString>> section_list = [&]() {
QList<QList<QString>> out;
int current_i = 0;
auto find_next_section = [&](const int start_i) {
for (int i = start_i; i < line_list.size(); i++) {
const QString line = line_list[i];
const bool section_start = line.startsWith("=");
if (section_start) {
return i;
}
}
return -1;
};
while (true) {
const int section_start_i = find_next_section(current_i);
if (section_start_i == -1) {
break;
}
int section_end_i = find_next_section(section_start_i + 1);
if (section_end_i == -1) {
// Last section case
section_end_i = line_list.size() - 1;
}
const int section_length = section_end_i - section_start_i;
const QList<QString> section = line_list.mid(section_start_i, section_length);
out.append(section);
current_i = section_end_i;
}
return out;
}();
//
// Write section files (.html)
//
for (const QList<QString> &section : section_list) {
const QList<QString> section_file_contents = [&]() {
QList<QString> out;
const QString section_name = get_section_title(section);
out.append("<html>");
out.append("<body>");
out.append("<head>");
out.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
out.append("</head>");
out.append("<p>");
out.append(QString("<h3>%1</h3>").arg(section_name));
out.append("</p>");
out.append("<p>");
const QList<QString> body = generate_body(section);
out.append(body);
out.append("</p>");
out.append("</body>");
out.append("</html>");
return out;
}();
const QString section_path = get_section_path(section);
const QString section_file_path = QString("%1/%2.html").arg(dest_dir, section_path);
QFile section_file(section_file_path);
const bool open_section_success = section_file.open(QIODevice::WriteOnly | QIODevice::Text);
if (!open_section_success) {
qCritical() << "Failed to open section file:" << section_file_path;
break;
}
section_file.write(section_file_contents.join("\n").toUtf8());
section_file.close();
}
//
// Write .qhp file
//
const QList<QString> qhp_file_contents = [&]() {
QList<QString> out;
out.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
out.append("<QtHelpProject version=\"1.0\">");
out.append("<namespace>alt.basealt.admc</namespace>");
out.append("<virtualFolder>doc</virtualFolder>");
out.append("<filterSection>");
out.append("<toc>");
int prev_level = 0;
int section_start_count = 0;
int section_end_count = 0;
for (const QList<QString> &section : section_list) {
const int level = [&]() {
const QString section_line = section[0];
int i = 0;
while (i < section_line.size() && section_line[i] == "=") {
i++;
}
return i;
}();
const int level_diff = prev_level - level;
if (level_diff >= 0) {
for (int i = -1; i < level_diff; i++) {
out.append("</section>");
section_end_count++;
}
}
prev_level = level;
const QString section_name = get_section_title(section);
const QString section_path = get_section_path(section);
out.append(QString("<section title=\"%1\" ref=\"%2.html\">").arg(section_name, section_path));
section_start_count++;
}
// Close all end sections
for (int i = 0; i < (section_start_count - section_end_count); i++) {
out.append("</section>");
}
out.append("</toc>");
out.append("<keywords></keywords>");
out.append("<files>");
for (const QList<QString> &section : section_list) {
const QString path = get_section_path(section);
out.append(QString("<file>%1.html</file>").arg(path));
}
out.append("</files>");
out.append("</filterSection>");
out.append("</QtHelpProject>");
return out;
}();
const QString qhp_file_path = QString("%1/admc.qhp").arg(dest_dir);
QFile qhp_file(qhp_file_path);
const bool open_qhp_success = qhp_file.open(QIODevice::WriteOnly);
if (!open_qhp_success) {
qCritical() << "Failed to open qhp file:" << qhp_file_path;
return 1;
}
qhp_file.write(qhp_file_contents.join("\n").toUtf8());
qhp_file.close();
return 0;
}
QString get_section_title(const QList<QString> &section) {
QString out = section[0];
out.remove("====");
out.remove("===");
out.remove("==");
while (out.left(1) == " ") {
out.remove(0, 1);
}
while (out.right(1) == " ") {
out.remove(out.size() - 1, 1);
}
return out;
}
QString get_section_path(const QList<QString> &section) {
QString out = get_section_title(section);
// TODO: need to remove slashes so paths don't
// break but idk
out.replace("/", "|");
return out;
}
LineType get_line_type(const QList<QString> &line_list) {
const QString line = line_list.first();
if (line.startsWith(OL_string)) {
return LineType_OL;
} else if (line.startsWith(UL_string)) {
return LineType_UL;
} else if (line.startsWith(UL_2_string)) {
return LineType_UL_2;
} else {
return LineType_Normal;
}
}
// NOTE: "generate" f-ns operate on the same non-const list
// and pop front elements from the list as they go through
// it
QList<QString> generate_body(const QList<QString> &line_list_const) {
QList<QString> out;
QList<QString> line_list = line_list_const;
// Remove all file links
for (const QString &line : line_list) {
const bool line_has_file = line.contains("[[");
const bool line_has_category = line.contains("{{Category");
if (line_has_file || line_has_category) {
line_list.removeAll(line);
}
}
// Skip first line (section name)
line_list.takeFirst();
while (!line_list.isEmpty()) {
const LineType type = get_line_type(line_list);
if (type == LineType_OL) {
const QList<QString> ol = generate_OL(line_list);
out.append(ol);
} else if (type == LineType_Normal) {
const QString line = line_list.takeFirst();
out.append(line);
out.append(BR_string);
} else {
qCritical() << "Encountered unknown line structure, maybe it's the \"UL outside OL\" case.";
break;
}
}
for (int i = 0; i < out.size(); i++) {
QString line = out[i];
// Change quotations into bold text
line.replace("«", "<b>");
line.replace("»", "</b>");
// Remove wiki-style list markers
auto remove_first = [&](const QString &string) {
if (line.startsWith(string)) {
line.remove(0, string.size());
}
};
remove_first(OL_string);
remove_first(UL_string);
remove_first(UL_2_string);
// Change notes into block quotes
line.replace("{{Note|", "<blockquote>");
line.replace("}}", "</blockquote>");
out[i] = line;
}
return out;
}
QList<QString> generate_OL(QList<QString> &line_list) {
QList<QString> out;
out.append(OL_start);
while (!line_list.isEmpty()) {
const LineType type = get_line_type(line_list);
if (type == LineType_Normal) {
break;
}
const QString line = line_list.takeFirst();
out.append(LI_start);
out.append(line);
const LineType next_type = get_line_type(line_list);
if (next_type == LineType_UL) {
const QList<QString> ul = generate_UL(line_list);
out.append(ul);
}
out.append(LI_end);
}
out.append(OL_end);
return out;
}
QList<QString> generate_UL(QList<QString> &line_list) {
QList<QString> out;
out.append(UL_start);
while (!line_list.isEmpty()) {
const LineType type = get_line_type(line_list);
if (type == LineType_OL || type == LineType_Normal) {
break;
}
const QString line = line_list.takeFirst();
out.append(LI_start);
out.append(line);
const LineType next_type = get_line_type(line_list);
if (next_type == LineType_UL_2) {
const QList<QString> ul_2 = generate_UL_2(line_list);
out.append(ul_2);
}
out.append(LI_end);
}
out.append(UL_end);
return out;
}
QList<QString> generate_UL_2(QList<QString> &line_list) {
QList<QString> out;
out.append(UL_start);
while (!line_list.isEmpty()) {
const LineType type = get_line_type(line_list);
if (type != LineType_UL_2) {
break;
}
const QString line = line_list.takeFirst();
out.append(LI_start);
out.append(line);
out.append(LI_end);
}
out.append(UL_end);
return out;
}

View File

@ -1,17 +0,0 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Manual</title>
</head>
<body style="font-size:12pt;font-family:helvetica">
<p><center><h2>ADMC</h2></center></p>
<p>
Under construction.
</p>
</body>
</html>