Имя: Пароль:
1C
1C 7.7
v7: Получить список запущенных 1С...
0 Злопчинский
 
01.11.11
02:59
ноччу на сервере выполняются регламентные работы... - бэкапы и прочее, в т.ч. и пакетный конфигуратор на принудительную реиндексацию.
.
что хочется: получить список пользователей с запущенными 1Сками...
если среди пользователей с запущенными 1Сками есть "Такой-топользователь" - регламент не запускаем; если "Такойто" пользователь в списке отсутсвует то принудительно закилять все открытые 1Ски на сервере и выдать команду на запуск 1ски в пакетном режиме...
.
т.е. если я ночью работаю на серваке с 1Ской - задание не выполняем, если меня нет - киляем незакрытые и выполняем.. потому как некоторые юзвери просто уходят не выключив...
.
спсб!
1 skunk
 
01.11.11
03:34
список пользователей 1С или винды ... списко одной базы или именно запущенных на сервере
2 Злопчинский
 
01.11.11
03:43
(1)

а) ну так как у меня работают в терминале - то программа-минимум - зарубить именно запущенных на сервере...
.
б) если конечно удастся зарубить процессы только для конкретной базы - это еще лучше.. но я слабо представляю.. хотя наверное можно что-то вытащить из свойств процесса..
.
в) еще лучше если учтется то, что база с сервера может быть запущена локально - тогда надо освободить базу для выполнения регламента...
.
по крайней мере - хотя бы пункт А) ;-)
3 DJ Anthon
 
01.11.11
04:05
куча выгонялок уже есть. можно и свою написать. в обработку ожидания кидаем проверку на наличие файла-флага и выбрасываем с таймаутом
4 Злопчинский
 
01.11.11
04:08
(3) не нравится мне такое...
5 smaharbA
 
01.11.11
06:08
openfiles
6 smaharbA
 
01.11.11
06:09
сперва выставив глобальный флаг (но несколько снизит быстродействие системы)
7 smaharbA
 
01.11.11
06:16
gflags -r +otl
gflags -k +otl

из сапорт тулуз

а так - напиши монитор пользователей адинес, проверять лок по смещению 2000000 + номер пользователя в syslog\links.tmp
8 smaharbA
 
01.11.11
06:18
примерно так

Перем GENERIC_EXECUTE,
   GENERIC_READ,
   GENERIC_WRITE,
   OPEN_EXISTING,
   FILE_SHARE_READ,
   FILE_SHARE_WRITE,
   FILE_FLAG_RANDOM_ACCESS,
   FILE_ATTRIBUTE_NORMAL;

Функция ЗагрузитьКомпоренту()
   Попытка
       Возв=1;
       Враппер=СоздатьОбъект("DynamicWrapper");
   Исключение
       Возв=0;
   КонецПопытки;
   Возврат Возв;
КонецФункции    // ЗагрузитьВК

Функция АПИФункцииИКонстанты()
   GENERIC_EXECUTE = 536870912;
   GENERIC_READ = -2147483648;
   GENERIC_WRITE = 1073741824;
   OPEN_EXISTING = 3;
   FILE_SHARE_READ = 1;
   FILE_SHARE_WRITE = 2;
   FILE_FLAG_RANDOM_ACCESS =268435456;
   FILE_ATTRIBUTE_NORMAL = 0;
   Враппер.Register("kernel32.dll","CreateFileA","i=sllllll","f=s","r=l");
   Враппер.Register("kernel32.dll","LockFile","i=lllll","f=s","r=l");
   Враппер.Register("kernel32.dll","UnlockFile","i=lllll","f=s","r=l");
   Враппер.Register("kernel32.dll","CloseHandle","i=l","f=s","r=l");
КонецФункции    // АПИФункцииИКонстанты

