Как запустить приложение из 1С с правами администратора без пароля и определить пользователя ОС?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто в процессе разработки прикладных решений на платформе 1С возникает необходимость запускать внешние исполняемые файлы (.exe, скрипты, bat-файлы) с повышенными привилегиями. Стандартная команда КомандаСистемы вызывает диалоговое окно для ввода пароля, что является неудобным для автоматизированных процессов. Давайте разберем, как решить эту задачу и как сопоставить пользователя Windows с учетной записью 1С.

Запуск приложений с повышенными правами через PowerShell

Наиболее эффективным и простым способом выполнения команды с правами администратора без необходимости ввода пароля вручную является использование PowerShell. Платформа 1С позволяет передать команду в системную оболочку, которая выполнит повышение прав через механизм Verb Runas.

Для запуска программы используем следующий подход:


Команда = "powershell Start-Process Notepad.exe -ArgumentList ""d:\1.txt"" -Verb Runas";
КомандаСистемы(Команда);

Разберем параметры команды подробнее:

Если вам нужно запустить приложение с параметрами (например, для терминального клиента), используйте тильду или корректное экранирование кавычек в строке аргументов.

Использование планировщика задач Windows

Если задача требует регулярного выполнения скриптов с правами системы (например, выгрузка базы .dt), надежнее всего использовать планировщик задач Windows. В 1С мы можем лишь инициировать запуск уже настроенного задания.

Рассмотрим порядок действий:

  1. Создайте задание в планировщике Windows и настройте его на запуск от имени администратора или пользователя SYSTEM.
  2. Установите галочку «Выполнять с наивысшими правами».
  3. В коде 1С используйте команду schtasks /run /tn "ИмяВашегоЗадания".

Это полностью исключает проблему с вводом пароля, так как права уже делегированы заданию на уровне ОС.

Как получить соответствие пользователя ОС и пользователя 1С?

Вопрос идентификации текущего пользователя Windows внутри сеанса 1С является частой архитектурной задачей. Стандартной прямой привязки между ними нет, если не используется авторизация средствами ОС. Рассмотрим способы решения:

1. Получение текущего пользователя ОС

Чтобы узнать, кто работает в системе, можно воспользоваться простым вызовом PowerShell внутри 1С:


// Получение имени пользователя через WMI/PowerShell
ОбъектWMI = ПолучитьCOMОбъект("winmgmts:");
Запрос = "SELECT * FROM Win32_Process WHERE ProcessId = " + ПолучитьIDТекущегоПроцесса();
// Или проще:
Команда = "powershell [System.Security.Principal.WindowsIdentity]::GetCurrent().Name";

2. Создание регистра соответствия

Поскольку один пользователь ОС может заходить в базу под разными именами (например, в терминале), самым надежным способом является создание Регистра Сведений «СоответствиеПользователейОС». Разберем алгоритм его наполнения:

Этот подход позволяет избежать обращений к сложным и «тяжелым» объектам, таким как ЖурналРегистрации или СоединенияИнформационнойБазы, что положительно сказывается на производительности всей системы.

Резюме

Мы выяснили, что для повышения прав лучше всего подходит использование PowerShell с параметром -Verb Runas для разовых задач или schtasks для регламентных действий. Для ведения учета связки пользователей рекомендуем использовать Регистр сведений, так как это единственный архитектурно верный путь, позволяющий хранить бизнес-логику привязки сотрудников к их системным именам.

← На главную