Вход | Регистрация


1С:Предприятие ::

Метки:внешние обработки

тема избитая но! как выгнать юзверев из одной базы....

Я
   Skom
 
07.02.08 - 06:20
работа в терминале....
поубивать сессии невозможно так как у многих открыта не одна база....
+ необходимо по возможности без изменения конфигурации то есть внешним приложением или обработкой....
 
 
   Андрюха
 
1 - 07.02.08 - 06:24
Заведи константу КышИзБазы и мониторь ее значение.
Если Константа.КышИзБазы = 1 Тогда
    ЗавершитьРаботуСистемы(0);

   Папа Гапа
 
2 - 07.02.08 - 06:25
"необходимо по возможности" - хорошая формулировка, надо запомнить.
   Если
 
3 - 07.02.08 - 06:27
(1) Не всегда работает.
   Папа Гапа
 
4 - 07.02.08 - 06:28
(1) Если "без изменения конфигурации" да ещё и в терминале - то логичнее завести в самом виндовсе переменную и её проверять. Создать внешний отчет, открыть его при начале работы (это можно сделать не меняя конфы), угнать отчетик за пределы экрана и ПриЗакрытии ему написать СтатусВозврата(0). Там мониторить.
Можно поизвращаться....
   Skom
 
5 - 07.02.08 - 06:31
а есть возможность скриптом?
   Skom
 
6 - 07.02.08 - 06:34
вопрос такой....я могу получить все скуль процессы по нужной базе....
могу я по ним вычислить имя процесса точнее какой процесс его запустил и выключить его
   ZanderZ
 
7 - 07.02.08 - 06:39
(6) можешь
   Андрюха
 
8 - 07.02.08 - 06:40
(4) Просвети что означает "логичнее завести в самом виндовсе переменную и её проверять"
   Если
 
9 - 07.02.08 - 06:43
(7) ИМХО.Только у юзверя окно висеть останется с криком о невосстановимой ошибке и пока он кнопку не топнет ты ничего не сделаешь.
   Если
 
10 - 07.02.08 - 06:45
Попробуй, лучше, альтернативные стартовые окна. они топчут не СКЛ, а 1С.
 
  Рекламное место пустует
   Skom
 
11 - 07.02.08 - 06:52
(10) смотри...
есть перечень скл процессов по нужной базе...
например есть процесс с PID = 50
могу я по этому процессу получить процесс 1С который "принадлежит" этому скуль процессу и сначала убить процесс 1С. а потом порубить тот же но скульный процесс. и тада окна не останецца
   smaharbA
 
