none
Завершение определенной терминальной сессии на Windows Server 2003 через консоль. RRS feed

  • Общие обсуждения

  • Условия
    Имеем один сервер терминалов под Win 2003.

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

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


    ВОПРОС: какими штатными средствами можно автоматически либо отлогофить, а затем залогофить определенную терминальную сессию ?


    Особенности:
    1. Простой taskkill процесса программы и затем запуск его через start от нужной служебной учетки к сожалению не то - запуск будет произведен НЕ в контексте нужной терминальной сессии, т.е. в сеансе эта программа не появится, хотя и будет висеть в списке процессов будучи запущенной от определенного пользователя. Теряется контроль над программой, ее не видно.
    2. Консольные средства завершения или резета терминальной сессии вроде logof или reset session также не годятся. Первое не может быть помещено в шедулер на столе служебной учетки, т.к. у последней нет доступа к шедулеру (хотя в принципе можно было бы сделать), а второе требует указания имени сессии или его ID, а они будут все время разными, т.к. на том же сервере работают также бухи в 1С...
    9 января 2009 г. 7:39

Все ответы

  • Остроумно умеете удалять аппендикс через горло, но что насчёт логона не в терминальную сессию, а интерактивную (консольную) автологоном?

     

    И хотелось бы услышать условия всей задачи, а не придуманное угловатое решение. Пытаетесь объяснить, насколько красивыми должны быть костыли - может, можно вообще без них ходить?

    9 января 2009 г. 8:17
    Отвечающий
  • Условия задачи следующие:

    1. Есть сервер 2003, он контроллер домена (один из трех) и терминальный сервер.
    2. На нем работают бухи в 1С 7.7 и в отдельном терминальном сеансе висит под специальной уникальной служебной учеткой некая программа, написанная отечественными разрабами на Delphi. Программа работает с СУБД Firebird, сама СУБД работает на другом сервере (должна работать на другом, долго объяснять почему и иначе не работает).
    Программа выполняет служебные и обслуживающие функции для корпоративного ПО - выполняет задания, сценарии, написанные на внутреннем языке ПО, занимается импортом/экспортом информации, в т.ч. из других БД, Excel и т.п.
    3. Программу требуется каждый день отключать ночью в момент некоторых хитрых монопольных операций с
    СУБД Firebird и затем снова включать после их завершения. Время, когда нужно перезапускать программу колеблется в пределах 15 минут, в принципе можно перезапустить через полчаса - с запасом. Впрочем база растет и соответственно время, необходимое для проведения "шаманских танцев" с СУБД тоже постепенно удлиняется...
    4. Программа имеет GUI интерфейс, она не консольная, не сервис. В сервис не может быть преобразована. Более того, требуется периодически заходить на сервер и контроллировать ее работу, т.к. она иногда может подвиснуть (тоже долго объяснять почему, но бывает). Программа не ведет логи в системэвент или текстовые файлы, просмотреть их можно только из ее интерфейса (либо неудобно прямым просмотром БД), потому для выяснения причин очередного "затыка" и нужен свободный доступ к ней для нескольких администраторов.
    5. Программа должна вертеться под непревилегированной учеткой, для этого заведен специальный служебный доменный пользователь. Его логин/пароль забиты в профиль RDP, который запускается из шедулера на сервере через mstsc.
    Собственно вся авантюра с терминальной сессией как раз и служит для удобного доступа нескольких разных администраторов к телу программы.
    6. Принудительное прерывание процесса программы полностью безопасно. Проверено годами.
    7. Простыми штатными средствами узнать ID нужного сеанса или его имя нельзя из-за постоянной и весьма хаотичной работы бухгалтерии (десяток человек), которые иногда оставляют на ночь запущенные большие годовые отчеты. Вернее конечно можно, но для этого нужно "заниматься любовью" с VBScript. PowerShell пока не пробовали, есть надежда что там все проще.


    Задача внешне проста - глушить сеанс в определенное время и рестартить его, пока в определенное время но есть возможность и по окончанию работ с СУБД.
    Либо глушить внутри сеанса эту программу и затем
    каким-то хитрым образом запускать ее но в контексте конкретного терминального сеанса (опять таки натыкаясь на грабли невозможности определения его номера или имени).
    9 января 2009 г. 10:46