Página 1 de 1

Bloquerar acceso a Memorias USB

Publicado: 15 Abr 2010, 01:11
por kemazonico
Pues bien, necesito bloquear el uso de memorias USB en aproximadamente 150 equipos, la manera que lo hago es modificando una entrada en el registro, todo funciona bien ecepto cuando los usuarios conectan una memoria "nueva", osea una memoria que jamas se ha insertado en el equipo y Windows automaticamente instala el controlador y restaura el valor en el registro, volviendo a habilitar el acceso a todas las memorias USB.

Lo que intento programar es una aplicacion que se ejecute en el equipo como servicio y este monitoreando esa entrada del registro y si esta cambia en automatico la regrese al valor que yo le tenga establecido.

Espero alguien me pueda apoyar en esto, ya que mis conociemientos en programacion son bastante "cortos".


El codigo de lo que ocupo es el siguiente:

Código: Seleccionar todo

; Inicio del script

$var = RegRead("HKLM\SYSTEM\CurrentControlSet\services\USBSTOR", "Start")
;~ MsgBox(4096, "Valor", $var)

if $var = "3" then RegWrite ("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\USBSTOR", "Start", "REG_DWORD", "4")
if $var = "4" then RegWrite ("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\USBSTOR", "Start", "REG_DWORD", "3")
Lo anterior habilita o deshabilita el acceso a las memorias USB basandose en el servicio "Controlador de dispositivo de almacenamiento USB" o USBSTORAGE que se modifica en el registro de windows.

Cabe señalar que el la opción de deshabilitar el acceso a dispositivos USB desde "Editor de directivas de windows" no es viable ya que los usuarios que accesan al equipo, por las caracteristicas de las aplicaciones que se manejan tienen privilegios de administrador, ademas que se planea habilitar o deshabilitar la funcion de bloqueo en equipos y momentos que los usuarios sean autorizados, la idea es hacerlo basandonos en una base de datos SQL donde se colocaran que usuarios tienen acceso a las memorias USB y que usuarios no.

Ejemplo:

Tenemos una tabla en SQL con las siguientes filas:

filas: usuario, bloqUSB

Si el usuario "alfredo.santana" que se encuentra en la base de datos tiene el valor "1" en la fila bloqUSB significa que puede tener acceso a las memorias USB
De lo contrario si el valor es 0, no podra tener acceso a estos dispositivos.

Esta parte en la que el programa lee el valor de las tablas segun el usuario lo tengo resuelto, lo que me falta es el tema que les planteo al principio de este post.


De antemano muchas gracias.

Re: Bloquerar acceso a Memorias USB

Publicado: 15 Abr 2010, 03:05
por BasicOs
Así por encima puedes hacer un programita con un bucle:
While
if NuevoDisco() then ProtegeElRegistro()
sleep(500)
Wend,
Para la función NuevoDisco() le incluyes la función DriveGetDrive( "REMOVABLE" ) que te revisa las unidades por si hay removibles.

Código: Seleccionar todo

$var = DriveGetDrive( "removable" )
If NOT @error Then.... endif
Salu22:)
Aquí tienes un post que hace muchas cosas con el USB por si te sirve, como apagar el pc, o usarlo como llave:
http://www.emesn.com/autoitforum/viewto ... =usb#p4536

PD: Seguro que hay muchos programas en cualquier lenguaje que ya bloqueen, si consigues la lógica testeada lo puedes adaptar a autoit.

Re: Bloquerar acceso a Memorias USB

Publicado: 15 Abr 2010, 05:42
por kemazonico
gracias por la ayuda, ya intente algo con el ejemplo que me pones, pero no logro hacerlo funcionar....

lo que no me queda clearo es sobre el "IF" en:

While
if NuevoDisco() then ProtegeElRegistro()
sleep(500)
Wend

Seguire intentando y si no tengo un avance por aqui pasare a molestarles nuevamente.

Re: Bloquerar acceso a Memorias USB

Publicado: 15 Abr 2010, 13:01
por BasicOs
kemazonico escribió:no me queda clearo es sobre el "IF" en:
While
if NuevoDisco() then ProtegeElRegistro()
sleep(500)
Wend
No molestas!! mejor que protegeelRegistro()--> sería graba la llave del registro que protege el usb, según tu publicaste antes.
Lo que hace el programa es cada medio segundo revisar si hay drives nuevos, y en caso de que exista alguno lo protege con las claves de registro que nombraste antes. Seguro que hay mil otras maneras de proteger un USB pero esta te chequea el tema. (también podrías chequear si existe la carpeta del drive nuevo, pero no haría falta de esta manera)
Puedes publicar el code a ver como vas? :smt002
Salu22:)

