Имя: Пароль:
1C
1C 7.7
v7: Определить ID терминальной сессии
0 yur4egg
 
14.11.13
12:29
1С 7.7 + SQL + Windows Server 2003
Задача: пользователи часто звонят, прося выбросить их повисшие сеансы, хочется сделать возвможность им самим выбрасывать самих себя.
План решения:
1. Сделать батник, который запускается с ярлыка на компе юзера. Он создает текстовый файл с именем локального компа и сохраняет его где-то в сетевой папке общего доступа.
2. Этот файл служит сигналом для другой программы, которая крутится на сервере, и по нахождению этого файла выбрасывает сеанс клиента с этим именем компа. Затем подчищает текстовый файл.
Проблема в том,что нигде в интернете не смог найти способ, как по имени компа определить ID сеанса или наоборот. Диспетчер задач - единственная прога, которая показывает эту информацию, но она не сохраняет свою таблицу в текст. Утилиты и команды вроде quinsta или query user показывают ID сеанса, но не показывают имя компа. В 1С-ке можно через WScript.Shell можно определить имя пользователя и имя компа, но нельзя определить ID.  А выбрасывать сеанс нужно именно по ID. Потому как выбросить по имени не получится, ибо есть одновременно несколько юзеров под одной учеткой на сервере. А выбросить по имени компа я опять же нигде не нашел, как?
1 Стрелок
 
14.11.13
12:29
идиотизм. а поставить таймаут по бездействию или отключению на сброс не судьба?
2 Стрелок
 
14.11.13
12:30
а заодно решить вопрос по поводу повисших сеансов
3 Web00001
 
14.11.13
12:35
(1)+100500
Но бывает так, что не все сеансы надо отключать, :) вроде как вот это должно помочь http://greendail.ru/node/430
4 ADirks
 
14.11.13
14:16
Можно прямым запросом:

при старте
    ЗапросСКЛ.УстановитьТекстовыйПараметр("Пользователь", элПользователь);
    ЗапросСКЛ.Выполнить("Set NoCount ON
    |UPDATE $Справочник.Пользователи
    |Set $Справочник.Пользователи.SPID = 0
    |WHERE
    |    $Справочник.Пользователи.SPID = @@SPID
    |
    |
    |UPDATE $Справочник.Пользователи
    |Set $Справочник.Пользователи.SPID = @@SPID
    |WHERE
    |    ID = :Пользователь
    |");

при завершении

    ЗапросСКЛ.УстановитьТекстовыйПараметр("Пользователь", элПользователь);
    ЗапросСКЛ.Выполнить("Set NoCount ON
    |UPDATE $Справочник.Пользователи
    |Set $Справочник.Пользователи.SPID = 0
    |WHERE
    |    ID = :Пользователь
    |");

Ну и кроме SPID можно имя клиентского компа ещё писать, и всё что душа пожелает
5 ADirks
 
14.11.13
14:33
кстати, потом этот SPID используется для изощрённого поражения пользователей в правах

|    LEFT JOIN $Справочник.СвойстваКонтрагентов СВК ON СВК.ID = "+ОснСв
|WHERE
|    IsNull((SELECT $П1.фОграничитьДоступныхКонтрагентов FROM $Справочник.Пользователи П1 WHERE $П1.SPID = @@SPID), 0) = 0
|    OR $СВК.ЗначениеСвойства IN (
|        SELECT
|            $Свойства.Свойство
|        FROM
|            $Справочник.РазрешенныеКонтрагенты_Свойства Свойства
|        WHERE
|            Свойства.ParentExt = (SELECT П2.ID FROM $Справочник.Пользователи П2 WHERE $П2.SPID = @@SPID)
|            AND Свойства.IsMark = 0
|        )


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