2013/04/19

Windows7 USBメモリ不可設定

USBメモリの利用不可設定の方法はいくつかあるが、
僕はグループポリシーよりも いろいろカスタマイズができるスクリプトを利用した制御のほうが
好き

@IT USB大容量記憶装置ドライバを無効にする
http://www.atmarkit.co.jp/fwin2k/win2ktips/629usb2/usb2.html

上記に書かれている通り、
KEY_LOCAL_MACHINEのSYSTEM\CurrentControlSet\Services\USBSTOR の
Start の値を4に変更するとUSBメモリを指しても認識しなくなる。

ただし、新しいメモリを刺した場合、USBメモリのドライバを取ってくるときに、上記のレジストリはクリアされ、(値が3に戻る)再び利用可能となってしまう。

対応方法として、%SystemRoot%\inf\ 配下の以下の2つのファイルのアクセス権を無効にする必要があるらしい
UsbStor.inf
UsbStor.pnf

ただ、僕のWindows7環境では上記のアクセス権を無効にしても、相変わらずドライバはインストールされ続け、USB利用も可能になってしまった。なので以下のファイルのアクセス権を無効にした。
C:\Windows\System32\DriverStore\INFCACHE.1

上記ファイルのSystem、Everyoneのアクセス権をフルコントロールで拒否することで、
ドライバのインストールは試みるものの失敗するようになり、USBメモリを利用できない動きが確認できた。

あとはどのように上記アクセス権を変更するかだが、
Windows7の場合icaclsコマンドがあるので、それを利用する。
ただし、そのままアクセス権変更を実施してもUACが邪魔するので、解除した上で実行する必要がある。
また、一般ユーザーでは変更権限をもたないので、GPOのスタートアップスクリプトを利用して展開するのが理想。

以下、スクリプト
nonusb.vbs
<# 


On Error Resume Next
'listがoffの場合には、'System権限、Users権限をなくすスクリプト。
'スタートアップによる実施が必要

Dim objWMI, objShell, osInfo, os
Dim objWsh, objNetwork, objFS, objTS
Dim CompName, objFile, host

Set objWsh = WScript.CreateObject("WScript.Shell")
Set objNetwork = WScript.CreateObject("WScript.Network")
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")

' Vistaかどうかチェックし管理者権限に昇格させる
do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
    Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set osInfo = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
  
    For Each os in osInfo
        If left(os.Version, 3) < 6.0 Then exit do
    Next
    
    ' 引数付きでwscriptを管理者権限で再実行
    Set objShell=CreateObject("Shell.Application")  
    objShell.ShellExecute "wscript.exe", Chr(34) & WScript.ScriptFullName & Chr(34) & " uac","","runas",1
    WScript.Quit
loop


CompName =  objNetwork.ComputerName   'コンピュータ名を変数に保存
objFile = "usblist.txt"
Set objTS = objFS.OpentextFile(objFile)


Do Until objTS.AtEndOfStream
 List = objTS.readline
' WScript.Echo host
'カンマで区切ったものを配列に入れる
 List_Item = Split(List,",")
 Host = List_Item(0)
'大文字、小文字の両方で利用可能にする
 oomoji = Ucase(Host)

 If host = CompName OR oomoji = CompName Then

  Select Case List_Item(1)

  Case "ON","on"
   objWsh.Run("cmd /c icacls C:\Windows\System32\DriverStore\INFCACHE.1 /reset")
   objWsh.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Start", "3","REG_DWORD"
  Case "OFF","off"
   objWsh.Run("cmd /c takeown /F C:\Windows\System32\DriverStore\INFCACHE.1 /A")
   WScript.sleep(100)
   objWsh.Run("cmd /c icacls C:\Windows\System32\DriverStore\INFCACHE.1 /inheritance:d")
   WScript.sleep(100)
   objWsh.Run("cmd /c icacls C:\Windows\System32\DriverStore\INFCACHE.1 /deny system:F /deny users:F /deny everyone:F")

   objWsh.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Start", "4","REG_DWORD"

  End Select

 End If
Loop

usblist.txtを用意し、
PC名,off
PC名,on
と書かれたリストを用意し、任意のPCがonの場合はUSB利用許可、offの場合は不可となるようにする。



スポンサーリンク

スポンサーリンク