Re: Bloquerar acceso a Memorias USB

Publicado: 15 Abr 2010, 19:27
por Chefito
El post que te indica BasicOs de la llave usb es muy bueno. Miratelo que te resultará muy interesante :smt002 .

Yo te voy a poner dos script que tengo desde hace tiempo para mostrar otras posibilidades. Los cogí del foro de habla inglesa (no recuerdo de que post ni de quien :smt017 ) porque yo también quería detectar la entrada y salida de un pen usb.
El primer código utiliza un objeto WMI.
El segundo es muy interesante, captura los eventos. No tienes que estar comprobando continuamente si has metido una unidad usb.

1º código:

Código: Seleccionar todo

$DBT_DEVICEARRIVAL = "0x00008000"
$WM_DEVICECHANGE = 0x0219
$strComputer = "."
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\cimv2")
 $colEvents = $objWMIService.ExecNotificationQuery _
    ("Select * From __InstanceOperationEvent Within 5 Where " _
        & "TargetInstance isa 'Win32_LogicalDisk'")

While 1
$objEvent = $colEvents.NextEvent
    If $objEvent.TargetInstance.DriveType = 2 Then
         Select
              Case $objEvent.Path_.Class()="__InstanceCreationEvent"
         Consolewrite("Drive " & $objEvent.TargetInstance.DeviceId & "has been added." & @CR)
                     ;A Usb drive has been plugged in
              Case $objEvent.Path_.Class()="__InstanceDeletionEvent"
                     ConsoleWrite("Drive " & $objEvent.TargetInstance.DeviceId & "has been removed."& @CR)
                     ;A usb drive has been removed
         EndSelect
     EndIf
Wend
2º código:

Código: Seleccionar todo

Global Const $DBT_DEVICECOMPLETEREMOVAL = "0x00008004"
Dim $USB_ATTENTION = "0x00000007"

Global Const $DBT_DEVICEARRIVAL     = 0x00008000
Global Const $WM_DEVICECHANGE       = 0x0219
Global Const $tagDEV_BROADCAST_HDR  = "dword dbchsize;dword dbchdevicetype;dword dbchreserved"
Global Const $DBT_DEVTYP_VOLUME     = 0x00000002
Global Const $tagDEV_BROADCAST_VOLUME   = "dword dbcvsize;dword dbcvdevicetype;dword dbcvreserved;dword dbcvunitmask;short dbcvflags"
Global Const $DBTF_MEDIA            = 0x0001
Global Const $DBTF_NET              = 0x0002
;Setup The GUI to watch for the DeviceChange Event

GUICreate("Test")
GUIRegisterMsg($WM_DEVICECHANGE, "DeviceChange")

While 1
    Sleep (1000)
WEnd

Func DeviceChange($hWndGUI, $MsgID, $WParam, $LParam)
	;ConsoleWrite($wparam)
    $iEvent = $WParam
    If $iEvent = $DBT_DEVICEARRIVAL Then
            $temp = DllStructCreate($tagDEV_BROADCAST_HDR, $LParam)
            $iDeviceType = DllStructGetData($temp, "dbchdevicetype")
            If $iDeviceType = $DBT_DEVTYP_VOLUME Then
                $struct = DllStructCreate($tagDEV_BROADCAST_VOLUME, $LParam)
                $iUnitMask = DllStructGetData($struct, "dbcvunitmask")
                $iFlags = DllStructGetData($struct, "dbcvflags")
                If Not BitAND($iFlags, $DBTF_MEDIA) And Not BitAND($iFlags, $DBTF_NET) Then
                    $sDrive = FirstDriveFromMask($iUnitMask)
                    ConsoleWrite($sDrive & ": was inserted!" & @CRLF)
                EndIf
            EndIf
    EndIf
EndFunc   ;==>DeviceChange

Func FirstDriveFromMask($unitmask)
    Local $i
    For $i = 0 To 25
        If BitAND($unitmask, 0x1) Then ExitLoop
        $unitmask = BitShift($unitmask, 1)
    Next
    Return Chr($i + Asc('A'))
EndFunc
En el segundo código puedes ver los números de mensajes que te envía win cuando sacas y metes el usb. Quitando este comentario

Código: Seleccionar todo

;ConsoleWrite($wparam)
te mostrará estos números y podrás tratarlos con condiciones (if....then).

Puedes adaptar los códigos para que cuando detecte que se ha introducido una unidad usb mire el registro y lo trate, o cualquier cosa que tú quieras :smt023 .

Saludos.