[c#]USB接続デバイス管理 1-[System.Management]の参照

ある事情で、PCに接続するデバイスを制限する必要があったため、その内容を書いていきます。
改善点やおかしな点等があれば、御教授頂けると助かります。

まず、通常のUSBメモリだけでなく、スマホ等の機器接続も防ぐ必要があるため、「WMI」を利用します。
DriveInfo.GetDriversでは取得できないケースもあるため。
その為、参照設定に[System.Management]を追加。

※脱着検知を行うのであれば、Windowsメッセージの受信処理を行えばよいが、Windows起動前からUSBメモリをポートに差しているケースなどがあるため、全PnPデバイスを常時監視対象に置く事としました。
<Windowsメッセージ処理Memo>
WM_DEVICECHANGE 0x0219
Control.WndProcをoverrideする。(定義のためFormのサブクラスが必要)

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Management;

namespace ConsoleCheck
{
    class Program
    {
        // 情報取得コマンド
        static ManagementObjectSearcher MyOCS = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity");
        // 取得Object格納
        static ManagementObjectCollection MyOC;
        static void Main(string[] args)
        {}
    }
}


ここで、プログラム起動後にループさせ、一周ごとの検知デバイス数の変化によって、抜き差しの検知を行う処理を記入。
(増減の管理を切り分け可)

        static void Main(string[] args)
        {
            //接続されてるPnPDeviceの総数
            int CountDevice = MyOCS.Get().Count;
            //1Scan前のPnPDeviceの総数
            int CountDeviceBefour = CountDevice;
            //ループ動作(←ループ条件は、後程要検証)
            while (true)
            {
        MyOC = MyOCS.Get();
                CountDevice = MyOC.Count;
                if (CountDevice != CountDeviceBefour)
                {
                    //ここでデバイス数変化時の処理を行う。
                }
                CountDeviceBefour = CountDevice;
            }
        }

ちょっと長くなりそうなので、今回はここまで。

【各ページへのリンク】

ManagementObjectの[Properties]や[SystemProperties]

ManagementObjectクラスのObjectの[Properties]や[SystemProperties]を
呼び出す時は、PropertyData[]に一旦変換すると調べやすい。
([PropertyData]の呼出引数が[string propertyName]の為)

ManagementObject MyObject
PropertyData[] MyArray = new PropertyData[MyObject.Properties.Count];
MyObject.Properties.CopyTo(MyArray, 0);
(※MyObjectには目的のManagementObjectを格納して下さい)
posted by RingCat at 11:38Comment(0)tips

Properties - Win32_PnPEntity

ManagementObjectとして格納された、Win32_PnPEntityクラスのProperties

(※[MyObject]にはWin32_PnPEntityクラスのObjectを格納して下さい。)
ManagementObject MyObject
PropertyData[] MyArray = new PropertyData[MyObject.Properties.Count];
MyObject.Properties.CopyTo(MyArray, 0);

上記におけるMyArrayの内容。(詳細はぼちぼち追記予定)
(要素数:24)

[0]:AvailabilityCaption / 型:UInt16

[1]:Caption / 型:String
オブジェクトを短いテキストで表した説明です。

[2]:ClassGuid / 型:String
プラグ アンド プレイ デバイスを一意に識別するグローバル一意識別子 (GUID) が含まれています。

[3]:CompatibleID / 型:String[]

[4]:ConfigManagerErrorCode / 型:UInt32

[5]:ConfigManagerUserConfig / 型:Boolean

[6]:CreationClassName / 型:String

[7]:Description / 型:String

[8]:DeviceID / 型:String
プラグ アンド プレイ デバイスを識別する文字列が含まれています。

[9]:ErrorCleared / 型:Boolean

[10]:ErrorDescription / 型:String

[11]:HardwareID / 型:String[]

[12]:InstallDate / 型:DateTime

[13]:LastErrorCode / 型:UInt32

[14]:Manufacturer / 型:String

[15]:Name / 型:String

[16]:PNPDeviceID / 型:String

[17]:PowerManagementCapabilities / 型:Uint16

[18]:PowerManagementSupported / 型:Boolean

[19]:Service / 型:String
プラグ アンド プレイ デバイスをサポートするサービス名。
例:"USBSTOR","WinUSB","disk"

[20]:Status / 型:String
オブジェクトの現在の状態を示す文字列。
例:"OK","Error"

[21]:StatusInfo / 型:Uint16
論理デバイスの状態を示します。
※null値が入る事もありますので要注意

[22]:SystemCreationClassName / 型:String

[23]:SystemName / 型:String
posted by RingCat at 10:42Comment(0)tips