Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.02.2010, 22:11
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
Вопрос серийник USB-флешки

как программно узнать серийный номер флешки?
а то есть такая идея, запретить доступ к компу флешек с другими серийными номерами нежели у моей
Ответить с цитированием
  #2  
Старый 11.02.2010, 09:58
Аватар для RusMaXXX
RusMaXXX RusMaXXX вне форума
Начинающий
 
Регистрация: 01.10.2008
Сообщения: 138
Версия Delphi: 7
Репутация: 21
Лампочка

Код:
function GetHardDiskSerial(const DriveLetter: Char): string; 
var
  NotUsed:     DWORD; 
  VolumeFlags: DWORD;
  VolumeInfo:  array[0..MAX_PATH] of Char;
  VolumeSerialNumber: DWORD; 
begin 
  GetVolumeInformation(PChar(DriveLetter + ':\'), 
    nil, SizeOf(VolumeInfo), @VolumeSerialNumber, NotUsed, 
    VolumeFlags, nil, 0); 
  Result := Format('VolSer = %8.8X', [VolumeSerialNumber])
end;

применять так: ShowMessage(GetHardDiskSerial('c'));
Ответить с цитированием
  #3  
Старый 11.02.2010, 10:39
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

спасибо вроде работает! единственное вроде как не будет работать после форматирования флешки(где-то в нете нарыл)
А теперь вопросы номер два и три :
2) как определить момент подключения флешки?
3) как программно отсоединять(извлекать) не нужные мне флешки?
Ответить с цитированием
  #4  
Старый 11.02.2010, 10:42
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Лучше запрет других флешек делать так:
1. удалить из системы информацию о всех ранее установленных флешек ( кроме своей или ее потом подключить и инсталировать )
Это можно сделать
- либо программкой USBDeview ( но она вроде не всю информацию удаляет, но может быть достаточно ).
- запустить диспечер устройств следующим батником:
Код:
echo off
set DEVMGR_SHOW_DETAILS=1
set DEVMGR_SHOW_NONPRESENT_DEVICES=1
start devmgmt.msc
Включить в нем показ скрытых устройств и удалить флешки в нескольких ветвях.
- либо могу выложить исходники программки ( устанавливается сервисом и удаляет информацию о всех ранее установленных флешках через 10 секунд после извлечения очередной - делал для начальства, чтоб не подсматриволо ). из нее можно выдрать код очистки, но тогда надо либо права System либо ставить разрешение записи для некоторых ветвей реестра ). После первых двух способов надо перезапустить комп, чтобы стерлась инфа из резервной ветки реестра. Врезультате должны остатся зарегистрированными только флешки которые можно пользоваться.
2. Запретить установку новых флешек как описано здесь ( думаю должно сработать, но не пробовал )
3. Наслаждаться мучениями ( удивлением ) товарищей
Ответить с цитированием
  #5  
Старый 11.02.2010, 11:04
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от friz
спасибо вроде работает! единственное вроде как не будет работать после форматирования флешки(где-то в нете нарыл)
А теперь вопросы номер два и три :
2) как определить момент подключения флешки?
3) как программно отсоединять(извлекать) не нужные мне флешки?
для пункта 2 использовать RegisterDeviceNotification
Код:
procedure TRSAMessForm.FormCreate(Sender: TObject);
var
  NF:TDEV_BROADCAST_DEVICEINTERFACE;
begin
  FNeedExecute := False;

  NF.dbcc_size:=sizeof(TDEV_BROADCAST_DEVICEINTERFACE);
  NF.dbcc_devicetype:=DBT_DEVTYP_DEVICEINTERFACE;

  FDeviceNotification := RegisterDeviceNotification(Handle,@NF,DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
end;

{    procedure OnDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE; }

procedure TRSAMessForm.OnDeviceChange(var Msg: TMessage);
begin

  case Msg.WParam of
    DBT_DEVICEREMOVECOMPLETE: WaitExec();

    DBT_DEVICEARRIVAL: WaitExec(True);
    DBT_DEVNODES_CHANGED: WaitExec();
  end;

end;
Я отслеживал извлечение
Ответить с цитированием
  #6  
Старый 11.02.2010, 11:20
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

s0Creator, сенкс!
но в исходнике у меня делфа ругается. можешь скинуть целый исходник
Ответить с цитированием
  #7  
Старый 11.02.2010, 11:35
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Лови, написано на D7.
FastMM4 - если у тебя нет просто закоментируй ( использую для выявления утечек памяти )
Если еще какого модуля не хватит - скажи ( у меня некоторые общие в другом месте ).
Registry.pas - немного исправленная версия стандартного ( была одна ошибка ).

Работает:
при запуске спрашивает - установить сервис?
если да копирует себя в System32 и запускает сервис.
второй запуск - спрашивает удалить сервис? если да удаляет сервис но прога в System32 остается
дальше как писал - разбирайся - может просто переделаеш так чтоб запомнила все уже установленные или вывела список и спросила какие оставить а затем удаляла при подключении новой ( но по мне лучше запрет в реестре как написано поссылке ).
Вложения
Тип файла: zip usbcleaner.zip (20.5 Кбайт, 240 просмотров)
Ответить с цитированием
  #8  
Старый 11.02.2010, 11:57
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

В догонку несколько нюансов:
- RegisterDeviceNotification работаем только с оконными дескрипторами, поэтому в сервисе создается пустое невидимое окно, которое получает сообщение.
- какая то из использованных функций не работает на виндах ниже XP (т.е. 2000 винде ).
- отслеживаемые события тебе надо подкоректировать
- у меня ищутся фантомы ( установленные но не подключенные флешки ) , тебе надо будет наверное подключенные искать и получать о них информацию только в той инфе вроде нет отдельно серийника но можно получить из строки типа "HardwareID" = USB\Vid_046e&Pid_5540&Rev_0130&MI_01
USB\Vid_046e&Pid_5540&MI_01
но тут могу ошибаться - не использовал
Ответить с цитированием
  #9  
Старый 11.02.2010, 15:36
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

friz.
Большое спасибо за плюсик - добавилось 354 бала.
Правда не знаю радоваться или сразу готовиться к лишению награды администрацией.
Исходники наверное выложу в отдельной теме ( раз с твоей помощью вспомнил о них ) - там много можно для примера взять ( и про сервисы и немного про флешки ) - в свое время изрядно по бороздил инет и MSDN.
Ответить с цитированием
  #10  
Старый 11.02.2010, 19:34
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

Спасибо за все!
p.s. + я пока тебе не ставил
p.p.s. на форуме поменяли принцип раздачи +
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:47.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter