пятница, 30 января 2015 г.

Серия "В один клик" : извлекаем флешку банк-клиента

Банк-клиент – очень удобная штука, все бухгалтеры это знают. 
Но есть у неё слабая сторона в техническом плане: флешка авторизации. Покупаются все эти флешки у дяди Ляо в сарае, и дохнут пачкам. Замена их – дело обычно сильно сложное, так что приходится их беречь и заботиться. В частности, правильно извлекать



Иногда недостаточно научить бухгалтера вытаскивать флешку правильно (а это значит: сходить в трей, выбрать там нужную, извлечь: сколько сложной работы! ;) ). Бывает, недостаточно заставить запомнить, что делать это нужно КАЖДЫЙ РАЗ. В реализации DEFAULT_BANK оказалось, что несчастный токен блокируется от извлечения системной службой, с которой он работает. Во как!

Ну что ж, скрипт нам в помощь, конечно же. Больше никаких треев, да и вообще думать не надо, знай себе дави иконку на рабочем столе :)

@Echo off
net stop SCardSvr 
for /f "tokens=1" %%i in ('tasklist ^| findstr /r /i /c:"START.EXE"') do (taskkill /F /T /IM "%%i")
devcon remove "USB\Vid_0000&Pid_0000"
RemoveDrive "USBSTOR\DISK&VEN_*"
echo MSGBOX "Теперь флешку можно извлечь" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
net start SCardSvr

Нам понадобятся две дополнительные программы. Про devcon ты, наверное, помнишь :) . В принципе, можно было обойтись и одним devcon'ом, но RemoveDrive мне просто понравился :)

Что делаем:

net stop SCardSvr
- останавливаем службу, которая мешает (в данном случае это "Смарт-карты") ;

for /f "tokens=1" %%i in ('tasklist ^| findstr /r /i /c:"START.EXE"') do (taskkill /F /T /IM "%%i")
- находим и завершаем программу, которая работает с флешки ;

devcon remove "USB\Vid_0000&Pid_0000"
- от одной флешки появляются два устройства в системе: устройство чтения смарт-карт (и поэтому флешка просто так не вынимается) и обычный съёмный диск. Коды оборудования, как ты помнишь, смотрим в "Управлении". В данном случае получается фокус: если отключить "устройство чтения смарт-карт", извлекается И съёмный носитель. А вот если начать со съёмного носителя, то "устройство чтения" останется, и извлечь корректно его будет уже нельзя. Угадайте банк! ;)

RemoveDrive "USBSTOR\DISK&VEN_*"
- можно обойтись и без этой команды, но я оставил на всякий случай. RemoveDrive умеет извлекать только носители, что мы и делаем ;

echo MSGBOX "Теперь флешку можно извлечь" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
- создаём скрипт VB и оповещаем пользователя, что всё готово ;

net start SCardSvr
- запускаем службу обратно .


И всё было бы прекрасно... только служба "Смарт-карты" неподвластна "пользователю", только "Администратору". А права через "Управление" задать нельзя...
В прошлой статье я упоминал про "SC", и сейчас эта штука нам очень пригодится – с её помощью права на службы задать МОЖНО!

Подробно об этом написано здесь http://geektimes.ru/post/75090/

Вкратце, нужно выполнить в cmd такую команду:
sc sdset ИМЯ_СЛУЖБЫ D:(A;;RPWPDT;;;S-SID-ПОЛЬЗОВАТЕЛЯ)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCR
RC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD) 
Выглядит ужасно, знаю )))
SID пользователя можно посмотреть в реестре (мы и сами с усами, а?) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList или воспользоваться скриптом из статьи.

Вот, собственно, и всё. Создаём ярлык на рабочем столе, и пользователь может извлекать флешку одним (двойным) кликом. Long Live the Flash!

Комментариев нет:

Отправить комментарий