12 - 07.02.08 - 06:57
    РекордСет=СоздатьОбъект("ADODB.Recordset");
    Рекордсет.Open("select spid,dbid,
    |DateTime=replace(replace(cast(day(login_time) as char(3))+cast(month(login_time) as char(3))+cast(year(login_time) as char(5))+datename(hh,login_time)+' '+datename(mi,login_time)+' '+datename(ss,login_time)+' '+datename(ms,login_time),'  ',' '),' ',','),
    |[Дата]=login_time,
    |[Секунды]=3600*datename(hh,login_time)+60*datename(mi,login_time)+datename(ss,login_time),
    |Время_действия=replace(replace(cast(day(last_batch) as char(3))+cast(month(last_batch) as char(3))+cast(year(last_batch) as char(5))+datename(hh,last_batch)+' '+datename(mi,last_batch)+' '+datename(ss,last_batch)+' '+datename(ms,last_batch),'  ',' '),' ',','),
    |ComputerName=hostname,hostprocess,program_name
    |from master.dbo.sysprocesses
    |where dbid=db_id('"+База+"') and spid<>@@spid
    |order by spid;",Кон,3,1,1);

   Если
 
13 - 07.02.08 - 06:57
(11) Ну наверно. Когда получится-кинь плиз, посмотрим.
   Skom
 
14 - 07.02.08 - 06:59
(12) - привет
это скульные процессы получу?
   Skom
 
15 - 07.02.08 - 06:59
скульные процессы у мя есть....я их малость по другому получаю...
   smaharbA
 
16 - 07.02.08 - 07:00
(15) не только скульные, но и хостовые, а далее вышибай и там и там
   Если
 
17 - 07.02.08 - 07:02
(16) Может и окончание покажешь?
   smaharbA
 
18 - 07.02.08 - 07:02
далее примерно так
    ТЗВрем.ВыбратьСтроки();
    ТЗКомп=СоздатьОбъект("ТаблицаЗначений");
    ТЗКомп.НоваяКолонка("Я");
    ТЗКомп.НоваяКолонка("Компьютер");
    ТЗКомп.НоваяКолонка("Процесс");
    ТЗКомп.НоваяКолонка("Пользователь");
    к=0;
    Пока ТЗВрем.ПолучитьСтроку() = 1 Цикл
        Стр="";
        ТЗВрем.ТЗ.ВыбратьСтроки();
        Пока ТЗВрем.ТЗ.ПолучитьСтроку() = 1 Цикл
            Если ТЗВрем.ТЗ.П="@" Тогда
                Если ТЗВрем.ТЗ.Я="Я" Тогда
                    Если Вопрос("Точно вырубить себя?",1,5)=1 Тогда
                    Иначе
                        Продолжить;
                    КонецЕсли;
                КонецЕсли;
                Стр=Стр+"declare @exec_str_"+к+" VARCHAR(255);
                |select @exec_str_"+к+" = 'kill ' + convert(varchar(7), "+ТЗВрем.ТЗ.spid+");
                |exec (@exec_str_"+к+");
                |";
                ТЗКомп.НоваяСтрока();
                ТЗКомп.Компьютер = ТЗВрем.ТЗ.ComputerName;
                ТЗКомп.Процесс = ТЗВрем.ТЗ.hostprocess;
                ТЗКомп.Я=ТЗВрем.ТЗ.Я;
                ТЗКомп.Пользователь=ТЗВрем.ТЗ.ПользовательОС;
                к=к+1;
            КонецЕсли;
        КонецЦикла;
        ТЗВрем.Коннект.execute(Стр);
        ТЗКомп.Сортировать("Я");
        ТЗКомп.ВыбратьСтроки();
        Пока ТЗКомп.ПолучитьСтроку() = 1 Цикл
            Попытка
                Процесс=ПолучитьОбъект(Шаблон("[Моникер//[ТЗКомп.Компьютер]/root/cimv2:Win32_Process.Handle='[ТЗКомп.Процесс]'"));
 
                Процесс.Terminate();
            Исключение
                ОтключениеБлокировкиФайлов(ТЗКомп.Компьютер,ТЗКомп.Пользователь);
                Сообщить("На компьютере ["+ТЗКомп.Компьютер+"] что-то с РПС ("+ОписаниеОшибки()+")");
            КонецПопытки;
        КонецЦикла;
    КонецЦикла;
    Форма.ОбработкаОжидания("ПриОткрытии",2);

   Если
 
19 - 07.02.08 - 07:12
(18) Кон в рекордсет, что за переменная?
   Skom
 
20 - 07.02.08 - 07:12
но это вырубит всех некорректно я так понимаю....
а можно как то владельцам этих процессов послать мессаг что они будут отключены....например по скулю?
   smaharbA
 
21 - 07.02.08 - 07:15
(19) это коннект к базе
        ТЗБаз.Коннект = СоздатьОбъект("ADODB.Connection");
        ТЗБаз.Сервер = СокрЛП(Сп.Получить("Сервер"));
        ТЗБаз.База = СокрЛП(Сп.Получить("База"));
        ТЗБаз.Пользователь = СокрЛП(Сп.Получить("Пользователь"));
        ТЗБаз.Пароль = СокрЛП(Сп.Получить("Пароль"));
        ТЗБаз.Коннект=СоздатьОбъект("ADODB.Connection");
        ТЗБаз.Коннект.cursorlocation=3;
        ТЗБаз.ТипБазы = "SQL";
        ТЗБаз.Коннект.open("provider=SQLOLEDB;data source="+ТЗБаз.Сервер+";DataBase="+ТЗБаз.База+";uid="+ТЗБаз.Пользователь+";pwd="+ТЗБаз.Пароль); 


а как получить строку коннекта для 77, сто раз было...
   smaharbA
 
22 - 07.02.08 - 07:16
(20) не всех, а "избранных" в ТЗ на форме...
Да, некорректно, но в скуле это почти пофих
   Skom
 
23 - 07.02.08 - 07:22
(22) а как при этом оповестить пользователей
   Skom
 
24 - 07.02.08 - 07:24
и подскажи как dbid получить из имени базы строкового в скуле в ЕМ
   smaharbA
 
25 - 07.02.08 - 07:24
(23) у тебяж известен хостпроцесс, определяй кто это системный
примерно так
    Процесс=ПолучитьОбъект(Шаблон("[Моникер//[ТЗВрем.Computername]/root/cimv2:Win32_Process.Handle='[ТЗВрем.hostprocess]'"));
 
    Скрипт.Reset();
    Скрипт.AddObject("p",Процесс);
    Скрипт.Eval("p.GetOwner(user,domain)");
    ТЗВрем.ПользовательОС=Скрипт.Eval("user");
    ТЗВрем.clientname=Процесс.CSName;
    ТЗВрем.OS_client=Процесс.OSName;

   Skom
 
26 - 07.02.08 - 07:25
(22) все 24 снимается...
   smaharbA
 
27 - 07.02.08 - 07:25
(24) в (12) есть
where dbid=db_id('"+База+"')
   Skom
 
28 - 07.02.08 - 07:26
)25) опиши поподробней плиз...что то не врублюсь
   Skom
 
29 - 07.02.08 - 07:26
(27) я малость по другому....
я делаю выгон пользователей по аське....то есть робоку кинул мессагу с параметрами.....он оповестил всех и всех выкинул....
   smaharbA
 
30 - 07.02.08 - 07:34
+(25) на скрипте по аналогии примерно так, не будуж весь код гнать, там его многа и зачастую дерьмовый, а лажаться не хочу ))

set process=GetObject("winmgmts://" & CompName & "/root/cimv2:win32_process.Handle='" & ProcessId & "'")
process.GetOwner(user,domain);
set wshshell=CreateObject("wscript.shell")
wshshell.run("net send " & user & " ""Фигли сидите? Идите бамбук курить""",0,-1)
process.terminate
   smaharbA
 
31 - 07.02.08 - 07:35
CompName и ProcessId получили выше из скуля
   Skom
 
32 - 07.02.08 - 07:38
ок пасиб счас как сделаю отпишусь...ужо почти готово
   Skom
 
33 - 07.02.08 - 07:56
(31)а по поводу (18) убъются тока терминальные процессы....
или скриптом мона убить процессы 1с и на машинах клиентов
 
  Рекламное место пустует
   Skom
 
34 - 07.02.08 - 08:59
а в SQLDMO - есть необходимая инфа?
   Skom
 
35 - 07.02.08 - 13:24
усе...выгонялка готова.....
сначала убивает все процессы 1С по выбранной базе (sql процесы почему то аккуратно закрываются по убитию процессов 1с) но на всякий случай
делает контрольный запрос по скуль процессам по текущей базе данных и убивает их если они еще выжили
   Если
 
36 - 07.02.08 - 13:25
(35) Поделись.%))
   sapphire
 
37 - 07.02.08 - 13:28
изобретателям колеса:
http://script-coding.info/filez.html
http://script-coding.info/1Cv7.zip

