Что нового

Ограничение доступа(блокировка) к компьютеру если не вставлен носитель с ключом

Pat4005

Новичок
Сообщения
85
Репутация
4
Вот была тема. http://autoit-script.ru/index.php/topic,206.msg1636.html#msg1636. Но в "моём" скрипте не обязательно отсоединение устройства. Идея состоит в том, чтобы ограничивать доступ до тех пор пока не будет вставлен носитель с ключом(ini-файл). Все работает. Не могу сделать так, чтоб программа работала в фоне, и при извлечении usb(например)устройства возвращалась в своё исходное состояние(сейчас вставляю флешку БЕЗ ключа - включается блок и сплэш на весь экран, потом "чужая" флэшка вытаскивается, а сплэш с блоком остаются включенными - в этом и есть проблема! помогите пожалуйста.)





Код:
#include <Constants.au3>
#include <Misc.au3>
#include <BlockInputEx.au3>
#include <Array.au3>
#include <File.au3>



HotKeySet("+!^{END}", "_Block")
HotKeySet("+!^{HOME}", "_UnBlock")
HotKeySet("{ESC}", "_Quit")

Global $disk
_Loop1()
Func _Loop1()
dim $i,$kkk,$kkk2,$izvl=0,$i2,$i3
$var_before = DriveGetDrive("all")

	While 1

$var_after = DriveGetDrive("all")
		For $i = 1 To $var_after[0]
    $kkk=0
			For $i2 = 1 To $var_before[0]
				If $var_after[$i]=$var_before[$i2] Then
			$kkk=1
			$izvl1 = IniRead($var_after[$i]&"\PCLock.ini","2","key",0)
			If $izvl1=5 then $disk=$var_after[$i]
				EndIf
		Next
				If $kkk=0 Then
$izvl = IniRead($var_after[$i]&"\PCLock.ini","2","key",0)
					If $izvl <> 5 then
            SplashTextOn("Опасностянама!", "Компьютер заблокирован! Найден незарегистрированный носитель информации. Вставьте носитель с ключом!", @DesktopWidth, @DesktopHeight, -1, -1, 0, "",50,600)
			_Block()
			Beep(1500)
            Sleep (2000)
	While 2
		$kkk = DriveGetFileSystem ($var_after[$i])
                        If $kkk <> $kkk2 Then
                        _SplashOff ()
						_UnBlock()
						
                        ExitLoop
                        EndIf
	Wend
					EndIf
				EndIf
			Next
_SplashOff ()
_UnBlock()
WEnd
EndFunc

Func _SplashOff()
    SplashOff()
EndFunc

Func _Block()
    _BlockInputEx(1, "{Ctrl}|{Alt}|{Shift}|{HOME}|{INSERT}|{ESC}")
	RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "1")
EndFunc

Func _UnBlock()
    _BlockInputEx(0)
	RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "0")
	
	_SplashOff()
	EndFunc

Func _Quit()
    Exit
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,805
Репутация
1,168
Pat4005
Зачем в цикле проверять устройства, есть WM_DEVICECHANGE. А для скриптов есть Tidy
 
Автор
P

Pat4005

Новичок
Сообщения
85
Репутация
4
А WM_DEVICECHANGE может мне передать как-нибудь букву устройства(F:,M:,Z: и т.п.)? И что такое Tidy и как он может помочь?
 
Автор
P

Pat4005

Новичок
Сообщения
85
Репутация
4
AZJIO, все сделал но не пойму хоть убей почему не выключается splash с блоком после вытаскивания флешки!!
Код:
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <Misc.au3>
#include <BlockInputEx.au3>
#include <Array.au3>
#include <File.au3>

HotKeySet("+!^{F12}", "_Block")
HotKeySet("+!^{END}", "_Block")
HotKeySet("+!^{HOME}", "_UnBlock")
HotKeySet("{ESC}", "_Quit")

Global Const $WM_DEVICECHANGE = 0x0219
Global Const $DBT_DEVICEARRIVAL = 0x8000 ; Найдено новое устройство
Global Const $DBT_DEVICEREMOVECOMPLETE = 0x8004 ; Устройство отключено
Global Const $DBT_DEVTYP_VOLUME = 0x00000002 ; Логический диск

Global $disk



$Gui = GUICreate("WM_DEVICECHANGE", 370, 140)
GUIRegisterMsg($WM_DEVICECHANGE, "WM_DEVICECHANGE")

Do
	
Until GUIGetMsg() = -3


Func _Block()
    _BlockInputEx(1, "{Ctrl}|{Alt}|{Shift}|{HOME}|{INSERT}|{ESC}")
	RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "1")
EndFunc

Func _UnBlock()
    _BlockInputEx(0)
	RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "0")
	EndFunc

Func _Quit()
    Exit
EndFunc

Func WM_DEVICECHANGE($hWnd, $Msg, $wParam, $lParam)
    
    If ($wParam = $DBT_DEVICEARRIVAL) Or ($wParam = $DBT_DEVICEREMOVECOMPLETE) Then
        Local $DEV_BROADCAST_VOLUME = DllStructCreate("int dbcvsize;int dbcvdevicetype;int dbcvreserved;int dbcvunitmask;" & _
                "ushort dbcvflags", $lParam)
        Local $iDriveType = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvdevicetype")
    Else
        Return $GUI_RUNDEFMSG
    EndIf
    
    ; Если устройство не является логическим диском, то выход из функции
    If $iDriveType <> $DBT_DEVTYP_VOLUME Then Return $GUI_RUNDEFMSG
    
    Local $iMask = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvunitmask")
    $iMask = Log($iMask) / Log(2)
    
    Global $iDrive = Chr(65 + $iMask) & ":"
	$izvl = IniRead($iDrive&"\PCLock.ini","2","key",0)
    Do
	If $izvl <> 5 and $iDriveType = $DBT_DEVTYP_VOLUME then ; устройство вставлено и ключ НЕ равен 5(т.е. ключ неверен)
		SplashTextOn("Опасностянама!", "Компьютер заблокирован! Найден незарегистрированный носитель информации. Вставьте носитель с ключом!", @DesktopWidth, @DesktopHeight, -1, -1, 0, "",50,600)
		_Block()
		Beep(1500)
		Sleep (2000)
	ElseIf $izvl = 5 and $iDriveType = $DBT_DEVTYP_VOLUME then ; устройство вставлено и ключ равен 5(т.е. ключ верен)
		SplashOff()
		_UnBlock()
	ElseIf $iDriveType <> $DBT_DEVTYP_VOLUME then ;устройство отсутствует(или оно стало отключенным)
		SplashOff()
		_UnBlock()
	EndIf
	Until $iDriveType <> $DBT_DEVTYP_VOLUME
    Return $GUI_RUNDEFMSG
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,805
Репутация
1,168
Pat4005
Для чего строка
Код:
If $izvl <> 5 and $iDriveType = $DBT_DEVTYP_VOLUME then

Ведь выше уже выяснили
Код:
If $iDriveType <> $DBT_DEVTYP_VOLUME Then Return $GUI_RUNDEFMSG
и проверять второй раз нет смысла

Далее
Код:
Global $iDrive

Внутри функции глобавльные не объявляются, объяви в "шапке" скрипта а в функции просто не делай её принудительно локальной.

не выключается splash с блоком после вытаскивания флешки!!
а где условие вытаскивания?
Код:
Switch $wParam
        Case $DBT_DEVICEARRIVAL ; обнаружение устройства
            TrayTip("WM_DEVICECHANGE", "Устройство подключено", 5, 1)
            
        Case $DBT_DEVICEREMOVECOMPLETE ; отключение устройства
            TrayTip("WM_DEVICECHANGE", "Устройство отключено", 5, 2)
    EndSwitch

В скрипте просматривается только параметр $izvl <> 5. Причем здесь 5, условие вытаскивания флешки $wParam=$DBT_DEVICEREMOVECOMPLETE
 
Автор
P

Pat4005

Новичок
Сообщения
85
Репутация
4
AZJIO, izvl=5 означает параллельную проверку(вместе с наличием вставленной флешки) на наличие ini-файла с ключом. переделал. работает. Спасибо тебе AZJIO! Вот кому надо, держите-
Код:
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <Misc.au3>
#include <BlockInputEx.au3>
#include <Array.au3>
#include <File.au3>

HotKeySet("+!^{END}", "_Block")
HotKeySet("+!^{HOME}", "_UnBlock")
HotKeySet("{ESC}", "_Quit")

Global Const $WM_DEVICECHANGE = 0x0219
Global Const $DBT_DEVICEARRIVAL = 0x8000 ; Найдено новое устройство
Global Const $DBT_DEVICEREMOVECOMPLETE = 0x8004 ; Устройство отключено
Global Const $DBT_DEVTYP_VOLUME = 0x00000002 ; Логический диск
Global $iDrive
Global $disk



$Gui = GUICreate("WM_DEVICECHANGE", 370, 140)
GUIRegisterMsg($WM_DEVICECHANGE, "WM_DEVICECHANGE")

Do
	
Until GUIGetMsg() = -3


Func _Block()
    _BlockInputEx(1, "{Ctrl}|{Alt}|{Shift}|{HOME}|{INSERT}|{ESC}")
	RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "1")
EndFunc

Func _UnBlock()
    SplashOff()
    _BlockInputEx(0)
	RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "0")
	EndFunc
Func _Quit()
    Exit
EndFunc



Func WM_DEVICECHANGE($hWnd, $Msg, $wParam, $lParam)
    
    If ($wParam = $DBT_DEVICEARRIVAL) Or ($wParam = $DBT_DEVICEREMOVECOMPLETE) Then
        Local $DEV_BROADCAST_VOLUME = DllStructCreate("int dbcvsize;int dbcvdevicetype;int dbcvreserved;int dbcvunitmask;" & _
                "ushort dbcvflags", $lParam)
        Local $iDriveType = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvdevicetype")
    Else
        Return $GUI_RUNDEFMSG
    EndIf
    
    ; Если устройство не является логическим диском, то выход из функции
    If $iDriveType <> $DBT_DEVTYP_VOLUME Then Return $GUI_RUNDEFMSG
    
    Local $iMask = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvunitmask")
    $iMask = Log($iMask) / Log(2)
    
    $iDrive = Chr(65 + $iMask) & ":"
	$izvl = IniRead($iDrive&"\PCLock.ini","2","key",0)
   
   Switch $wParam
		Case $DBT_DEVICEARRIVAL ; обнаружение устройства
			If $izvl <> 5 then   ;ключ НЕ равен 5(т.е. ключ неверен)
				SplashTextOn("Опасностянама!", "Компьютер заблокирован! Найден незарегистрированный носитель информации. Вставьте носитель с ключом!", @DesktopWidth, @DesktopHeight, -1, -1, 0, "",50,600)
				_Block()
				Beep(3500)
				Sleep (1000)
			Else
				SplashOff()
				_UnBlock()
			EndIf
		Case $DBT_DEVICEREMOVECOMPLETE ; отключение устройства
			TrayTip("Flash Defender", "Устройство отключено", 5, 2)
			SplashOff()
			_UnBlock()
    EndSwitch
   
    Return $GUI_RUNDEFMSG
EndFunc

При необходимости блок отменяется комбинацией Ctrl+Alt+Shift+Home
ini-файл на флешке должен быть вот такого вида:
 

Jan-Jak

Новичок
Сообщения
43
Репутация
1
:stars:

\\****\***\pclock.au3(4,10) : ERROR: can't open include file <BlockInputEx.au3>
#include <BlockInputEx.au3>
~~~~~~~~~^
\\****\***\pclock.au3(30,66) : ERROR: _BlockInputEx(): undefined function.
_BlockInputEx(1, "{Ctrl}|{Alt}|{Shift}|{HOME}|{INSERT}|{ESC}")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
\\****\***\pclock.au3 - 2 error(s), 0 warning(s)

поясните на пальцах, для особо одаренных, как добавить эту библиотеку?
 

Jan-Jak

Новичок
Сообщения
43
Репутация
1
добрый день, сегодня захотел вспомнить этот кусок кода. И выдает ошибку
error: $WM_DEVICECHANGE previously declared as a 'Const'.
Global Const $WM_DEVICECHANGE = 0x0219
Подскажите как исправить?
 

Prog

Продвинутый
Сообщения
454
Репутация
55
Значит константа $WM_DEVICECHANGE уже объявлена.
 

Oki

Осваивающий
Сообщения
221
Репутация
26

Jan-Jak

Можно тогда вместо этой строки вставить проверку значения.
Код:
If $WM_DEVICECHANGE <> 0x0219 Then
   MsgBox(4096, "", "The value of the constant is previously set differ from the needed.) ; Else everything is ready already.
EndIf
Если сообщение об ошибке не будет вылетать, то константа установлена в нужное значение кем-то ранее. Скорее всего, вследствие какой-либо инструкции #include. Ну или, если не хочется надеяться на то, что такое поведение будет стабильным, сделать предварительно проверку и на то, что эта ситуация возникла.
Код:
If Not IsDeclared($WM_DEVICECHANGE) Then
   Global Const $WM_DEVICECHANGE = 0x0219
ElseIf $WM_DEVICECHANGE <> 0x0219 Then
   MsgBox(4096, "", "The value of the constant is previously set differ from the needed.) ; Else everything is ready already.
EndIf
Для ещё большей точности следовало бы также отследить, какое конкретно значение возвращает функция IsDeclared(), дабы различать объявленное глобально от локального, но вряд ли это понадобится в этом случае.

Но всё это больше похоже либо на единичный тест для успокоения, либо на костыли. Лучше всё-таки разобраться в причинах и месте, где нужное объявление константы сделано.
 
Последнее редактирование:

Jan-Jak

Новичок
Сообщения
43
Репутация
1
Код:
Func _Block()
    _BlockInputEx(1, "{Ctrl}|{Alt}|{Shift}|{HOME}|{INSERT}|{ESC}")
    RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "1")
EndFunc

Func _UnBlock()
    SplashOff()
    _BlockInputEx(0)
    RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "0")
    EndFunc
Func _Quit()
    Exit
EndFunc

Данный ключ реестра не работает в десятке. Есть предложения куда копать?
 
Последнее редактирование:

zghwelcome

Новичок
Сообщения
3
Репутация
1
Код:
Func _Block()
    _BlockInputEx(1, "{Ctrl}|{Alt}|{Shift}|{HOME}|{INSERT}|{ESC}")
    RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "1")
EndFunc

Func _UnBlock()
    SplashOff()
    _BlockInputEx(0)
    RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "0")
    EndFunc
Func _Quit()
    Exit
EndFunc

Данный ключ реестра не работает в десятке. Есть предложения куда копать?
maybe you can use IGroupPolicyObject
 
Верх