Имя: Пароль:
1C
1C 7.7
v7: Выгонялка пользователей, 7.7
,
0 Bibr
 
30.05.13
15:21
Пришлось вспоминать 7.7
Сделал выгонялку пользователей простенькую - по условиям запускаю завершениеРаботы.
Упёрся в открытые модальные окна. Можно ли как-то обойти? Где почитать?
1 Mikeware
 
30.05.13
15:22
никак. блоировку пользователя, можальные окна и запрос переиндексирования/смены даты штатно не обходится.
2 Ёпрст
 
30.05.13
15:22
формекс использовать или taskkill
3 Chum
 
30.05.13
15:25
(1) вопрос на смену даты отключается в сервисе :-/

а вот с модальными окнами засада, разве, что только на скуле обрубать соединения, а с дбфщиками бороться при помощи кнута и обесточивания компьютерной силовой сети.
4 Bibr
 
30.05.13
15:31
(2) спасибо. а можно поподробней?
Необходимо отключать неотключившихся ночью.

Если использовать формекс или тасккилл это можно в автоматическом режиме сделать?
5 Ёпрст
 
30.05.13
15:34
(4) да.
формексу пофик на модальность, а тасккилу пофик на всё - тупо завершит процесс и привет.
6 Bibr
 
30.05.13
15:34
(2) кажется начал понимать. предлагается вырубить процесс 1С.
а можно ли получить имя базы по процессу? т.к. грохать надо только одну определенную базу.

и второй вопрос, если грохнуть тасккилом нигде никаких висюков не останется?
7 Bibr
 
30.05.13
15:34
(5) в формексе куда смотреть?
8 Ёпрст
 
30.05.13
15:35
а тебе для чего выгонялка то нужна хоть ?
Если базу копирнуть - то есть хорошее средство, никого выгонять не надо.
9 Bibr
 
30.05.13
15:55
(8) да, админ сказал для бэкапа папки базы и мд
10 ДенисЧ
 
30.05.13
15:56
(9) Для этого не обязательно выгонять
11 Ёпрст
 
30.05.13
15:56
12 Bibr
 
30.05.13
16:00
(11) спасибо, пробуем
13 Torquader
 
30.05.13
21:32
(1) Блокировку пользователя можно "обойти" если запускать 1С уже с выбранным пользователем через командную строку, а все остальные окна можно уже отслеживать из 1С.
P.S. при желании, если запускать 1С из специального процесса, то можно его "научить" закрывать окно авторизации по истечении некоторого времени.
14 Ganiev
 
31.05.13
07:27
Если у пользователя ник в 1с и в винде одинаковый то можно через обработку ожидания запустить килпроцесс и убить процесс 1с!))
15 Mikeware
 
31.05.13
07:49
(14) ох и любишь ты куйню городить...
16 ЧеловекДуши
 
31.05.13
07:58
(0) Модальное окно, это ЗЛО, нет не получится, даже через формекс :)
Т.е. через формекс уже нельзя будет считать все по простому :)
Лучше организовать внешнее приложение по закрытию открытой 1С и запускать енто приложение из самой 1С, при старте :)
17 ЧеловекДуши
 
31.05.13
08:05
(7) В формексе есть таймер, т.е. вот так там есть:

глСервис = СоздатьОбъект("Сервис");
глСервис.ОбработкаОжидания("глПроверкаПростоя",0); //10 сек.

//Функцию глПроверкаПростоя - разместить в глобальнике.
//И она будет всегда отрабатывать, даже если будет открыто
//модальное окно. :)
18 ЧеловекДуши
 
31.05.13
08:07
+(7) Так же такое от формекса отрабатывает даже при падении 1С
Т.е. когда вылазит фатальная ошибка 1С :)
19 varelchik
 
31.05.13
10:52
(18) с модальными да.
А вот выбор Времени, Периода, да еще вопрос Сохранить изменения или Сохранить документ, да еще кое какие ничем нельзя грохнуть.
Но колысь пробовал через dinwrap вроде.
20 Ковычки
 
31.05.13
10:54
можно все
21 ADirks
 
31.05.13
14:05
А вот например скрипт, убивающий строго определенные процессы (по каталогу базы), на всех компах домена. Естественно, надо соотв. права, и утилитку handle от Марка Руссиновича (www.sysinternal.com). Кандидат на отстрел определяется по факту захвата файла 1Cv7.LCK
Автора не помню.

======= Kill1C.js =================
var wsh = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var net = new ActiveXObject("WScript.Network");

var DomainName = "";
var IBDir = "";
var Flag_KillAll = false;
var ThisComputer = net.ComputerName;
var TempPath = wsh.ExpandEnvironmentStrings("%TEMP%");
try {
   if( !fso.DirectoryExists(TempPath) ) TempPath = "";
} catch(err) {
   TempPath = ".";
}


ProcessCommandLine();
KillProcesses(IBDir, DomainName);

//=====================================================================================
//=====================================================================================
//=====================================================================================

function KillProcesses(IBDir, DomainName)
{
   if( DomainName != null && DomainName != "" )
   {
       Debug('KillDomain');
       ADSI = GetObject("WinNT://" + DomainName);
       ADSI.Filter = Array("computer");
       Comp_enum = new Enumerator(ADSI);
       for(; !Comp_enum.atEnd(); Comp_enum.moveNext() )
       {
           var Comp = Comp_enum.item();
           if( Comp.Name.toLowerCase() == "adirks" )
           {
               KillOnComputer(IBDir, Comp.Name);
           }
       }
   }
   else
   {
       Debug('KillOnComputer');
       KillOnComputer(IBDir, ThisComputer);
   }

}

function KillOnComputer(IBDir, ComputerName)
{
   Debug(ComputerName+": "+"winmgmts:{ImpersonationLevel=Impersonate}!\\\\" + ComputerName + "\\Root\\CIMV2");
   try {
       WMI = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!\\\\" + ComputerName + "\\Root\\CIMV2");
   } catch(err) {
       return;
   }
   
   Proc_enum = new Enumerator( WMI.ExecQuery("SELECT Name, ProcessID FROM Win32_Process WHERE Name = '1cv7.exe' or Name = '1cv7s.exe' or Name = '1cv7l.exe'") );
   for(; !Proc_enum.atEnd(); Proc_enum.moveNext() )
   {
       var Proc = Proc_enum.item();
       Debug(Proc.Name+": "+Proc.ProcessID);
       if( NeedKill(Proc.ProcessID, IBDir) )
       {
           Debug("Terminate process "+Proc.ProcessID);
           Proc.Terminate
       }
   }
}


function NeedKill(ProcID, IBDir)
{
   if( Flag_KillAll ) return true;
   
   var HandlesFName = TempPath+"\\1c~kill~handles.tmp";
   var res = wsh.Run("cmd /C handle.exe -p "+ProcID+" >"+HandlesFName, 2, true);
   var HandlesFile = fso.OpenTextFile(HandlesFName);
   var text = HandlesFile.ReadAll();
   HandlesFile.Close();
   //fso.DeleteFile(HandlesFName);
   
   var re = new RegExp('\\s*\\S+:\\s+\\S+\\s*(.*)', 'ig');
   var FName = (IBDir+'\\1cv7.lck').toLowerCase();
   while( (matches = re.exec(text)) != null )
   {
       var HandleName = matches[1].toLowerCase();
       HandleName = HandleName.replace(/[\r\n]*/g, '');
       Debug('Need kill?  '+FName+' == '+HandleName);
       if( FName == HandleName ) return true;
   }
   return false;
}

function ProcessCommandLine()
{
   var args = WScript.Arguments;
   if( args.length == 0 )
   {
       Help();
       WScript.Quit();
   }
   
   for( i = 0; i < args.length; i++ )
   {
       if( args(i) == "-d" )
       {
           IBDir = args(++i);
       }
       else if( args(i) == "--domain" )
       {
           DomainName = args(++i);
       }
       else if( args(i) == "--all" )
       {
           Flag_KillAll = true;
       }
       else
       {
           Help();
           WScript.Quit();
       }
   }
   
   if( IBDir.length == 0 && !Flag_KillAll )
   {
       WScript.Echo("Не указан каталог базы данных! (ключ -d <IBDir>)");
       WScript.Quit();
   }
   WScript.Echo("'" + IBDir + "'");
}


function Help()
{
   Help = "Использование:\n\
\tKill1C.js {-d <Каталог базы данных>|--all} [--domain <имя домена>]\n\
Если указан параметр --all, то уничтожаются процессы независимо от базы данных\n\
Если имя домена не указано, то уничтожаются процессы только на текущей машине.\n\
Для работы требуется утилитка handle.exe от sysinternals (http://www.sysinternals.com/)\n\
";

   WScript.Echo(Help);
}

function Debug(msg)
{
   return;
   var f = fso.OpenTextFile("debug", 8, true);
   f.WriteLine(msg);
   f.Close();
}