Маленькая конфигурация для 1С:Предприятия v7.7 "Администратор 1С". В конфигурации широко используются механизмы Windows Script Host. Используется внешняя компонента "Journal 2.6" (автор компоненты - Усков Михаил aka MMF). Для эффективного использования конфигурации потребуются права администратора в Windows. Основные возможности:

   * Хранение перечней сотрудников, компьютеров (рабочих станций и серверов) и информационных баз 1С в иерархических справочниках конфигурации.
   * Первоначальное заполнение справочников компьютеров и информационных баз автоматически по данным AD и реестра.
   * Мгновенный запуск 1С:Предприятия в режимах предприятия, конфигуратора, монитора на любой информационной базе.
   * Мгновенный запуск архивации (выгрузки данных) средствами 1С:Предприятия любой информационной базы.
   * Автоматические копирование обновленных квартальных отчетов по каталогам информационных баз.
   * Просмотр и принудительное завершение запущенных в настоящий момент любых процессов на любом компьютере в сети.
   * Просмотр и принудительное завершение запущенных в настоящий момент процессов SQL-сервера.
   * Просмотр открытых в настоящий момент файловых ресурсов на сервере.
   * Просмотр и принудительное завершение запущенных в настоящий момент файловых сессий пользователей на сервере.
   * Принудительный Log Off, Reboot, Shutdown любого компьютера в сети.
   * Рассылка сообщения ("Net Send") выбранным компьютерам.
   * Просмотр активных в настоящий момент пользователей во всех базах в одном списке (альтернативный монитор). Используется внешняя компонента "Journal 2.6".
   * Просмотр перечня пользователей (по данным файлов users.usr) во всех базах в одном списке, печать списка. Используется внешняя компонента "Journal 2.6".
   * Просмотр и редактирование перечня зарегистрированных информационных баз 1С:Предприятия на любом компьютере в сети.


Чтобы установить конфигурацию, скачайте 1Cv7.zip и journal.zip с этой странички и выполните следующие действия:

   * Скопируйте файл journal.dll в каталог "BIN" 1С:Предприятия.
   * Создайте пустой каталог на жёстком диске, зарегистрируйте его как информационную базу в диалоге "Запуск 1С:Предприятия".
   * Откройте информационную базу в режиме Конфигуратора и выполните команду меню "Конфигурация" - "Загрузить измененную конфигурацию...", указав скачанный md-файл.


Для эффективного использования конфигурации потребуются права администратора в Windows. Чтобы не логиниться в Windows под администратором, создайте на рабочем столе ярлык с примерно такой командной строкой в поле "Target":

"C:\Program Files\1Cv77\BIN\1cv7s.exe" Enterprise /D"C:\Admin1C\" /m /NVasya /P111

Установите в свойствах ярлыка на вкладке "Shortcut" флажок "Run as different user" и пользуйтесь для запуска конфигурации только этим ярлыком. Каждый раз при запуске ярлыка вам надо будет ввести пароль администратора Windows.
   Skom
 
38 - 07.02.08 - 13:30
(37) вот как раз многое из этой разработки и берется...
спасибо автору + остальное из инета....
пока тока учусь в скриптовании.....поэтому использую сторонние разработки....разбирая их по частям и изучая что то новое
   Aswed
 
39 - 07.02.08 - 13:30
(37) Всех уел:)))
   Skom
 
40 - 07.02.08 - 13:30
(36) бота конечно не дам но сам процесс выхода....на
   Skom
 
