Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Подскажите, как реализовать программу (С++) (http://forum.oszone.net/showthread.php?t=203004)

azotvp 25-03-2011 14:15 1643635

Подскажите, как реализовать программу (С++)
 
хочу реализовать программу которая должна:
1) небольшие системные файлы переносить из одной папки в другую
2) определять уникальный идентификатор Flash-накопителя VID
3) производить поиск в реестре и удалять нужные файлы

желательны советы по реализации данных трёх пунктов на C++, можно с ссылкой на литературу
если знаете, как реализовать данные функции на других языках (delphi i t.d) также прошу поделиться

заранее спасибо

Beyound 25-03-2011 16:57 1643753

начнем с простого - п 3. есть отдельный стандартный класс для работы с реестром винды, находится в библиотеке windows.h, подробнее - тут
п.1. системный файл не отличается от обычного файла ничем, просто иногда нужны права админа чтобы его двигать. Опять же в winAPI, таже библиотека, есть стандартные функции на эту тему, подробнее ну скажем тут неплохо все расписано
п.2. для работы с usb тоже скорее всего есть в winAPI чтонить типа перечислителя подключенных устройств, подробнее не скажу, такое не делал а искать лень уже.

azotvp 25-03-2011 17:54 1643780

большое спасибо за 1 и 3 пункты, информация помогла для того чтобы начать реализовывать задуманное

если у кого-нибудь есть еще идеи по поводу реализации пункта 2 - определения vid накопителя, прошу поделиться =)

BlackEric 26-03-2011 00:06 1644054

Информацию о железе можно получать через WMI
или можете попробовать разобраться с функцией DeviceIoControl.

azotvp 26-03-2011 09:09 1644159

может есть у кого готовый листинг проги, которая определяет серийный номер Флешки?

BlackEric 26-03-2011 15:34 1644371

Я так понимаю, что вы хотите отследить кто, что подключал к компьютеру.

Я бы делал так:
1. Обработал событие message WM_DEVICECHANGE и таким образом узнал, что подключено.
Примеры обработки есть на диске к книге Агурова (DeviceMonitor.Delphi).

2. Если это логический диск, то через WMI из класса Win32_DiskDrive получил интересующие вас Caption и PNPDeviceID.

Код:

procedure TForm1.GetAllMediaData;
var
  SWbemLocator: TSWbemLocator;
  Service: ISWbemServices;
  DiskDrives, SWbemObjectSet: ISWbemObjectSet;
  SWbemObject: ISWbemObject;
  PropSet: ISWbemPropertySet;
  DriveEnum: IEnumVariant;
  Value: Cardinal;
  TempObj: OleVariant;
begin
  Memo1.Lines.Add('======================');

  SWbemLocator := TSWbemLocator.Create(Nil);
  try
    Service := SWbemLocator.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0,
      Nil);
    DiskDrives := Service.ExecQuery(
      'SELECT * FROM Win32_DiskDrive', 'WQL', 0, Nil);

    DriveEnum := (DiskDrives._NewEnum) as IEnumVariant;
    while DriveEnum.Next(1, TempObj, Value) = S_OK do
    begin
      SWbemObject := IUnknown(TempObj) as ISWbemObject;
      PropSet := SWbemObject.Properties_;

      if PropSet.Count > 0 then
        try
          Memo1.Lines.Add('======================');
          Memo1.Lines.Add('DeviceID = ' + PropSet.Item('DeviceID', 0).Get_Value);
          Memo1.Lines.Add('SerialNumber = ' + PropSet.Item('SerialNumber', 0).Get_Value);
          Memo1.Lines.Add('Caption = ' + PropSet.Item('Caption', 0).Get_Value);
          Memo1.Lines.Add('Size = ' + IntToStr(PropSet.Item('Size', 0).Get_Value));
          Memo1.Lines.Add('InterfaceType = ' + PropSet.Item('InterfaceType', 0).Get_Value);
          Memo1.Lines.Add('Manufacturer = ' + PropSet.Item('Manufacturer', 0).Get_Value);
          Memo1.Lines.Add('Model = ' + PropSet.Item('Model', 0).Get_Value);
          Memo1.Lines.Add('Name = ' + PropSet.Item('Name', 0).Get_Value);
          Memo1.Lines.Add('PNPDeviceID = ' + PropSet.Item('PNPDeviceID', 0).Get_Value);
          Memo1.Lines.Add(' ');
        except

        end;

    end;
  finally
    SWbemLocator.Free;
    Memo1.Lines.Add('======================');
  end;
end;


azotvp 26-03-2011 15:59 1644391

я пытаюсь сделать блокиратор флэшек
суть:
флешки, которые ранее подключались, работают нормально без какх - либо изменений.
а те, которые ранее не подключались - блокируются.

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

сейчас нашел 2 API – функции: GetDriveType – определяет и возвращает тип носителя,
GetVolumeInformation – определяет информацию о носителе, среди которой содержится серийный номер

надеюсь я иду в верном направлении
п.с. по прежнему буду благодарен за помощь =)

BlackEric 26-03-2011 16:29 1644415

Серийник возвращаемый GetVolumeInformation - является серийником логического диска и меняется после каждого форматирования.

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

А как вы собрались блокировать флешку?

azotvp 26-03-2011 16:56 1644434

походу GetVolumeInformation не подходит =(
есть программа checkUDisk v5.3 - она определяет параметры подключенных дисков, веси около 200 кб, среди параметров
Serial Number: P7XO8HVXRYF9M6NL - есть то что нужно, узнать бы по какому принципу она пашет

а по поводу вопроса, как блокировать флешки:
в папке %systemroot% / inf есть 2 системных файла usbstor.PNF и usbstor.inf
при удалении этих файлов/перемещении, ос перестает опознавать любые носители которые ранее не подключались
просто появляется сообщение: устройство не опознано и все, оно даже в диспетчере устройств не отобразится
внимание: заблокированные флешки даже после возврата файлов на место не опознаются (покачто решения проблемы не нашел) любые другие флешки, которые не были заблокированы, после возврата файлов на место работают корректно.

получается так: если вы удалите эти 2 файла usbstor.PNF и usbstor.inf - то работать будут только те флешки, информация о которых есть в реестре.
если же вам нужно исключить одну из флешек, которой "разрешен доступ", то просто необходимо очистить все записи в реестре о ней. Очистку лучше производить по серийнику)
делал все что я описал руками - все работает, хочу лишь чтобы все было цивиьно и выполнялось программой, и мог любой не просвещенный выполнить данную процедуру

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

BlackEric 27-03-2011 00:06 1644710

Ну так получите через WMI PNPDeviceID = USBSTOR\DISK&VEN_JETFLASH&PROD_TS512MJF110&REV_0.00\68E739268F4717&0
и распарсите его выдрав серийник


Время: 17:44.

Время: 17:44.
© OSzone.net 2001-