четверг, 28 июля 2016 г.

Сброс пароля к информационной базе 1С:Предприятия 8.2

Сброс учетных записей. Пишем универсальную программу на .NET Framework

ПРАКТИЧЕСКАЯ ЗАДАЧА

Иногда перед системными администраторами может встать задача по восстановлению доступа к информационной базе 1С:Предприятия 8.2. Например, в случае, если были утеряны учетные данные администратора, а завтра нужно создать пару пользователей. Не будем обсуждать о возможных причинах случившегося, главное - восстановить доступ.
Ошибка аутентификации 1С:Предприятия 8.2
Ошибка аутентификации 1С:Предприятия 8.2

В предыдущей статье "Вход без приглашения" были рассмотрены способы сброса учетных записей и их последующего восстановления для файлового режима работы и клиент-серверного. После удаления учетных записей вход в базу осуществляется без аутентификации. В серверном режиме в качестве СУБД в примере использовался MS SQL Server 2008 Express. Описанные способы сброса учетных записей подходят для большинства ситуаций, однако, для других поддерживаемых платформой СУБД последовательность действий может быть иной. Например, для IBM DB2, что будет продемонстрировано ниже.

Также в статье "Сброс пользователей в клиент-серверной базе 1С:Предприятия 8.x" был предложен вариант реализации программы, написанной на C#, для автоматизации процесса сброса учетных записей в серверной базе 1С:Предприятия на MS SQL. 

В продолжение темы сегодня мы создадим программу на .NET Framework (C#) для сброса учетных записей в файловом и клиент-серверном режиме работы для всех СУБД, работу с которыми поддерживает платформа. Для этого будем использовать несколько поставщиковданных ADO.NET, а также учитывать специфику работу платформы с каждой из СУБД. И так, поехали!

УДАЛЯЕМ УЧЕТНЫЕ ЗАПИСИ

Убедить платформу, что список пользователей пуст достаточно просто: нужно удалить таблицу "v8users" и из таблицы "Params" убрать запись настроек пользователей.
Удаление учетных записей пользователей 1С:Предприятия 8.2
Удаление учетных записей пользователей 1С:Предприятия 8.2
Выше сказанное справедливо как для файловой базы, так и для серверной. В обоих случаях все действия можно проделать вручную, мы же этот процесс автоматизируем, написав программу на .NET Framework. Начнем со сброса пользователей для файлового варианта работы.

ФАЙЛОВАЯ БАЗА

Информационная база в таком случае хранится в файле "1Cv8.1CD". Открыв файл в шестнадцатеричном редакторе, например HexEdit, нам нужно изменить следующие значения:
Исходные данные в файле информационной базы
Исходные данные в файле информационной базы
То есть, изменив представленные значения, платформа не сможет найти информацию о созданных ранее пользователях информационной базы и мы без проблем сможем пройти аутентификацию. Переводы в байты на скриншоте предоставлены для того, чтобы далее было легче разобраться в листинге кода.

В общем случае алгоритм программы для сброса учетных записей будет следующий:
  1. Пользователь выбирает файл информационной базы.
  2. По команде "Сбросить пользователей" программа считывает файл ИБ в массив байт.
  3. Производится поиск приведенных выше последовательностей байт.
  4. Изменяются значения этих последовательностей.
Первый этап реализуется просто с помощью диалога выбора файла. Выполнение остальных трех этапов представлено на следующем листинге:
Сброс пользователей 1С:Предприятия 8.2 в файле информационной базы
Сброс пользователей 1С:Предприятия 8.2
в файле информационной базы
Здесь мы создаем массивы байт для поиска, заполняя их значениями, приведенными на предыдущем скриншоте.

Значения байт для подстановки в переменных "newByteTable" и "newByteparam" будут записываться в определенное место найденной последовательности байт методом "ChangeDatabaseFile".

Перейдем к самому интересному и рассмотрим работу этого метода.

На скриншоте ниже представлен алгоритм модификации файла информационной базы.




В нем используется метод "ByteSearch", который выполняет поиск массива байт по другому массиву байт. Чтобы не изобретать велосипед, его исходный код взял по адресу
Модификация файла информационной базы для сброса учетных записей
Модификация файла информационной базы для сброса учетных записей
Здесь мы получаем массив байт файла информационной базы, ищем в нем заданные последовательности байт и заменяем в них значения, на переданные в метод в качестве параметров. Восстановление исходной структуры файла осуществляется тем же методом "ChangeDataBaseFile", только передаются иные массивы байт для поиска и значения байт для замены в файле.

На следующем видео демонстрируется работа программы по сбросу учетных записей в файловой базе.


Таким образом, сброс учетных записей в файловой информационной базе не вызывает особых трудностей. В принципе, все действия, выполняемые программой, можно сделать вручную с помощью любого HEX-редактора за несколько минут.

ДОПОЛНЕНИЕ: для файловой базы также можно сбросить учетные записи, а затем восстановить их не выходя из конфигуратора. Для этого нужно выполнить сброс описанными средствами, а затем войдя в конфигуратор изменить региональные настройки (!!!). После этого восстановить учетные записи описанным выше способом. Обратившись к списку пользователей в конфигураторе, нам откроется список с учетными записями до сброса.

СЕРВЕРНАЯ БАЗА И ПОСТАВЩИКИ ADO.NET

Известный факт - платформа 1С:Предприятие 8.2 поддерживает работу с четырьмя СУБД:
  1. Microsoft SQL Server.
  2. PostgreSQL.
  3. Oracle Database
  4. IBM DB2.
Прежде чем писать алгоритм сброса учетных записей для серверного режима работы, стоит определиться с поставщиками данных, которые будут использоваться для доступа к SQL-базе 1С:Предприятия и выполнения необходимых SQL-команд. Список официальных поставщиков данных для СУБД можно посмотреть на сайте Microsoft по следующей ссылке. В конечном счете, после анализа доступных поставщиков данных, выбрал следующие:
  1. MS SQL - поставщик данных, идущий в составе .NET Framework.
  2. PostgreSQL - NPGSQL ADO.NET provider.
  3. IBM DB2 - OLE DB (не нашел нормальной библиотеки, у официальной были неприемлемые ошибки).
  4. Oracle Database - Devart's dotnetConnector for Oracle (библиотеки официального поставщика данных имеют большой размер, порядка 60 МБ).
Для того, чтобы поставщик OLE DB мог работать с IBM DB2, нужно зарегистрировать на машине, где запускается программа, поставщика ODBC "IBMDADB2". 

Прежде чем использовать перечисленные поставщики данных, нужно написать объявлениядля использования соответствующих пространств имен.
Объявление пространств имен для нескольких
поставщиков данных ADO.NET
В самой программе пользователь выбирает тип СУБД, которую использует платформа 1С:Предприятие 8.2, а также имя базы данных и аутентификационные данные для подключения.

В дальнейшем в зависимости от выбранной СУБД и остальных данных создается строка подключения к SQL-базе и используется соответствующий поставщик данных и алгоритм сброса учетных записей. 

Строку подключения можно редактировать вручную при соответствующей настройке. Сразу отмечу, что для таких СУБД как MSSQL, PostgreSQL и Oracle Database алгоритмы будут очень похожи. Для IBM DB2 ситуация особая, рассмотрим ее далее в статье.
Настройки подключения к SQL-базе данных для сброса учетных записей информационной базы 1С:Предприятие 8.2
Настройки подключения к SQL-базе данных для сброса учетных записей
информационной базы 1С:Предприятие 8.2
По командам "Сбросить пользователей" / "Восстановить пользователей" вызываются методы, написанные для каждой СУБД отдельно. Теперь рассмотрим реализацию алгоритма сброса и восстановления учетных записей для каждой из них.

Microsoft SQL Server

Самая простая реализация сброса учетных записей. Вообще, с поставщиком данных MS SQL, встроенном в .NET Framework проблем практически никогда не встречал, что весьма радует. 

При выборе в качестве СУБД MS SQL Server при сбросе пользователей будет выполнен следующий алгоритм:
Сброс учетных записей в информационной базе 1С:Предприятия 8.2 для MS SQL Server
Сброс учетных записей в информационной базе 1С:Предприятия 8.2 для MS SQL Server
После подключения к базе выполняем переименование таблицы "v8users" в "h8users", чтобы платформа не смогла найти список пользователей при следующем запуске. Также изменяем запись параметров пользователей в таблице "Params", изменив в ней значение поля "FileName" с "users.usr" на "husers.usr". Поскольку платформа не сможет найти список пользователей при следующем запуске, то аутентификация пройдет успешно без запроса имени пользователя и пароля.

Все действия, выполняемые над SQL-базой данных, выполняются в единой транзакции, чтобы сохранить целостность базы данных при возникновении непредвиденных ошибок.

По команде "Восстановить пользователей" мы также подключаемся к SQL-базе, но выполняем противоположные действия.
Восстановление учетных записей в информационной базы 1С:Предприятия 8.2, удаленных ранее
Восстановление учетных записей в информационной базы 1С:Предприятия 8.2,
удаленных ранее
Сначала проверяется наличие таблицы "v8users" и, если она существует, ее удаление из базы. То же для записи параметров пользователей в таблице "Params". Далее возвращаются старые имена таблицы и значение "FileName" для записи параметра пользователей. Все действия выполняются в единой транзакции, поэтому если таблицы "h8users" в базе не существует, то будет выведена ошибка по SQL-запросу "sp_rename 'h8users', 'v8users'" и все изменения в базе отменятся.



На предыдущем видео показана работа программы с СУБД MS SQL Server.

PostgreSQL

Для PostgreSQL все то же самое, что и для MS SQL, за исключением синтаксиса некоторых команд и необходимости работы с индексами. Если Выше для переименования таблицы мы использовали системную хранимую процедуру "sp_rename", то сейчас в нашем распоряжении ее уже не будет. Переименовать таблицу в PostgreSQL можно следующей командой:

"ALTER TABLE <СтароеИмя>RENAME TO <НовоеИмя>".

Также стоит обратить внимание, что узнать о наличии таблицы с помощью запроса, использованного для MS SQL также не получится. Для MS SQL в методе восстановления учетных записей был использован запрос:

"select * from sysobjects Where name = 'v8users'".

В PostgreSQL таблица "sysobjects" отсутствует. Вместо нее для получения информации о структуре базы данных можно использовать таблицу "pg_tables". Тогда запрос примет следующий вид:

"Select * From pg_tables where tablename = 'v8users'".


Для того, чтобы переименовать таблицу, а затем по необходимости восстановить ее, нам нужно переименовать и ее индексы (например, добавить символ "H" в начале). Если этого не сделать, то после сброса паролей мы не сможем войти в базу из-за ошибки создания индекса для новой таблицы "v8users". Так как платформа не найдет таблицу пользователей, то попробует создать ее заново, как и индексы. Но поскольку индексы с таким именем уже существуют, то при попытке их создания будет выводиться ошибка. Переименовав их при сбросе учетных записей мы обойдем эту проблему. Подобная ошибка встретиться и для IBM DB2 (см. ниже).

Переименование индексов необходимо только при сбросе учетных записей. Подробнее о работе программного кода Вы можете узнать из исходных файлов проекта, ссылка для загрузки на который приведена в конце статьи.

В остальном все идентично алгоритму для MS SQL. На следующем видео демонстрируется работа программы для PostgreSQL.

Oracle Database

Не смотря на то, что Oracle Database имеет отличную схему работы с данными от предыдущих перечисленных СУБД, выполняемые запросы для сброса учетных записей будут отличаться незначительно.

Так, например, поскольку подключение выполняется не непосредственно к базе данных (схема данных в терминах Oracle Database), а к экземпляру, то во всех запросах нужно явно указывать к какой схеме данных выполняются SQL-запросы. Для этого перед наименованием таблиц нужно указывать имя экземпляра. Вот так будет выглядеть запрос на удаление таблицы "v8users":

"DROP TABLE  <ИмяСхемыДанных>.v8users CASCADE CONSTRAINTS".

Также изменится запрос для получения информации о наличии таблицы в схеме данных. Он примет следующий вид:

"SELECT table_name FROM dba_tables dt 
WHERE table_name = 'V8USERS' AND owner = '<ИмяСхемыДанных>'".

Общая логика алгоритма будет идентичной двум предыдущим СУБД. На следующем видео демонстрируется сброс учетных записей 1С:Предприятия 8.2 для Oracle Database.

IBM DB2

Здесь мы имеем особую ситуацию, кардинально отличающуюся от алгоритмов сброса учетных записей для всех остальных поддерживаемых СУБД. Дело в том, что платформа 1С:Предприятие 8.2 не создает таблицу "v8users" как таковую. Используется следующая схема:
Структура хранения таблицы пользователей в IBM DB2 для 1С:Предприятия 8.2
Структура хранения таблицы пользователей в IBM DB2 для 1С:Предприятия 8.2
Удалив/переименовав алиас "v8users", при запуске мы получим следующую ошибку:
Ошибка в IBM DB2 после удаления алиаса
Ошибка в IBM DB2 после удаления алиаса "v8users"
Сообщение гласит, что при создании индекса "BYNAME" произошла ошибка, так как такой индекс уже существует. И это логично, ведь мы удалили лишь ее алиас, а таблица и индексы остались без изменений. Подобная ошибка встречалась выше для PostgreSQL.

Что касается записи параметров пользователей в таблице "Params", то ничего не изменилось. Все аналогично случаям, рассматриваемым для других СУБД.

Чтобы реализовать функцию сброса учетных записей теперь нам необходим выполнять следующие шаги:
  1. По алиасу "v8users" получить имя таблицы базы данных, в которой хранятся учетные записи.
  2. Переименовать индексы таблицы, имя которой получили на предыдущем шаге.
  3. Переименовать таблицу с учетными записями.
  4. Удалить старый алиас "v8users" и создать новый "h8users" для уже переименованной таблицы.
  5. Изменить поле "FileName" для записи параметров пользователей в таблице "Params".
Все вышеперечисленное следует учитывать при восстановлении учетных записей (удалить индексы для уже созданной таблицы "v8users", а также ее саму). Еще раз обращаю внимание на то, что в программе использовал универсальный поставщик данных OLEDB, который требует для работы программы установленный поставщик ODBC для IDB DB2. Обычно он ставится с самой СУБД или с ее клиентским приложением.

Подробнее посмотреть программный код Вы можете в проекте Visual Studio 2012 for Desktop, ссылка для загрузки которого доступна в конце статьи. Ниже представлено видео работы программы по сбросу учетных записей для базы 1С:Предприятия на IBM DB2.

ИТОГИ
Работать программа будет только с версией платформы 1С:Предприятие 8.2. Делать программу для других версий платформы посчитал не целесообразным. Возможно было бы достаточным сделать программу только для файлового варианта работы, ибо серверную базу можно выгрузить в DT-файл, а оттуда перевести в файловую версию. Или вообще проделать все действия по сбросу учетных записей вручную. Но мне была интересна работы платформы со всеми поддерживаемыми СУБД, а также работа с несколькими поставщиками данных на платформе .NET Framework. Поэтому решил поэксперементировать по этой теме.

Подробно о действия для сброса учетных записей писал в предыдущей статье "Вход без приглашения".

Эксперимент показал, что платформа по разному работает с различными СУБД, причем с некоторыми значительно. При сбросе учетных записей для файлового варианта мне не удалось после их восстановления изменять их, как это демонстрируется на видео для серверных баз. Если нужно сохранить старые учетные записи, то лучше использовать клиент-серверный режим работы информационной базы.

Спасибо за внимание! Надеюсь материал будет полезен.

Все вопросы пишите в комментариях к статье.

Файлы для загрузки:

Комментариев нет:

Отправить комментарий