Изучаем механизм блокировки рабочего стола в операционной системе Windows




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

57 Comments

  1. Olga_siberia

    Выложить файл целая проблема, потратила на это около часа, потом оказалось,что выложила сразу АЖ четыре раза!!!!

    Reply
  2. Altair777

    (1) > потом оказалось,что выложила сразу АЖ четыре раза!!!!

    Лучше сорок раз по разу, чем ни разу сорок раз 🙂

    Reply
  3. coder1cv8

    А я такое в 1С делал… )

    Reply
  4. Olga_siberia

    (3) Поздравляю!!!Как умудрился из 1с глобальный перехват мыши и клавы устроить???Я так понимаю,что из 1с только с помощью COM технологий можно обращаться к API.

    Reply
  5. AmoreMe

    (4) Да это так. Причем ActiveX и еже с ним сильно отдает всё той же COM (по факту им же и является). А вот что глобальный хук надо ставить именно в .dll это абсолютно верно! Через COM делать перехват можно с учетом выше сказанного, но это не лучшее решение.

    Reply
  6. Abadonna

    (3-5) Не паримся, а смотрим http://infostart.ru/projects/697/

    Моя есть давно написаль 😉

    Reply
  7. AmoreMe

    Посмотрел и что? Разве там идет речь о перехвате сообщений в любых приложениях? Реализовывать через COM изврат… Если только в этом нет сугубой необходимости.

    Reply
  8. coder1cv8

    (4,5,6) Никаких API, COM, ActiveX и длл!!! Просто ловкость рук и никакого мошенничества! )) http://infostart.ru/projects/2591/

    Reply
  9. Abadonna

    (8) Ну, учитывая, что dll — она и в Африке dll, там можно было и не указывать конкретый процесс, был бы глобальный. А в простой dll (без ком-извратов) это реализовано в http://infostart.ru/projects/798/

    Reply
  10. Abadonna

    +(9) Не на (8), а на (7) — опечатался

    Reply
  11. AmoreMe

    Что то не понял (8) а каких процессах речь идет? Можно конечно инжект DLL сделать и в системный процесс, методов много, а потом экспортировать нужные функции, но как это относится к обсуждаемой теме глобальные хуки на события мыши и клавиатуры?

    Reply
  12. AmoreMe

    Я тоже промахнулся конечно же не 8 а 9.

    Reply
  13. Abadonna

    А чего обсуждать тему глобальной ловушки? Достаточно просто прочитать:

    function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK;

    Функция SetWindowsHookEx устанавливает определенную приложением процедуру ловушки в цепочку ловушек.

    Приложение устанавливает процедуру ловушки, чтобы контролировать некоторые типы событий в системе.

    Процедура ловушки может контролировать события, связанные со специфической нитью или со всеми нитями в системе.

    Параметры:

    idHook: Определяет тип процедуры ловушки, которая будет установлена. Этот параметр может иметь одно из значений WH_.

    lpfn: Указывает на процедуру ловушки. Если dwThreadId параметр, равен нулю или определяет идентификатор нити, созданного другим процессом,

    параметр lpfn должен указать на процедуру ловушки в библиотеке динамических связей (DLL).

    Иначе, lpfn может указывать на процедуру ловушки в коде, связанном с текущим процессом.

    hMod: Идентифицирует DLL, содержащую процедуру ловушки, на которую указывает параметр lpfn.

    Параметр hMod должен быть установлен как NULL, если параметр dwThreadId определяет нить, созданную текущим процессом и если процедура ловушки — внутри кода, связанного с текущим процессом.

    dwThreadId: Определяет идентификатор нити, с которым процедура ловушки должна быть связана.

    Если этот параметр — нуль, то процедура ловушки связана со всеми существующими нитями.

    Reply
  14. AmoreMe

    Это зачем столько текста? Ведь и так всё очевидно. Вопрос был о каких процессах идет речь?

    Reply
  15. Abadonna

    (14) В (9) как раз и был простой ответ: там хук ставится конкретно на процесс 1С, вызваший библиотеку, НО, если бы я там не проставил конкретный dwThreadId — она бы за милую душу ловила ВСЕ процессы

    Reply
  16. AmoreMe

    Dll проецируется на адресное пространство процесса который её загружает (в общем случае) и далее её код исполняется так как родной код этого процесса… (в частности)

    Reply
  17. Abadonna

    +(15) Есть такая фича, недокументировано — из конкретного приложения запросто ставится ГЛОБАЛЬНЫЙ хук без всяких DLL

    Reply
  18. AmoreMe

    Ещё раз позволю себе повториться, что ловить надо не процессы, а события мыши и клавы в данном конкретном случае… Увы!

    Reply
  19. AmoreMe

    (17)Да я и не отрицал этого что можно это делать (На машине можно задним ходом пердвигаться но лучше нормально как все)!

    Reply
  20. AmoreMe

    А вообще приятно, что на этом сайте можно не только на темы 1С поговорить!?

    Reply
  21. Abadonna

    (18) Под «она бы за милую душу ловила ВСЕ процессы», ясно дело, подразумевалось «ловила бы сообщения (события) всех процессов»

    Reply
  22. AmoreMe

    (21) Спасибо за беседу вынужден откланяться! Удачи!

    Reply
  23. Душелов

    А в чем спор?

    Reply
  24. Mytilus G.

    Где тут «изобретаем велосипед», я понял. А где «модернизируем его»? Если под модернизацией понимается Space Buddha, которую, как я предполагаю, все с пеной изо рта бросились выковыривать из таблицы образа, то заголовок должен звучать: «Изобретаем велосипед и засоряем его ресурсы».

    Не хочу показаться невежливым, но, по моему скромному мнению, так оно и есть. И я готов, при желании Оли, выслушать ее гневные отзывы о моем посте на тему неуважения труда и стремления к воплощению идей.

    Reply
  25. Abadonna

    (25)Не, все правильно! Надо было только Deep Purple Into The Fire 🙂

    Reply
  26. AmoreMe

    (24) А чего засоряем то? Ресурсы для того и нужны чтоб в них хранить картинки файлы и прочее… Что не знал? Сарказм твой не уместен! А не вежлив, так это пробелы твоего воспитания…

    Reply
  27. Abadonna

    (26,24) Ну, собственно, такая реакция была ж заранее спрогнозирована 😉

    «В ресурсах она целиком не смотря на то, что проигрывается всего 30 сек. Так что кто хочет, вооружайтесь лопатой т.е. «ресурс-билдером» и копайте…»

    Reply
  28. AmoreMe

    Я слышал Оля доработала прогу… Теперь она будет отрубать комп в случае длительного простоя! Но это ведь учебная прога хотя и полнофункциональная…

    Оля, прошу прощения что «Поперёк батьки в пекло»…

    Reply
  29. AmoreMe

    А вот анонс надо исправить —-> «операционной систью изучения работы внутренних механизмов»<——

    Reply
  30. AmoreMe

    Кстати + к посту (28) Это в условиях кризиса может быть очень актуально. Экономим электроэнергию. Нет юзера на месте больше часа — вырубаем. А если в конторе 300 компов и 150 из них без дела электроэнергию потребляют? Хотя сам я комп стараюсь вообще поменьше перезагружать.

    Reply
  31. Mytilus G.

    (26, 28, 30) Похоже, здесь какое-то недопонимание. Картинки, файлы и прочее надо хранить в папках «Мои рисунки», «Мои документы» и тому подобное, но не в ресурсах. Ресурсы предназначены все-таки для других целей. Так что не стоило переходить на личности, пытаясь задеть меня своим проявлением злобы в ответ на критику, так как про мое воспитание тебе все равно ничего не известно (оффтоп). А насчет отрубания компа в конторе — так это уже давно реализовано стандартными инструментами серверных систем. Честь имею!

    Reply
  32. AmoreMe

    (31) Критика не конструктивная! Хотя если бы я подозревал, что господин Mytilus G. не имеет отношения к программированию под Windows то может быть и смягчил тон… Теперь насчёт «проявления злобы». Ты оказался невежлив, хотя сам и предполагал, что это так?! Так чего хочешь получить в ответ? Сила противодействия равна силе прямого действия… Если ты не имеешь понятия о структуре файла РЕ формата, так зачем высказываться по этому поводу? В многих случаях хранить звук и видео именно в ресурсах .exe файла намного предпочтительней чем в той же .dll в тех же ресурсах или просто раскидав их по папкам.

    Reply
  33. AmoreMe

    Ну поверь мне Mytilus G. Я не хочу задеть твое самолюбие… И уж тем более выделиться за твой счет! Поэтому обещаю, впредь все ляпсусы всех авторов буду комментировать только с явным позитивом, не взирая на чины и ранги! А так же знания и опыт… Удачи!

    Reply
  34. Olga_siberia

    Всем спасибо за комменты, мне важно каждое мнение, программа доработана скоро будет выложена,AmoreMe и Abadonne, отдельное….

    Reply
  35. Olga_siberia

    (28)>Оля, прошу прощения что «Поперёк батьки в пекло»..

    Не за что дорогой,развлекайся!!!!!!!

    Reply
  36. Olga_siberia

    (31) для тебя дорогой!!!!

    Графика которая отображается в программе отрисована API.

    А в ресурсах лежит только звуковой файл,что соответствует всем канонам программирования под Windows.

    Reply
  37. Olga_siberia

    (29) Исправила!

    Reply
  38. Mytilus G.

    Стоп! Я ни в коем случае не отрицаю, что графику, звук для приложения, таблицу строк в конце концов, конечно, логично воткнуть в ресурсы. Безусловно, если они там нужны. Если реагирующие на мой пост адекванто подошли бы к выраженному мной мнению, а не выискивали в критике оскорбления, то обязательно заметили бы, что я говорил совершенно не об этом. Запихните в ресурсы хоть Ленинскую библиотеку, чтобы отображать в приложении по одному абзацу из каждой книги — мне все равно. Пусть это будет каноном программирования.

    Неконструктивная критика — это высказывание, умаляющее некую часть объекта этой критики. Основной частью моего первого поста был вопрос. Специально для тех, кто не задумывается о том, отчего возникает неудовлетворяющее их мнение в комментарии и переходят на личности, я поставил этот вопрос в самом начале. Однако и это не помогло — ответа я так и не получил.

    Теперь насчет моих невежливости и воспитания. Я искренне, без какого-либо сарказма и иронии, приношу Ольге свои извинения за необдумано резкую формулировку и прошу у нее прощения за акцентирование исключительно субъективного мнения. Надеюсь, что это поможет отвлечь уважаемую публику от обсуждения личных качеств отдельно взятого Mytilus G.

    P.S.

    Блокировка клавиатуры: rundll32 keyboard,disable

    Блокировка мыши: rundll32 mouse,disable

    Запуск по времени простоя можно организовать в «Назначенные задания» панели управления Windows.

    Reply
  39. Mytilus G.

    P.P.S.

    Заработался я. Команды выше в NT не работают. Для 2000/XP/Vista указываем rundll32.exe user32.dll,LockWorkStation

    Reply
  40. Abadonna

    (39) Точно заработался

    hDLL := LoadLibrary(‘user32.dll’);

    @myBlockInput := GetProcAddress(hDLL, ‘BlockInput’);

    myBlockInput(true);

    и всех дел

    Reply
  41. Olga_siberia

    (38) извинения приняты.

    А вообще смысл программы не в том, что бы просто залочить станцию, а в том что бы «отследить» работу пользователя за компьютером,смысл вами не понят до конца.

    Reply
  42. Olga_siberia

    (39)А вообще,что бы залочить станцию как предлагаете вы достаточно нажать пару клавиш WIN+L

    Reply
  43. Mytilus G.

    (40) Мне мой вариант больше нравится. Его компилить не надо.

    Reply
  44. Abadonna

    (43) Вариант «не компилить» изложен в (42), а есть еще три пальца 😉

    Reply
  45. Olga_siberia

    Кстати,добавлено отключение компьютера при длительном простое от одного часа до десяти часов.

    Reply
  46. Mytilus G.

    (44) Здесь говорилось об автоматизации. Три пальца в Назначенные задания не засунешь. ))

    Reply
  47. AmoreMe

    (46) Если об автоматизации говорить, то как реализовать это через стандартный sheduler? Даже самая простая операция выключение компьютера не гарантирована… Допустим (сегодня 01.01.2009 12:00:00) пользователь настроил отключение на 01.01.2009 24:00:00 и забыл об этом! Понадобилось ему дату передвинуть назад ну чтоб поправить что-то в программе которая проверяет системное время, он выставил 30.11.2008 12:00:00! И что будет? Будем месяц ждать автоматизации? Значит к системной дате привязываться в случае автоматизации нельзя… Я хочу быть уверенным, что все произойдет через такое время как я запрограммировал! А как отследить что мы все еще на рабочем месте, трудимся? А вот написать приложение которое не только 3 но и все 33 пальца засунет куда угодно, без проблем… Делаем вывод — Назначенные задания применяем там где не особо критично будет ли оно вообще выполнено, например запустим антивирусный сканер ночью. Много нелестных отзывов от системных администраторов приходилось мне слышать о назначенных заданиях в Windows! Кстати вариант с синхронизацией времени на сервере не предлагать. Проходили уже! Да и речь идет о конкретной машине,конкретного пользователя…

    Reply
  48. Mytilus G.

    (47) Шедулер, бесспорно, не панацея. Но я сам системный администратор и по себе знаю, что настроить его на бесперебойную работу легче и быстрее, нежели искать необходимое ПО, знакомиться с его возможностями и разбираться в настройках или создавать собственную реализацию. Чтобы не было недоразумений, сразу поясню, что отталкиваюсь исключительно из собственного опыта, а кому-то может быть проще и легче работать именно с приложениями. Теперь насчет примера отключения компа. Ту же самую ошибку (что-то изменил, что-то забыл) можно сотворить и с программным обеспечением, завершающим работу Виндов. У меня в офисе компьютеры отключаются заданием, выполняя команду «shutdown -f -s t 0» каждый день в 22:00, но не раньше 30 минут простоя.

    Reply
  49. AmoreMe

    (48) А как определяется простой? С командной то строкой и так ясно…

    Reply
  50. Mytilus G.

    (49) Непосредственно в задании. Там есть опции запуска по простою.

    Reply
  51. AmoreMe

    Да уж… В хрюше? Таки нет…

    Reply
  52. AmoreMe

    Нашел и в хрюше…

    Reply
  53. AmoreMe

    Ну какие выводы? Как и ожидалось плевать хотел планировщик на эту опцию! спецом всё настроил и мышкой «ерзал» старательно, всё равно сработал. Сразу опять всех админов вспомнил что плюются от планировщика Windows…

    Reply
  54. AmoreMe

    А на работе у нас после 5 срабатываний перестала база выгружаться… А самопальный работает! Какие ещё примеры то нужны?

    Reply
  55. Olga_siberia

    Разработка выполнена с целью изучения работы внутренних механизмов Windows. Это и в заголовке написано. Тут копья особенно ломать то нечего. Изучила, воплотила, ну и молодец Я!

    (48)»Ту же самую ошибку (что-то изменил, что-то забыл) можно сотворить и с программным обеспечением» — нельзя, в моей программе сработает любая настройка! В отличие от планировщика. Ещё раз убедилась, что не особенно то ты и смотрел её… А в этой ветке идет речь именно о ней!

    Reply
  56. CheBurator

    я просто с вас офигеваю…

    Reply
  57. Olga_siberia

    (56)Как это понимать??

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *