При администратировании баз данных 1С версии 7.7 часто возникает необходимость получить список зарегистрированных пользователей, их персональные каталоги и MD5-хеши паролей до запуска самого приложения. Штатный запуск 1С блокирует файл users.usr, расположенный в каталоге usrdef информационной базы, что делает его недоступным для чтения некоторыми сторонними процессами.
Рассмотрим подробно внутреннюю структуру файла users.usr и разберем практические способы решения этой задачи без привлечения механизмов самой платформы 1С.
Проанализируем техническое устройство файла с пользователями. Файл users.usr представляет собой стандартный контейнер OLE Structured Storage (Compound File). Внутри данного контейнера хранятся текстовые потоки данных (например, Container.Contents), оформленные в виде спецструктур с фигурными скобками.
В тексте этих потоков содержатся следующие сведения:
.\каталог.Выясним, какие существующие компоненты позволяют взаимодействовать с users.usr напрямую:
gcomp содержит готовую реализацию разбора OLE Compound-файлов 1С. Изучение и использование исходного кода gcomp (на C++) позволяет вычленить нужный алгоритм распаковки потока users.usr и применить его в собственном приложении.Если требуется написать собственную консольную утилиту или скрипт автоматизации, разберем программные варианты работы с OLE Compound контейнерами:
Вариант на C++ / C# (Win32 API):
Для открытия заблокированного или стандартного Compound-файла используются функции системного API Windows. Вызов функции StgOpenStorage со флагами совместного доступа STGM_READ | STGM_SHARE_DENY_NONE позволяет прочитать внутренние потоки IStorage и IStream даже в момент работы платформы.
Вариант на Python:
В языке Python для работы с OLE-файлами применяется библиотека olefile. Разберем по шагам порядок действий:
users.usr через olefile.OleFileIO.Container.Contents.cp1251.Для быстрой выгрузки пользователей можно написать утилиту на платформах C# / .NET с использованием COM-интерфейсов System.Runtime.InteropServices.ComTypes или сторонних NuGet-пакетов для чтения OLE Structured Storage.
Схема обработки структуры данных при выгрузке:
// Пример логики поиска текстовых элементов пользователя в считанном потоке
string streamContent = ReadStreamFromCompoundFile(filePath, "Container.Contents");
// Разбор блоков внутри фигурных скобок {...}
var matches = Regex.Matches(streamContent, @"\{""(?<Name>[^""]+)""\s*,\s*""(?<Path>[^""]*)""");
foreach (Match match in matches)
{
string userName = match.Groups["Name"].Value;
string userFolder = match.Groups["Path"].Value;
// Дальнейшая обработка и вывод данных
}
users.usr часто устанавливают атрибут «Только для чтения» (Read-Only).