Функция РазборПользователя(Знач Стр)
   Перем Сп,ТЗ,СтрТмп;
   Сп=СоздатьОбъект("СписокЗначений");
   Стр=СтрЗаменить(Стр,"" "","");
   Стр=СтрЗаменить(Стр,"{{","");
   Стр=СтрЗаменить(Стр,"}}","");
   Стр=СтрЗаменить(Стр,"},{","" "");
   СтрТмп="";
   Для Сч=1 По СтрКоличествоСтрок(Стр) Цикл
       СтрТмп=СтрПолучитьСтроку(Стр,Сч);
       СтрТмп=СтрЗаменить(СтрТмп,""",""","" "");
       СтрТмп=СтрЗаменить(СтрТмп,"""","");
       Сп.ДобавитьЗначение(СтрПолучитьСтроку(СтрТмп,2));
   КонецЦикла;
   Если Сп.РазмерСписка()=0 Тогда
       Возврат 0;
   КонецЕсли;
   ТЗ=СоздатьОбъект("ТаблицаЗначений");
   ТЗ.НоваяКолонка("Имя");
   ТЗ.НоваяКолонка("Система");
   ТЗ.НоваяКолонка("Режим");
   ТЗ.НоваяКолонка("Дата");
   ТЗ.НоваяКолонка("Время");
   ТЗ.НоваяКолонка("Компьютер");
   ТЗ.НоваяСтрока();
   ТЗ.Имя = СокрЛП(Сп.ПолучитьЗначение(1));
   Если Сп.ПолучитьЗначение(2)="C" Тогда
       ТЗ.Система = "Конфигуратор";
   ИначеЕсли Сп.ПолучитьЗначение(2)="E" Тогда
       ТЗ.Система = "Предприятие";
   ИначеЕсли Сп.ПолучитьЗначение(2)="M" Тогда
       ТЗ.Система = "Монитор";
   ИначеЕсли Сп.ПолучитьЗначение(2)="D" Тогда
       ТЗ.Система = "Отладчик";
   КонецЕсли;
   Если Сп.ПолучитьЗначение(3)="N" Тогда
       ТЗ.Режим = "Раздельный";
   ИначеЕсли Сп.ПолучитьЗначение(3)="Y" Тогда
       ТЗ.Режим = "Монопольный";
   КонецЕсли;
   ТЗ.Дата = СокрЛП(СтрПолучитьСтроку(СтрЗаменить(Сп.ПолучитьЗначение(4),",","" ""),1));
   ТЗ.Время = СокрЛП(СтрПолучитьСтроку(СтрЗаменить(Сп.ПолучитьЗначение(4),",","" ""),2));
   ТЗ.Компьютер = СокрЛП(Сп.ПолучитьЗначение(5));
   Возврат ТЗ;
КонецФункции    // РазборФайлаНачало

Функция АктивныеПользователи(База)
   Перем Текст,Сп,СтрТмп,ФСО,Символ, Хендл,Файл,Пусто;
   Перем Ширина[6],Стр,Кол;
   ТЗ=СоздатьОбъект("ТаблицаЗначений");
   ТЗ.НоваяКолонка("Имя");
   ТЗ.НоваяКолонка("Система");
   ТЗ.НоваяКолонка("Режим");
   ТЗ.НоваяКолонка("Дата");
   ТЗ.НоваяКолонка("Время");
   ТЗ.НоваяКолонка("Компьютер");
   ФСО=СоздатьОбъект("Scripting.FileSystemObject");
   Файл=База+"syslog\links.tmp";
   Текст=ФСО.OpenTextFile(Файл,1,-1);
   СтрТмп="";
   Пока Текст.AtEndOfStream=0 Цикл
       Символ=Текст.Read(1);
       Если КодСимв(Символ)=0 Тогда
           Символ=" ";
       КонецЕсли;
       СтрТмп=СтрТмп+Символ;
       Если СтрДлина(СтрТмп)>1023 Тогда
           ТЗ.Заполнить(РазборПользователя(Лев(СтрТмп,1024)),ТЗ.НоваяСтрока());
           СтрТмп=Сред(СтрТмп,1025);
       КонецЕсли;
   КонецЦикла;
   Текст.Close();
   АПИФункцииИКонстанты();
   Хендл=Враппер.CreateFileA(Файл,GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, Пусто, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS + FILE_ATTRIBUTE_NORMAL, 0);
   Для Сч=-ТЗ.КоличествоСтрок() По -1 Цикл
       Рез=Враппер.LockFile(Хендл, 2000000 - Сч, 0, 1, 0);
       Рез=Макс(Рез,-Рез);
       Враппер.UnlockFile(Хендл, 2000000 - Сч, 0, 1, 0);
       Если Рез=1 Тогда
           ТЗ.УдалитьСтроку(-Сч);
       КонецЕсли;
   КонецЦикла;
   ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку() = 1 Цикл
       Для Сч=1 По ТЗ.КоличествоКолонок() Цикл
           Ширина[Сч]=Макс(СтрДлина(ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,Сч)),Ширина[Сч]);
       КонецЦикла;
   КонецЦикла;
   Для Сч=1 По ТЗ.КоличествоКолонок() Цикл
       ТЗ.УстановитьПараметрыКолонки(Сч,,,,,Ширина[Сч]);
   КонецЦикла;
   ТЗ.Выгрузить(ТЗФорма);
   Враппер.CloseHandle(Хендл);
КонецФункции    // АктивныеПользователи
9 andrewks
 
01.11.11
08:09
зачётно
10 filh
 
01.11.11
08:15
крута!
11 Ranger_83
 
01.11.11
08:26
как у вас все запущенно :)
12 Vovchai
 
01.11.11
08:53
например

strComputer = "".""

Set objWMIService = GetObject(""winmgmts:"" _
   & ""{impersonationLevel=impersonate}!\\"" & strComputer & ""\root\cimv2"")
Set colProcessList = objWMIService.ExecQuery _
   (""SELECT * FROM Win32_Process WHERE Name = '1cv8.exe'"")
For Each objProcess in colProcessList
   'бла бла бла. перечисление запущеных процессов 1cv8.exe
   objProcess.Terminate() 'так например убиваем процессы
Next
13 ДенисЧ
 
01.11.11
08:58
Хм, и работает же...
14 Злопчинский
 
01.11.11
15:28
(8) такая шняга с твоей подачи у меня уже давно крутится..
Речь о том, что прибить надо 1С извне, со стороны оси...
15 Злопчинский
 
01.11.11
15:29
(12) попробуем...
2 + 2 = 3.9999999999999999999999999999999...