Запуск процессов в профиле нужного пользователя из сервера 1С















У меня возникла необходимость запустить приложение (на самом деле bat-ничек) из сервера 1С, но так, чтобы сам bat-ник выполнился с привилегиями и из под профиля другого пользователя (например, администратора). Сам сервер 1С запущен из под стандартной учетной записи USR1CV82, а она не имеет прав почти ни на что. И это хорошо. Решений для этой задачи масса. Боян еще тот, но… Сколько смотрел. Везде нужно оставить зачастую в открытом виде пароль от той учетной записи, под которой нужно выполнить запуски. Или необходимо скачать/установить какое-либо средство администрирования. Я же нашел решение, использующее только стандартные средства Windows.

Итак. Windows Server 2008R2 (Должно работать на всем начиная с Windows7, хотя, может, и под XP сработает, не проверял). В моем случае есть web-сервис. У него есть метод InserCustomer(sXML). Все это неважно. Важно, в каком контексте этот метод вызывается. А вызывается он в контексте пользователя USR1CV82. Т.е. очень ограниченные права. Запустить что-либо из под нее не всегда получается. В моем случае нужно было именно запустить приложение, которое не может выполняться под такой урезанной учетной записью.

На выручку приходит Планировщик задач. Создаем там задачу. Все просто. Расписание можно не указывать (а если нужно — можно и указать). Важно указать учетную запись, под которой задача должна запускаться, и ввести пароль от этой учетной записи. Все. Более пароль от этой учетки нам нигде оставлять не нужно (и уж тем более в открытом виде).

Далее нам нужно дать права на эту задачу пользователю USR1CV82 (в моем случае, а в вашем, может, и другой, из которого вам нужно давать команду на запуск). Для этого открываем папку C:Windowssystem32Task. Надеюсь, все, у кого Windows установлен в другой директории, смогут найти эту папку самомстоятельно. В этой папке все задачи Планировщика лежат в виде файлов. Находим нашу (по названию) и ПКМ-Свойства-Безопастность. Ну и добавляем чтение/выполнение для пользователя USR1CV82. Да, кстати, если эту задачу нужно будет запускать и из-под других пользователей, то также можно добавить и их. На этом с безопастностью все.

 

Теперь как запустить эту задачу из web-сервиса 1С (в моем случае) или из любого серверного метода (или вообще от куда угодно). Для этого выполняем такой короткий код:

WshShell=Новый COMОбъект("Wscript.Shell");
WshShell.Run("schtasks /Run /TN НазваниеЗадачиВПланировщике");

Как видите, все очень просто. Удобно, что не требуется никаких внешних средств для администрирования такой простой задачи.

Всем спасибо за внимание. Надеюсь, кому-то помог.

5 Comments

  1. demkonst

    А как хранится список задач планировщика? Держу пари, в виде какого-нибудь конфига, завернутого в хеш, или тот же стандартный виндовый DPAPI. Я к тому, что там пароль тоже хранится наверняка в открытом виде (или условно-открытом).

    Reply
  2. Dimasik2007

    Советую еще посмотреть в сторону http://admilink.narod.ru/admilink.htm, тулза очень полезная.

    AdmiLink — утилита, при помощи которой Администратор может создать ярлык, дающий возможность пользователям с ограниченными правами запускать конкретную (без возможности подмены!) программу с правами Администратора (или любого другого пользователя) без (интерактивного) ввода пароля.
    Reply
  3. gep

    (1) demkonst, Да, вы правы. Это просто файл. Но доступ на запись есть только у Владельца изначально (т.е. тот кто создал). Далее он и Администратор могут дать доступ на чтение и/или запись другим пользователям.

    По поводу его содержимого. Вот что содержит файл задачи которую я создал при написании статьи:

    c:WindowsSystem32Tasks>type НазваниеЗадачиВПланировщике
    <?xml version=»1.0″ encoding=»UTF-16″?>
    <Task version=»1.2″ xmlns=»http://schemas.microsoft.com/windows/2004/02/mit/task»>
    <RegistrationInfo>
    <Date>2015-07-11T20:35:43.1013854</Date>
    <Author>Тут_имя_сервераАдминистратор</Author>
    </RegistrationInfo>
    <Triggers>
    <TimeTrigger>
    <StartBoundary>2015-07-11T20:32:25.2460687</StartBoundary>
    <Enabled>true</Enabled>
    </TimeTrigger>
    </Triggers>
    <Principals>
    <Principal id=»Author»>
    <RunLevel>LeastPrivilege</RunLevel>
    <UserId>Тут_имя_сервераАдминистратор</UserId>
    <LogonType>Password</LogonType>
    </Principal>
    </Principals>
    <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>­
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries­>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>­
    <IdleSettings>
    <StopOnIdleEnd>true</StopOnIdleEnd>
    <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
    <Priority>7</Priority>
    </Settings>
    <Actions Context=»Author»>
    <Exec>
    <Command>НашаПрограмма</Command>
    </Exec>
    </Actions>
    </Task>

    Показать

    Как видите кроме слова PASSWORD ничего о паролях. (К слову, у меня пароль не PASSWORD). При попытке записи задачи система запрашивает пароль того пользователя, под которым она будет в дальнейшем исполнятся. Без ввода пароля указать пользователя нельзя. Запись в этот каталог пользователи не имею. Сложно представить ситуацию при которой возможен обход пароля. Не исключаю что путь есть, но не уровня продвинутого пользователя.

    Reply
  4. gep

    (2) Dimasik2007, Спасибо. Действительно интересная программа. Да и сайт содержит интересную информацию. Но… Я прямо говорю о том, что мой подход хорошо тем, что не требует установки каких-либо сторонних приложение на ваш сервер (ну или просто компьютер). На мой взгляд это бывает важно. Несомненно, возможности предоставляемые программой AdmiLink очень широки, особенно начиная с версии 1.5. И это здорово.

    Reply
  5. gep

    (1) demkonst, Кстати, а DPAPI вы считаете условно открытым?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *