none
Управление пользовательскими сессиями на сервере терминалов. RRS feed

  • Вопрос

  • Добрый день, уважаемые знатоки!

    Есть задача: написать скрипт для принудительного завершения определённой пользовательской сессии на сервере терминалов Windows 2008 SP2. Сервер введён в домен 2003, авторизация пользователей через AD. В сторону какого WMI-класса мне следует копать?

    20 января 2011 г. 12:58

Ответы

  • Попробуйте модуль http://code.msdn.microsoft.com/PSTerminalServices .
    • Помечено в качестве ответа me4huk 24 января 2011 г. 6:03
    20 января 2011 г. 13:07
    Отвечающий
  • >Да, я уже думал в эту сторону. Всё было бы хорошо, если бы юзеры открывали одну инстанцию 1C. Однако многим требуется несколько, по числу открытых баз. И тогда закрытие одной из баз в RemoteApp повлечёт за собой автоматическое завершение всех остальных, поскольку сессия-то одна на пользователя.

    Можно немного усовершенствовать батник для этого случая, например так:

    cd <путь к каталогу с программой>
    start /wait <исполняемый файл программы>
    set procname="1cv7.exe"
    set procfound=0
    for /f %%i in ('tasklist^|find /i %procname%') do (
    set procfound=1
    )
    if %procfound%==0 logoff

    После того, как процесс 1сv7.exe, запущенный этим батником, будет завершен, батник проверит: а не осталось ли еще процессов 1сv7.exe? Если не осталось, то последует команда logoff, иначе батник просто мирно завершит свою работу.


    my blog: http://shserg.ru/
    • Помечено в качестве ответа me4huk 24 января 2011 г. 6:03
    21 января 2011 г. 18:14

Все ответы

  • Попробуйте модуль http://code.msdn.microsoft.com/PSTerminalServices .
    • Помечено в качестве ответа me4huk 24 января 2011 г. 6:03
    20 января 2011 г. 13:07
    Отвечающий
  • Спасибо! Судя по описанию, модуль интересный.

    Я правильно понимаю, что, коль скоро Вы предлагаете использовать модуль, в основе которого лежит опенсурс-проект, штатных средств WMI/WHS для решения этой задачи не существует?

    21 января 2011 г. 8:26
  • В основе модуля,как раз лежат штатные средства(WinAPI).Лично я не знаю класса WMI,но можно также воспользоваться утилитами ,скажем logoff или tslogoff.
    21 января 2011 г. 8:38
    Отвечающий
  • Ну да, просто модуль облегчает использование средств API. Я не очень удачно выразился, извините.

    По всей видимости, именно в сторону штатных консольных утилит query.exe и logoff.exe мне и придётся смотреть для решения своей задачи. В смысле, парсить в скрипте вывод первой для использования второй, поскольку модуль PSTerminalServices предполагает наличие на рабочей станции PowerShell 2.0. Просто я надеялся, что существует более изящный способ управления сессиями напрямую через WMI/WSH...

    Задача-то у меня не сильно сложная. Терминальные юзеры у нас используют 1C 7.7 в режиме RemoteApp. А у семёрки есть одна неприятная особенность — при наличии внешних обработок она в терминальном режиме закрывается с ошибкой и терминальная сессия пользователя остаётся висеть в состоянии disconnected до истечения таймаута, по которому сервер обрубит её самостоятельно. Соответственно, для вступления в силу каких-либо пользовательских изменений, которые имели место на рабочей станции (например, переназначение принтера по умолчанию), в терминальном режиме юзеру недостаточно просто закрыть приложение и запустить его заново. Это-то я и хочу побороть...

    21 января 2011 г. 9:14
  • PSTerminalServices не требуется наличия PowerShell,где либо,кроме как на машине,где запускается скрипт.
    21 января 2011 г. 9:27
    Отвечающий
  • Посмотрите вот это обсуждение: http://social.technet.microsoft.com/Forums/ru/windowsserverru/thread/78bbb67b-8e82-4647-9e15-390aa349f017

    IIUC, то проблема в том, что при запуске внешней обработки стартует некий поцесс, который остается в памяти и не закрывается при завершеннии основного процесса 1с.

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

    cd <путь к каталогу с программой>
    start /wait <исполняемый файл программы>
    logoff

    Когда основноной процесс прекратит свою работу будет дана команда logoff, которая, по идее, должна завершить все оставшиеся процессы и завершить сеанс.


    my blog: http://shserg.ru/
    21 января 2011 г. 11:32
  • Да, я уже думал в эту сторону. Всё было бы хорошо, если бы юзеры открывали одну инстанцию 1C. Однако многим требуется несколько, по числу открытых баз. И тогда закрытие одной из баз в RemoteApp повлечёт за собой автоматическое завершение всех остальных, поскольку сессия-то одна на пользователя.

    Скажите, а у Win32_Process есть возможность считать StdOut запускаемой команды? Я понимаю, что можно запустить через WshShell.Exec, но хочется вообще без всяких окон командной строки... Пытаюсь написать что-то вроде следующего, но не могу понять, можно ли там считать вывод.

     

    	Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    	Set objStartup = objWMIService.Get("Win32_ProcessStartup")
    	Set objConfig = objStartup.SpawnInstance_
    	objConfig.ShowWindow = HIDDEN_WINDOW
    	Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process")
    	intReturn = objProcess.Create(strCommand, Null, objConfig, intProcessID)
    

     

    21 января 2011 г. 14:01
  • >Да, я уже думал в эту сторону. Всё было бы хорошо, если бы юзеры открывали одну инстанцию 1C. Однако многим требуется несколько, по числу открытых баз. И тогда закрытие одной из баз в RemoteApp повлечёт за собой автоматическое завершение всех остальных, поскольку сессия-то одна на пользователя.

    Можно немного усовершенствовать батник для этого случая, например так:

    cd <путь к каталогу с программой>
    start /wait <исполняемый файл программы>
    set procname="1cv7.exe"
    set procfound=0
    for /f %%i in ('tasklist^|find /i %procname%') do (
    set procfound=1
    )
    if %procfound%==0 logoff

    После того, как процесс 1сv7.exe, запущенный этим батником, будет завершен, батник проверит: а не осталось ли еще процессов 1сv7.exe? Если не осталось, то последует команда logoff, иначе батник просто мирно завершит свою работу.


    my blog: http://shserg.ru/
    • Помечено в качестве ответа me4huk 24 января 2011 г. 6:03
    21 января 2011 г. 18:14
  • Да, это вариант. Спасибо!
    24 января 2011 г. 6:02