41 - 07.02.08 - 13:31
Процедура Сформировать()
    Поз = Найти(Данные, "(");
    Ник = Лев(Данные, Поз - 2);
    Данные = Сред(Данные, Поз + 1);
    Поз = Найти(Данные, ")");
    УИН = Лев(Данные, Поз - 1);
    Данные = Сред(Данные, Поз + 3);
    
    
    
    спПараметров = СоздатьОбъект("списокЗначений");
    Данные = Сред(Данные,11);
    КоличествоПараметров = СтрЧислоВхождений(Данные,";");
    НоваяСтрока = Данные;
    Для а = 1 По КоличествоПараметров Цикл
        Рез = Найти(НоваяСтрока,";");
        Если Рез <> 0 Тогда
            Параметр = СокрЛП(Лев(НоваяСтрока,Рез-1));
            спПараметров.ДобавитьЗначение(Параметр);
            НоваяСтрока = Сред(НоваяСтрока,Рез+1);
        КонецЕсли;
        
    КонецЦикла;
    
    ИмяКомпа = спПараметров.ПолучитьЗначение(1);
    Логин    = спПараметров.ПолучитьЗначение(2);
    Пароль   = спПараметров.ПолучитьЗначение(3);
    Если спПараметров.РазмерСписка() > 3 Тогда
        База     = спПараметров.ПолучитьЗначение(4);
    Иначе
        База = "";
    КонецЕсли;
    
    ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");
    ScrptCtrl.Language="vbscript";
    
    Мессаг = "";
    Если ПустоеЗначение(ИмяКомпа)=1 Тогда
        Мессаг = "Не указано имя компьютера";
    КонецЕсли;
    
    Попытка
        дб = СоздатьОбъект("ODBCDatabase");
        рс = СоздатьОбъект("ODBCRecordset");
        дб.Соединение("DRIVER=SQL Server;SERVER="+ИмяКомпа+";UID="+Логин+";PWD="+Пароль+";DATABASE=master;");
        рс.УстБД(дб);
        ТекстЗапроса = " 
        |Select hostname, spid, program_name, hostprocess
        |from sysprocesses
        |where dbid = (select dbid from sysdatabases where name = '"+База+"') and program_name = '1CV7'
        |";
        ТЗ = рс.ВыполнитьИнструкцию(ТекстЗапроса);
        
        Мессаг = "";
        ТЗ.Сортировать("hostname");
        ТЗ.ВыбратьСтроки();
        Пока ТЗ.ПолучитьСтроку() = 1 Цикл
            Попытка
                ScrptCtrl.AddCode("
                |Function GetProcesses()
                |    Set WMI = GetObject(""winmgmts:{ImpersonationLevel=Impersonate}!\\"+СокрЛП(ТЗ.hostname)+"\Root\CIMV2"")
                |    For Each Proc In WMI.ExecQuery(""SELECT * FROM Win32_Process WHERE ProcessId="+СокрЛП(ТЗ.hostprocess)+""")
                |        Proc.Terminate
                |    Next
                |End Function
                |");
                ScrptCtrl.Run("GetProcesses");
            Исключение
                Сообщить(ОписаниеОшибки());
                Возврат;
            КонецПопытки;
        КонецЦикла;
        
       //Попытка
 
       //    SQLDMO=СоздатьОбъект("SQLDMO.SQLServer");
 
       //    SQLDMO.Connect(ИмяКомпа,Логин,Пароль);
 
       //    ТЗ.ВыбратьСтроки();
 
       //    Пока ТЗ.ПолучитьСтроку()=1 Цикл
 
       //        SQLDMO.KillProcess(Строка(ТЗ.spid));
 
       //    КонецЦикла;
 
       //    SQLDMO.Close();
 
       //Исключение
 
       //    Сообщить(ОписаниеОшибки());
 
       //    Возврат;
 
       //КонецПопытки;
 
       //Мессаг = "всех убили";            
 
    Исключение
        Мессаг = "Какая то ошибка";
    КонецПопытки;
    
    Попытка
        SQLDMO=СоздатьОбъект("SQLDMO.SQLServer");
        SQLDMO.Connect(ИмяКомпа,Логин,Пароль);
        ТЗ = СоздатьОбъект("ТаблицаЗначений");
        ТЗ.Загрузить(SQLDMO.EnumProcesses());
        Для Сч=1 по SQLDMO.EnumProcesses().Rows Цикл
            Приложение=СокрЛП(SQLDMO.EnumProcesses().GetColumnString(Сч,5));
            БазаSQL=СокрЛП(SQLDMO.EnumProcesses().GetColumnString(Сч,7));
            Компьютер=СокрЛП(SQLDMO.EnumProcesses().GetColumnString(Сч,4));
                Если Приложение<>"1CV7" Тогда
                    Продолжить;
                Иначе
                    Если База <> "" Тогда
                        Если БазаSQL<>База Тогда
                            Продолжить;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
            SQLDMO.KillProcess(SQLDMO.EnumProcesses().GetColumnLong(Сч,1));
            Мессаг = Мессаг + " PID " + SQLDMO.EnumProcesses().GetColumnLong(Сч,1) +     " база " + БазаSQL + " компьютер " + Компьютер + РазделительСтрок;
        КонецЦикла;
        SQLDMO.Close();
    Исключение
        Мессаг = "Ошибка чтения данных из SQL." + ОписаниеОшибки() + ". Срубился на колонке " + Сч;
       //Возврат;
 
    КонецПопытки;
    
    Если Мессаг = "" Тогда
        Мессаг = "Ничего не нашли";
    КонецЕсли;
    
    глОтправитьМессагICQ(Мессаг,УИН);
    
КонецПроцедуры
   Fragster
 
42 - 07.02.08 - 13:33
Если они в терминале - через диспетчер терминала удаленным управлением зайти и закрыть 1с за них ;)
   Skom
 
43 - 07.02.08 - 13:33
ее конечно еще отлаживать надо....лишнее убрать и код оптимихзировать....
наладить ответные сообщения сколько юзеров было сколько выгнали сколько осталось....
проверял на локальном компе...3 базы....
выбивает процессы...причем скульные процессы отваливаются сами собой....
ну и как говорил контрольный обход скуль процессов и уничтожение их
   Skom
 
44 - 07.02.08 - 13:34
(42) ну это логично....тока половина не в терминале и у многих в терминале открыто по нескольку экземпляров а заходить к 50 пользователям и выборочно закрывать???? бред ну в смысле долго когда счет на минуту идет
   sapphire
 
45 - 07.02.08 - 13:34
(41) Не забудь убить lck
   Волшебник
 
46 - 07.02.08 - 13:35
   Skom
 
47 - 07.02.08 - 13:37
(45) - точно ...что то не учел пасиба тебе добрый человек...))
   Skom
 
48 - 07.02.08 - 13:45
чет не убиваеццо
   Skom
 
49 - 07.02.08 - 13:47
тьфу не тот убиваю
 
 
   sapphire
 
50 - 07.02.08 - 13:47
(48) Эээ... значит есть процесс его использующий, либо ты путаешься убить сам себя :)
   Skom
 
51 - 07.02.08 - 13:50
не я просто написал КаталогИБ() +
а файл то реально в другой базе лежит....
   Berck
 
52 - 07.02.08 - 13:51
(50) +1 Как себя выгнать из базы?
   sapphire
 
53 - 07.02.08 - 13:51
(51) Совет: не используй ты объект ФС, или проверяй существует файл/каталог или нет иначе удалишь винду :)
   BUBU
 
54 - 07.02.08 - 14:14
37)  А где же journal.zip ?
   Если
 
55 - 07.02.08 - 14:15
(54) Там же смотри на строчку ниже.
   BUBU
 
56 - 07.02.08 - 14:18
54) Я почему-то только вижу 1CV7.zip
 на какую строчку ниже ?
   Если
 
57 - 07.02.08 - 14:22
   Если
 
58 - 07.02.08 - 14:23
   Skom
 
59 - 08.02.08 - 04:33
(53) конечно ж епроверка перед удалением идет
   spartanec
60 - 08.02.08 - 10:32
Можно написать программу-запускальщик 1с. Она запускает саму программу + регистрируется на сервере (там тоже своя программа). Как надо всех выкинуть - сигнализируем стартерам - мол надо того. Оно окошко пользователю выдает - Мол, выходи по-хорошему и обратный отсчет. Если не вышел - посылаем сообщение окну 1с о необходимости закрытия и ждем еще немного. Если не закрылось по завершению нового таймаута - грохаем процесс.

минусы - чревато крахом бд
   Skom
 
61 - 08.02.08 - 10:36
ну у меня пока тестится это тока на скуль базах
ы крах БД....наверное может быть конечно но....
обычно если отваливается процесс 1с то скуль остаецца висеть а убивая процесс скриптом.....скульный процесс почему то тоже умирает....
правда потом контрольный обход скуль процессов и снова попытка всех кикнуть



Список тем форума
Рекламное место пустует   Рекламное место пустует
Закон Брукера: Даже маленькая практика стоит большой теории.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует