
Если пароль первого администратора потерян, почта восстановления недоступна, а другого администратора нет, в коробочном Битрикс его можно заменить через серверный PHP API. Нужен SSH-доступ к серверу и возможность запустить PHP, который подключает именно вашу установку. Старый пароль для этого не требуется. Ниже — готовый способ для пользователя ID 1, созданного при установке «1С-Битрикс» или коробочного Битрикс24.
Быстрый сброс: создайте файл и запустите две команды
Подключитесь к серверу и перейдите в административную оболочку. Если уже вошли как root, sudo не нужен:
ssh admin@server.example
sudo -i
admin@server.example замените своим SSH-пользователем и адресом сервера. Здесь используется пароль или ключ сервера, а не потерянный пароль Битрикс. Дальнейшие команды выполняются в этой серверной оболочке.
Найдите корень нужного сайта — каталог, в котором есть bitrix/modules/main/include/prolog_before.php. В BitrixVM часто используется /home/bitrix/www; в вашей установке путь может отличаться. Проверка для этого распространённого варианта:
test -f /home/bitrix/www/bitrix/modules/main/include/prolog_before.php && echo 'Корень Битрикс найден'
php --version
Если первая команда не выводит сообщение, не продолжайте с этим путём: посмотрите document root нужного виртуального хоста в конфигурации веб-сервера. Если на сервере несколько порталов, особенно важно выбрать правильный. CLI-PHP должен соответствовать требованиям установленного продукта и иметь его необходимые расширения.
Создайте служебный файл вне папки сайта. Следующий блок целиком вставляется в терминал, включая начальную и последнюю строки:
umask 077
cat > /root/bitrix-id1-reset.php <<'PHP'
<?php
if (PHP_SAPI !== 'cli') { http_response_code(403); exit; }
function stopReset(string $message): void { fwrite(STDERR, $message.PHP_EOL); exit(1); }
function groupState(): array {
$rows=[]; $result=CUser::GetUserGroupList(1);
while ($row=$result->Fetch()) { $rows[]=$row; }
usort($rows, static function ($a,$b) { return (int)$a['GROUP_ID'] <=> (int)$b['GROUP_ID']; });
return $rows;
}
$root=realpath($argv[1] ?? '');
$mode=$argv[2] ?? '--inspect';
if (!$root || !is_file($root.'/bitrix/modules/main/include/prolog_before.php')) {
stopReset('Usage: php bitrix-id1-reset.php /actual/document/root --inspect|--apply');
}
if (!in_array($mode,['--inspect','--apply'],true)) { stopReset('Unknown mode.'); }
$_SERVER['DOCUMENT_ROOT']=$root;
define('NO_KEEP_STATISTIC',true);
define('NO_AGENT_CHECK',true);
require $root.'/bitrix/modules/main/include/prolog_before.php';
$before=CUser::GetByID(1)->Fetch();
if (!$before) { stopReset('User ID 1 not found. Wrong installation?'); }
if ($mode==='--inspect') {
echo json_encode(['ID'=>1,'LOGIN'=>$before['LOGIN'],'ACTIVE'=>$before['ACTIVE'],
'EXTERNAL_AUTH_ID'=>$before['EXTERNAL_AUTH_ID'],
'MAIN_VERSION'=>\Bitrix\Main\ModuleManager::getVersion('main')],JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE),PHP_EOL;
exit;
}
if ($before['ACTIVE']!=='Y') { stopReset('User inactive. Password reset does not reactivate the account.'); }
if ((string)$before['EXTERNAL_AUTH_ID']!=='') { stopReset('External authentication. Reset at its source instead.'); }
if (!is_callable(['\Bitrix\Main\Security\Password','equals'])) { stopReset('Password verification API unavailable. Review this kernel version before resetting.'); }
$password=fgets(STDIN); $confirm=fgets(STDIN);
if ($password===false || $confirm===false) { stopReset('Two password lines are required on STDIN.'); }
$password=rtrim($password,"\r\n"); $confirm=rtrim($confirm,"\r\n");
if ($password==='' || $password!==$confirm) { stopReset('Passwords empty or do not match.'); }
$groups=groupState();
$api=new CUser();
if (!$api->Update(1,['PASSWORD'=>$password,'CONFIRM_PASSWORD'=>$confirm])) {
stopReset('Update failed: '.strip_tags($api->LAST_ERROR));
}
$after=CUser::GetByID(1)->Fetch();
if (!$after || !\Bitrix\Main\Security\Password::equals($after['PASSWORD'],$password)) {
stopReset('New password verification failed. Check custom handlers; do not report success.');
}
foreach (['LOGIN','ACTIVE','EXTERNAL_AUTH_ID'] as $field) {
if ($after[$field]!==$before[$field]) { stopReset('Unexpected profile change: '.$field); }
}
if (groupState()!==$groups) { stopReset('Groups changed unexpectedly. Review custom handlers.'); }
unset($password,$confirm);
echo 'OK: password for user ID 1 changed and verified. Login: '.$after['LOGIN'].PHP_EOL;
echo 'Login, active flag and groups preserved. MFA/IP restrictions were not disabled.'.PHP_EOL;
PHP
Этот же файл можно скачать в ZIP-архиве, если удобнее передать его на сервер. Не кладите его в публичную папку сайта.
Сначала проверьте синтаксис и посмотрите, кого собираетесь менять:
php -l /root/bitrix-id1-reset.php
php /root/bitrix-id1-reset.php /home/bitrix/www --inspect
--inspect не меняет пароль и профиль. Он покажет ID, фактический логин, активность, источник авторизации и версию Главного модуля. Учётная запись ID 1 не обязательно имеет логин admin: его могли переименовать. Например, вывод может выглядеть так:
{
"ID": 1,
"LOGIN": "portal-admin",
"ACTIVE": "Y",
"EXTERNAL_AUTH_ID": "",
"MAIN_VERSION": "26.800.0"
}
Это пример, а не данные вашего портала. Убедитесь, что выбрана нужная установка, пользователь активен, а EXTERNAL_AUTH_ID пуст. После этого задайте свой новый уникальный пароль. Он вводится дважды без отображения на экране и передаётся PHP через стандартный ввод:
IFS= read -r -s -p 'Новый пароль ID 1: ' new_password; printf '\n'
IFS= read -r -s -p 'Повторите пароль: ' confirm_password; printf '\n'
printf '%s\n%s\n' "$new_password" "$confirm_password" | \
php /root/bitrix-id1-reset.php /home/bitrix/www --apply
reset_status=$?
unset new_password confirm_password
printf 'Код завершения: %s\n' "$reset_status"
Пароль не записывается в текст команды, аргументы PHP или файл скрипта. Выполняйте блок в Bash с выключенной трассировкой команд: перед вводом можно выполнить set +x. Не используйте терминальную сессию, которая записывает секреты в общий журнал. Символы перевода строки в пароль для этого способа не подходят.
При успехе скрипт выведет OK: password for user ID 1 changed and verified, фактический логин и код завершения 0. При несовпадении двух введённых значений или отказе API будет сообщение об ошибке и ненулевой код. Не повторяйте сброс, пока не прочитали причину отказа.
Войдите с новым паролем и уберите служебный файл
Откройте отдельный браузерный профиль или приватное окно и перейдите на административную страницу своего сайта:
https://portal.example.ru/bitrix/admin/
Используйте логин из режима --inspect и только что установленный пароль. Проверяйте новый вход, а не вкладку, которая уже была авторизована. Для коробочного Битрикс24 можно также войти через обычную форму портала, затем проверить доступ к административным функциям.
После успешной авторизации убедитесь, что открывается нужная установка и нужная административная функция. Затем удалите созданный файл:
rm -- /root/bitrix-id1-reset.php
exit
Удаляется один известный служебный файл. Запись пользователя, его группы, задачи и документы не удаляются. Новый пароль сохраните в корпоративном менеджере паролей. Если авария связана с передачей системы от подрядчика, после восстановления проверьте принадлежащие компании адреса восстановления и остальные доступы — но это уже следующий этап, а не условие запуска этой инструкции.
Что именно делает код и почему не нужен старый пароль
Скрипт подключает ядро через prolog_before.php, находит пользователя по ID 1 и передаёт в CUser::Update только два поля:
$api = new CUser();
$ok = $api->Update(1, [
'PASSWORD' => $password,
'CONFIRM_PASSWORD' => $confirm,
]);
Это административное изменение записи через серверный API, а не смена пароля пользователем в личном профиле. Владельцу серверного доступа не требуется знать прежний пароль: приложение обрабатывает новое значение, применяет свои проверки и записывает хеш. Поведение результата и ошибки LAST_ERROR описано в документации CUser::Update.
Мы не передаём GROUP_ID, ACTIVE, LOGIN или поля профиля. Значит, операция не предназначена для снятия прав, переименования или активации пользователя. После записи инструмент дополнительно проверяет новый пароль штатным механизмом Password::equals, сравнивает логин, активность, источник авторизации и состав групп с исходным состоянием. Если обработчик внедрения изменил их неожиданно, скрипт сообщает об этом вместо безусловного «успешно».
Пользователь ID 1 создаётся при установке и обычно становится первым администратором. Невозможность удалить его через привычное действие интерфейса не мешает обновлению его пароля. Удалять запись и создавать нового пользователя с таким же логином для восстановления не нужно: это другая операция с последствиями для истории и связанных объектов.
Код сверён с реализацией Главного модуля 26.800.0; синтаксис проверен на PHP 8.5.11. В старой или доработанной установке поведение обработчиков и проверки пароля может отличаться. Это не универсальная инструкция для облачного Битрикс24: клиент облака не управляет его серверным PHP-ядром.
Если пароль сменился, а вход всё равно не работает
Сброс пароля исправляет только пароль. Он не отключает двухфакторную авторизацию, ограничения по IP или внешний источник идентификации. Эти механизмы могут остановить вход уже после правильной проверки пароля. Не нужно пять раз менять пароль, если на странице явно указана другая причина.
| Что видите | Что это означает | Что делать дальше |
|---|---|---|
User ID 1 not found | Выбранная установка не содержит этой записи | Проверить document root, домен и подключаемую базу; не создавать пользователя автоматически |
User inactive | Учётная запись неактивна | Разобрать причину блокировки и отдельно согласовать активацию; пароль её не отменяет |
External authentication | У записи задан внешний источник входа | Восстанавливать доступ в LDAP/AD или соответствующей системе; не стирать EXTERNAL_AUTH_ID наугад |
Passwords empty or do not match | Ввод не совпал или пуст | Ввести новый пароль дважды; запись не выполнена |
Update failed | API отклонил изменение | Прочитать LAST_ERROR: требования к паролю, обязательные поля, собственный обработчик |
New password verification failed | Сохранённое значение не подтвердилось | Проверить обработчики и версию; не считать сброс завершённым |
| PHP сообщает о недостающем расширении или подключении к БД | CLI-среда не соответствует приложению | Использовать PHP нужной версии с конфигурацией и расширениями этой установки |
После OK форма требует одноразовый код | Второй фактор продолжает работать | Использовать действующее устройство, резервные коды или отдельную штатную процедуру восстановления MFA |
После OK доступ запрещён по IP | Ограничение адресов не связано с паролем | Восстановить доступ через разрешённую сеть либо отдельную процедуру исправления IP-правила |
Если скрипт подтверждает новый пароль, а форма пишет о неверных реквизитах, сначала сверьте логин из inspect, домен и экземпляр приложения. Ввод admin вместо фактического логина — распространённая причина повторных неудачных попыток. Проверьте также раскладку, Caps Lock и отсутствие лишнего пробела при копировании.
При сообщении о неожиданном изменении групп или профиля не запускайте скрипт снова вслепую. Пароль уже мог измениться, а причину побочного действия нужно найти в обработчиках события. Восстановление доступа завершено только после успешного нового входа и проверки полномочий в нужном портале.
Почему здесь нет SQL с MD5 и файла для запуска через браузер
Структура хеша и сопутствующие действия зависят от версии ядра. Запрос вида UPDATE b_user SET PASSWORD=MD5(...) обходит API и не является надёжным способом для современной установки. Не нужно вручную копировать чужой хеш, изменять таблицы групп или создавать пароль в URL. Штатный API даёт понятный отказ политики и учитывает логику установленного продукта.
Временный веб-файл для изменения пароля можно забыть удалить, случайно открыть извне или сохранить с секретом внутри. CLI-файл лежит за пределами document root, отказывается работать как веб-страница и получает пароль через stdin. После работы он удаляется. Это сохраняет инструкцию короткой, не оставляя на сайте нового интерфейса административного воздействия.
Если SSH и возможности выполнять PHP на сервере нет, этот способ неприменим. Доступ только к форме авторизации недостаточен. Нужна помощь владельца сервера или хостинга с разрешённым серверным запуском; для облачного Битрикс24 используется восстановление через поддержку. Здесь рассматривается ровно авария, при которой доступ к серверу есть, а пароль первоначального администратора потерян.

