|
Программа "Убийца нежелательных окон 1С" | ☑ | ||
---|---|---|---|---|
0
Владимир Милькин
28.08.18
✎
10:16
|
Коллеги, я не так давно написал и опубликовал программу "Убийца нежелательных окон 1С".
Адрес проекта на гитхабе: https://github.com/milkin-vl/KillerOfUnwantedWindows1C Суть проблемы, которую она решает: пользователь может, не работая в ФАЙЛОВОЙ базе, заблокировать её так, чтобы стали невозможны тестирование, обновление, архивация и другие операции, требующие монопольного доступа. И что самое важное: такого пользователя никак не выгнать стандартными средствами платформы. Подробнее читайте в описании по ссылке. Судя по отзывам, которые я получил от пользователей, программа со своими задачами справляется. Поэтому решил опубликовать её, ещё и здесь, возможно кто-то найдёт её полезной и для себя тоже. |
|||
1
Лефмихалыч
28.08.18
✎
10:25
|
В целом - зачет. Пиши еще.
Но эти окна - это не единственная и не самая большая беда файловых баз. Файловая база - это геморрой во всех проявлениях. В особенности при конкурентной работе. |
|||
2
Cyberhawk
28.08.18
✎
10:25
|
"пользователь может, не работая в ФАЙЛОВОЙ базе, заблокировать её" // Что имеешь в виду под "работать"?
|
|||
3
Лефмихалыч
28.08.18
✎
10:26
|
(2) классика - пользователь сначала запустил 1С, а потом пошел мусор выносить и больше его не видели.
|
|||
4
Владимир Милькин
28.08.18
✎
10:27
|
(2) да, речь о пользователях, которые застряли на этапе авторизации и/или загрузке базы в том или ином виде.
|
|||
5
Cyberhawk
28.08.18
✎
10:29
|
Хз-хз. Мне под "не работать в инфобазе" сразу на ум приходит отсутствие клиентского сеанса и связанного с ним процесса ОС.
Так если это возникает только при запуске 1С, то почему бы не перефразировать "пользователь может, запуская базу, заблокировать..."? |
|||
6
Cyberhawk
28.08.18
✎
10:30
|
А что за "загрузка базы" в третьем пунктике?
|
|||
7
Владимир Милькин
28.08.18
✎
10:31
|
(5) согласен полностью, внесу изменения в описание проекта
|
|||
8
Владимир Милькин
28.08.18
✎
10:32
|
(6) речь об этом абзаце?
"Пользователь запустил загрузку базы и ушел, не дождавшись её окончания. Но конфигурация не загрузилась, так как появилось окно о том, что конфигурация отличается от конфигурации базы данных. Пока будет висеть эта загрузка, базу монопольно не заблокировать." |
|||
9
Cyberhawk
28.08.18
✎
10:33
|
(7) Также твой сценарий с оставлением базы, убиением сеанса и появлением окошка аутентификации можно выразить фразой не "пользователь может", а "инфобаза может оставаться заблокированной". Пользователь же не совершает каких-то действий, чтобы это произошло - это просходит само собой.
|
|||
10
Вафель
28.08.18
✎
10:34
|
(0) каким образом убийство происходит? от шары отключаются?
|
|||
11
Cyberhawk
28.08.18
✎
10:34
|
(8) Да. При загрузке dt вроде не может возникать сообщений о несоответствии основной конфигурации от конфигурации БД...
|
|||
12
Владимир Милькин
28.08.18
✎
10:35
|
(11) Что-то я не понял, причём тут загрузка dt?
|
|||
13
Cyberhawk
28.08.18
✎
10:35
|
(12) Так Я и спрашиваю в (6)
|
|||
14
Cyberhawk
28.08.18
✎
10:36
|
Видимо речь об открытии инфобазы
|
|||
15
Владимир Милькин
28.08.18
✎
10:36
|
(10) закрывается окно авторизации средствами WinApi или завершается процесс, в зависимости от ситуации.
Речь ведь только о клиентском запуске, нам не нужно рвать другие возможные соединения с базой. |
|||
16
Владимир Милькин
28.08.18
✎
10:36
|
(13) да, конечно, речь об открытии базы :)
|
|||
17
Вафель
28.08.18
✎
10:36
|
(15) те нужно на конечном компе запускать?
|
|||
18
Владимир Милькин
28.08.18
✎
10:37
|
Блин, я даже не думал, что текст (которые я несколько раз выверял) может вызывать столько разночтений.
|
|||
19
Лефмихалыч
28.08.18
✎
10:37
|
(10)
var p = Process.GetProcessById(Id); //... p.Kill(); |
|||
20
Cyberhawk
28.08.18
✎
10:37
|
||||
21
Владимир Милькин
28.08.18
✎
10:38
|
(19) да, но это если только сама загрузка базы (открытие) зависла по тем или иным причинам. Иначе просто программно закрываем окно авторизации 1С.
|
|||
22
Владимир Милькин
28.08.18
✎
10:39
|
Всё верно ставить надо на клиентские компьютеры.
Если же у вас работа в терминальном сервере - то только на него. |
|||
23
Cyberhawk
28.08.18
✎
10:45
|
А если файловая база через веб-сервер раздается, то веб-клиент никогда и никак не может блокировать ее? Или в этом случае Обновлятор просто гасит сам веб-сервер?
|
|||
24
Cyberhawk
28.08.18
✎
10:48
|
Еще получется, что с настройками по умолчанию если пользователь открыл инфобазу, появилось окно авторизации, он 119 секунд ничего в нем не делает, а потом решил-таки ввести пароль, то на 120-135 секунде у него это окошко безусловно закроется? )
|
|||
25
Владимир Милькин
28.08.18
✎
10:49
|
(23) окна 1с, открытые в веб-браузере, не попадают под действие программы
но там описанная проблема не так актуальна, так как между файловой базой и пользователями всегда есть веб-сервер, который мы всегда можем выключить программно по поводу поведения обновлятора: прошу вас задать этот вопрос в его ветке, чтобы не уводить эту ветку в сторону |
|||
26
Владимир Милькин
28.08.18
✎
10:51
|
(24) да, согласно настройкам по умолчанию закроется
|
|||
27
Владимир Милькин
28.08.18
✎
10:53
|
(24) я не определяю активность пользователя в конкретном окне, а определяю общую активность (чтобы перехватить момент, когда пользователь открыл окно авторизации и ушёл)
а в описанном вами случае: программа не увидит разницы между: - пользователь на 120 секунде начал работать в окне - или пользователь продолжил на 120 секунде активничать в другой программе, а окно авторизации по прежнему болтается где-то в фоне (пользователь забыл про него) |
|||
28
Cyberhawk
28.08.18
✎
10:55
|
Но почему бы вместо убивания клиентских процессов ОС просто не обрубрать права на каталог с инфобазой?
|
|||
29
Владимир Милькин
28.08.18
✎
10:59
|
(28) это уже зверства какие-то...))
не каждая программа для администрирования или архивации предусматривает такие возможности а установив "киллер 1с" можно будет вполне положиться на штатные возможности платформы в части выдворения пользователей (после создания блокировки сеансов) |
|||
30
Владимир Милькин
28.08.18
✎
11:01
|
(28) а ещё я не уверен, что Windows (не проверял) даст возможность изменить права к папке и файлам, один из которых открыт монопольно в другой программе
но даже если это можно - имхо не очень корректный способ |
|||
31
Cyberhawk
28.08.18
✎
11:02
|
А что происходит после убиения клиентского процесса? Он перестает удерживать служебный файлик в каталоге инфобазы?
|
|||
32
Владимир Милькин
28.08.18
✎
11:03
|
(31) да, перестаёт
|
|||
33
Cyberhawk
28.08.18
✎
11:03
|
(30) Так получается, что для инфобазы вообще нет разницы, убивается клиентский процесс или у этого процесса (пользователя ОС) просто отбирается право на каталог инфобазы, разве нет?
|
|||
34
Владимир Милькин
28.08.18
✎
11:07
|
(33) вероятно разницы не будет
но надо учитывать, что: - программно отобрать право на каталог базы, а затем (после выполнения операций) вернуть для определенного пользователя, при этом оставив возможность выполнения определенных операций с базой средствами платформы - тут очень много если и много что может пойти не так и требовать доп. условий |
|||
35
Nyoko
28.08.18
✎
12:37
|
(0) на fpc можно было бы и без нетов всяких вражеских реализовать.. кода 5 строчек)))
|
|||
36
Dmitry1c
28.08.18
✎
12:41
|
(0) я думал речь о "всплывающих сообщениях" 1С, обрадовался сначала
напишите кто-нить WinAPI-киллер, мой не работает больше :( |
|||
37
H A D G E H O G s
28.08.18
✎
12:46
|
(0) Весело тут у вас.
|
|||
38
H A D G E H O G s
28.08.18
✎
12:46
|
Но ничего, это до первой убитой базы.
|
|||
39
Владимир Милькин
28.08.18
✎
12:47
|
(35) По поводу 5 строчек для проекта в целом я бы поспорил... :)
А в целом можно рассматривать этот проект как прототип (который я сделал очень быстро на привычном мне .net, я там больше всего времени с msi провозился). И вот если этот прототип выстрелит (и его начнут действительно использовать многие), тогда, конечно, уже будет иметь смысл переписать его хоть на паскале, хоть на c++. В мире такая практика для успешных программ на .net есть. А сейчас переписывать, чтобы только сэкономить немного оперативной памяти... процессорное время мы не сэкономим, так там вся тяжёлая логика - это как раз вызов функций winapi. |
|||
40
APXi
28.08.18
✎
12:47
|
Ндцать лет назад делал такую же только для 77. Там тоже была проблема если висит окно авторизации, то нельзя сохранить файл с пользователями.
|
|||
41
H A D G E H O G s
28.08.18
✎
12:48
|
Автор, я так понимаю, тупо делает terminatethread()/terminateprocess() не заморачиваясь закрытием файлов.
|
|||
42
Владимир Милькин
28.08.18
✎
12:48
|
(38) вы точно описание работы внимательно прочитали? напишите возможный сценарий, при котором вмешательство программы может убить базу.
|
|||
43
APXi
28.08.18
✎
12:48
|
(39) На дельфях напиши, там и размер маленький и библиотеки таскать не нужно.
|
|||
44
Владимир Милькин
28.08.18
✎
12:50
|
(36) Нет, программа решает строго заявленную в описании проблему.
И написана так, чтобы гарантированно не сделать хуже пользователю. |
|||
45
APXi
28.08.18
✎
12:50
|
Насколько помню убивать не обязательно, просто послать окну сообщение типа WM_Close.
|
|||
46
H A D G E H O G s
28.08.18
✎
12:50
|
(42) KillAction=CloseProcess
Если есть открытый файл, данные которого кэшированы и не попали на диск, они и не попадут на него. |
|||
47
Владимир Милькин
28.08.18
✎
12:50
|
(45) и вы тоже не читали описания? :)
|
|||
48
Владимир Милькин
28.08.18
✎
12:51
|
(46) так база закрывается только при зависании на этапе авторизации/загрузки базы, то есть пользователь ещё не зашёл в базу и ничего там сделать заведомо не успел.
|
|||
49
Владимир Милькин
28.08.18
✎
12:54
|
Дельфи я очень люблю и когда-то много писал на нём.
Но имхо для заявленных задач .net здесь вполне вписывается. К тому же я сделал дистрибутивы для второго и для четвёртого. Найти сейчас Windows вообще без какого-либо .net сложно, поэтому доустанавливать ничего не придётся. Но, повторюсь, если программой будут пользоваться, конечно, перепишем на чём нибудь более нативном. |
|||
50
Tonik992
28.08.18
✎
12:54
|
(0) Долго делал?
|
|||
51
Владимир Милькин
28.08.18
✎
13:01
|
(50) на саму программу я потратил максимум пару дней, там кода совсем немного
сложнее всего было придумать логику работы, чтобы не навредить взаимодействию пользователей с окном авторизации; мне кажется, что это сделать удалось а затем я ещё 2 дня копался с msi - вот, что оказалось самым сложным в этом проекте, так как раньше я с созданием такого типа установщика не работал ну и в целом это мой первый опыт публикации программы под свободной лицензией на гитхабе, поэтому ещё время ушло на вникание в нюансы и оформительство |
|||
52
H A D G E H O G s
28.08.18
✎
13:05
|
(48) Понятно. Вот сейчас глянул, до окна авторизации в базу действительно ничего не пишется, скорее всего базу не уронить.
Пишется в ЖР и в словарь полнотекстового поиска, если уроните, то только их. |
|||
53
H A D G E H O G s
28.08.18
✎
13:06
|
DuplicateHandle() c DUPLICATE_CLOSE_SOURCE
flushfilebuffers() CloseHandle() и CreateRemoteThread() вам в помощь, но это долго и муторно. |
|||
54
Владимир Милькин
28.08.18
✎
13:09
|
(52) спасибо за пояснения
по идее программа не делает ничего такого, чего бы не сделал админ, обнаруживший, что у пользователя: - висит окно авторизации в базу (он бы просто закрыл это окно, то же делает и программа) - более 10 минут висит загрузка базы (он бы просто снял процесс из диспетчера задач, то же делает и программа) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |