禁止
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 230
1

Как запустить программу при попытке открыть один из локальных дисков

13.01.2015, 12:04. Показов 1488. Ответов 12
Метки нет (Все метки)

Мой друг работает в школе. Там имеется компьютер на котором есть программа для записи видеонаблюдения. Компьютером могут пользоваться школьники. И они портят эту программу удаляя из нее файлы. Сам компьютер должен оставаться таким чтоб им могли пользоваться школьники.
Задача: Когда школьники пытаются открыть например локальный диск D, то запускается программа делфи.
Все остальное, автозагрузка, ввод пароля сделать могу. Не сильно задумывайтесь о том как они смогут обойти эту защиту. Это почти BitLocker. Попытка открыть диск d обращается запуском программой делфи. Помомогите надо сделать это как можно раньше.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2015, 12:04
Ответы с готовыми решениями:

При объединении разделов пропал один из локальных дисков
Всем доброго времени суток. Беда такая. Что-то меня переклинило и я решил объединить два...

Один из локальных дисков не открывается
Случилось такое дело. У меня на ноутбуке 3 локальных диска. Один локальный диск, долго не открывал,...

Ошибка при попытке запустить программу
Доброго времени суток, друзья. Дело в том, что я пытаюсь самостоятельно освоить руби, но при...

При попытке открыть Калькулятор пишет: не удаётся открыть приложение так как отключен контроль учётных запиcей
При попытке открыть Калькулятор пишет,что не удаётся открыть приложение так как отключен контроль...

12
668 / 558 / 242
Регистрация: 26.11.2012
Сообщений: 2,190
13.01.2015, 12:36 2
Проще эту проблему решить администрированием, чем писать непонятно что....
Свойство - Безопасность - Группы или пользователи
0
禁止
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 230
13.01.2015, 14:24  [ТС] 3
я понимаю но нужно именно сделать это программно на делфи
0
252 / 138 / 45
Регистрация: 19.03.2012
Сообщений: 314
Записей в блоге: 2
13.01.2015, 19:39 4
А не легче просто скрыть локальные (системные диски) из проводника (в т.ч. из моего компьютера) и запретить доступ к ним? (делаеться это через политику безопастности в административных шаблонах). Или не выход?
0
Житель Земли
2993 / 2985 / 391
Регистрация: 26.07.2011
Сообщений: 11,452
Записей в блоге: 1
13.01.2015, 19:47 5

Не по теме:

Выпороть школьников и включить BitLocker :)



Добавлено через 32 секунды
почему
Цитата Сообщение от FromOutSide Посмотреть сообщение
нужно именно сделать это программно на делфи
???
0
252 / 138 / 45
Регистрация: 19.03.2012
Сообщений: 314
Записей в блоге: 2
13.01.2015, 20:37 6
А вообще если так уж надо именно на делфи, то нужно ставить Hook'и перехвата системных событий (обращения к файловой системе по адресу твоего локального диска D). Копать в сторону Shell API, что-то типа IShellBrowser, IShellFolder, IShellExtInit, IPersistFolder, ...

Ну или в делфи есть пример, где описано, как перехватить операции с папками - копиров, удаление, переимен и т д. Есть также возможность отменить действие, которое хочет сделать пользователь. путь к примеру для 7 - \Program Files\Borland\Delphi7\Demos\ActiveX\ShellExt\copyh ook.dpr, 3 - \Program Files\Borland\Delphi 3\Demos\SHELLEXT\copyhook.dpr. там есть ещё парочка интересных примеров.

Добавлено через 26 минут
Вот тут - Как отследить открытие папки, задавали уже подобный вопрос и решение нашли уже вот такое в том, что бы просто отслеживать состояние сожерживого твоего каталога (папки) ну или как тебе надо диска D с его файлами, что бы при их изменении вызывалось событие в твоей программе на Delphi (представленный код думаю уже под себя переделать сможешь?, описание используемых системных функций я приведу после кода, и не забудь что нужно создавать потоки для того что бы твоя программа не "висела").

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// main form unit - Button1 starts the thread and button2 stops it:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
uses unit2;
 
var
  SpyThread: TSpyThread;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  SpyThread := TSpyThread.Create(true);
  SpyThread.FreeOnTerminate := true;
  SpyThread.Resume;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  SpyThread.Terminate;
end;
 
end.
 
// the thread unit
unit Unit2;
 
interface
 
uses windows, classes, sysutils;
 
type
 
  TSpyThread = class(TThread)
    procedure Execute; override;
    procedure Oops;
  private
    c: integer;
  end;
 
implementation
 
uses unit1;
 
procedure TSpyThread.Oops;
begin
  Form1.Label1.Caption := 'Change occured '+IntToStr(c);
end;
 
procedure TSpyThread.Execute;
var
  h: THandle;
  dwWaitStatus: DWORD;
begin
  c := 0;
  // set a notification
  h := FindFirstChangeNotification('c:\test', // directory to watch
     false,                                 // do not watch the subtree
     FILE_NOTIFY_CHANGE_FILE_NAME);         // watch file name changes including new and deleted files
 
  if h = INVALID_HANDLE_VALUE then exit;      // exit if the returned handle is invalid
 
  try
    while (not terminated) do begin
      dwWaitStatus := WaitForSingleObject(h, 1000);
 
      if dwWaitStatus = WAIT_OBJECT_0 then begin // the object is signaled
        // do something here
        inc(c);
        Synchronize(Oops);
 
        // restart waiting
        if FindNextChangeNotification(h) = false then break; // exit loop on error
      end;
    end;
  finally
    FindCloseChangeNotification(h); // close the handle
  end;
end;
 
end.

FindFirstChangeNotification
FindNextChangeNotification
FindCloseChangeNotification
WaitForSingleObject

HANDLE FindFirstChangeNotification
Создает сигнализирующий объект find change notification object для сканирования каталога.

Параметры:

LPCTSTR lpPathName, - Указатель на строку, которая содержит путь к проверяемому каталогу.
BOOL bWatchSubtree, - Флаг, указывающий, нужно ли проверять подкаталоги.
DWORD dwNotifyFilter - О каких изменениях в каталоге сигнализировать.

dwNotifyFilter
Определяет, о каких типах изменений будет сигнализировать объект
Возможные значения:

FILE_NOTIFY_CHANGE_FILE_NAME
Сигнализировать о создании, удалении и переименовании файла.
FILE_NOTIFY_CHANGE_DIR_NAME
Сигнализировать о создании, удалении, переименовании подкаталогов.
FILE_NOTIFY_CHANGE_ATTRIBUTES
Сигнализировать об изменении атрибутов файлов или подкаталогов.
FILE_NOTIFY_CHANGE_SIZE
Сигнализировать об изменении размеров файлов. Операционная система определяет, что размер файла изменился, только если он закрыт.
FILE_NOTIFY_CHANGE_LAST_WRITE
Сигнализировать о смене даты последнего изменения файла. Операционная система определяет, что дата изменения файла сменилась, только если он закрыт.
FILE_NOTIFY_CHANGE_SECURITY
Сигнализировать об изменениях дескриптора защиты.

В случае успешного выполнения функция возвращает Handle созданного сигнализирующего объекта.

BOOL FindNextChangeNotification
Функция запрашивает операционную систему, изменилось ли состояние сигнализирующего объекта.

Параметры:
HANDLE hChangeHandle // Handle сигнализирующего объекта

BOOL FindCloseChangeNotification
Удаляет сигнализирующий объект.

DWORD WaitForSingleObject
Функция завершается в том случае, если при проверке состояния сигнализирующего объекта происходит одно из событий:
· Состояние объекта изменилось на «Включен»
· Время ожидания, определенного при вызове функции, истекло.

Параметры:
HANDLE hHandle, // Handle сигнализирующего объекта
DWORD dwMilliseconds // Время ожидания в миллисекундах

dwMilliseconds
Может принимать следующие значения:
- время ожидания в миллисекундах
- INFINITE, в этом случае время ожидания не ограничено.

Функция WaitForSingleObject возвращает следующие значения:
WAIT_OBJECT_0 – Состояние объекта изменилось на «Включен»
WAIT_TIMEOUT - Истекло время ожидания.
Если при выполнении функции возникли ошибки, WaitForSingleObject возвращает код WAIT_FAILED. Если состояние объекта изменяется до истечения времени dwMilliseconds, то функция завершает работу немедленно с кодом WAIT_OBJECT_0.

-------------
Примечание: При возникновении ошибки во время выполнения этих функций
код ошибки можно получить, вызвав функцию GetLastError.
-------------
1
禁止
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 230
14.01.2015, 05:50  [ТС] 7
Andretti, спасибо! чуть попозже отпишусь.

Добавлено через 8 минут
Andretti, под себя не знаю смогу или нет но постараюсь, а вот смотри на счет потока, потом я создам, там с любым латинским названием, потом его название надо заюзать в проекте, ну а как применить то его чтоб он много не тяпал, даже мало совсем мало нагрузки давал но при этом чтоб он работал? и нужно ли применять библиотеки, если да то как? просто с подобным я ранее работал, поэтому и не внемлю.

Добавлено через 11 минут
А уже вижу, в этом коде есть уже поток.

Добавлено через 8 минут
Странно. но почему то не могу сделать так чтоб этот код работал, а так программа запускается.
0
252 / 138 / 45
Регистрация: 19.03.2012
Сообщений: 314
Записей в блоге: 2
14.01.2015, 20:21 8
Цитата Сообщение от FromOutSide Посмотреть сообщение
Странно. но почему то не могу сделать так чтоб этот код работал, а так программа запускается.
ты не забывай что она отслеживает действия с файлами в папке (я про код который я привел без использования других подобных функций которые есть ниже с описанием), например удаление, создание, переименование любых файлов содержащихся в этой папке (которую мы отслеживаем в данном примере) вызовет увеличение на единицу (+1 = одно действие) значения выводимого на форму в Form1.Label1.Caption := 'Change occured '+IntToStr(c);
1
northener
15.01.2015, 02:32
  #9

Не по теме:

Цитата Сообщение от FromOutSide Посмотреть сообщение
Мой друг работает в школе.
Обычно в таких случаях говорят "моя подруга". Тогда число желающих помочь как правило больше.
Ну почему честно не сказать, что это моя учебная или почти учебная задача?

0
禁止
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 230
15.01.2015, 10:50  [ТС] 10
northener, как бы тоже не по теме скажу но ваше дело верить или не верить, я сказал так как есть и то сократил чтоб не писать слишком много, и я студент. ну а так учту что все врут чтоб им помогли.

Добавлено через 2 минуты
Andretti, я уже применял коды, и потом уже создавал, переименовывал, удалял, но как был label под своим именем так и остался. скорей всего код верный, и я просто не могу додуматься что не то.
0
252 / 138 / 45
Регистрация: 19.03.2012
Сообщений: 314
Записей в блоге: 2
16.01.2015, 20:30 11
FromOutSide, исходники прислать готовые?
1
禁止
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 230
23.01.2015, 17:23  [ТС] 12
сорри что так долго отвечал, но можно и готовые, потом разберу.
0
禁止
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 230
27.01.2015, 13:24  [ТС] 13
так есть или нету готовых исходников?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2015, 13:24
Помогаю со студенческими работами здесь

Ошибка при попытке запустить программу (It is an error to use a section registered as allowDefinition)
Пытаюсь разобраться в чужом коде - сайт на ASP.NET. При запуске получаю ошибку It is an error to...

Как получить в программе адрес файла, при попытке открыть его с помощью функции "открыть с помощью"
Доброго времени суток. Второй день ищу ответ на вопрос: как получить в программе адрес файла,...

Как запустить программу или открыть папку
Какой код для этого используется? пробовал один из методов: Dim s As New Shell s.Open...

Visual Studio. С++. ООП. Как исправить ошибку, возникающую при попытке запустить код?
1) “Возникли ошибки сборки. Продолжить и запустить последний успешно построенный вариант? ” 2)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru