2016-08-25 5 views
0

背景:私はアセットデータベースのコンピュータ情報を取得する私たちのユニットのヘルプデスク用のアプリケーションを作成しました。最近、在庫を取っている人は、ユーザーがUSB外付けハードドライブを接続していて、私のアプリがそれをハードドライブの総容量に含めていると言いました。USBドライブを無視してWin32 ManagementObjectsを使用してハードディスクの合計サイズを取得する方法はありますか?

外部/ USBデバイスを無視してWin32 ManagementObjectsを使用してハードドライブの合計サイズを取得するにはどうすればよいですか?

私は、このようなWin32_PhysicalMediaWin32_LogicalDisk、またはWin32_DiskPartitionなどの別のWin32ManagementObjectsアイテムを使用して喜んだけど、:

  • 私は、全内部ストレージにのみ興味がある(実際には、パーティションを気にしませんか、私はバグがここ

以下のコードであるかを考え出すでより興味

  • 論理ドライブ)は、私が持っているものです。

    long totalSize = 0; 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32ManagementObjects.Win32_DiskDrive"); 
    // there may be multiple hard drives, so loop through them all 
    foreach (ManagementObject mo in searcher.Get()) 
    { 
        /* 
        * I assume this is where the problem is. I check that the drive type 
        * includes "FIXED HARD DISK" (see reference link below) 
        */ 
        mediaType = mo.Properties["MediaType"].Value.ToString().ToUpper(); 
        if (mediaType.IndexOf("FIXED HARD DISK") >= 0) 
        { 
         totalSize += Convert.ToInt64(mo.Properties["Size"].Value.ToString()); 
        } 
    } 
    

    この特定のUSBドライブは、オペレーティングシステムに不正な情報を報告していますか?それは可能ですか?ユーザーのコンピュータがオフサイトになっているため、基本的にはデバッグできません。

    参考:https://msdn.microsoft.com/en-us/library/aa394132(v=vs.85).aspx

  • 答えて

    1

    私はこのコードにコードをしようと

    long totalSize = 0; 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); 
    // there may be multiple hard drives, so loop through them all 
    foreach (ManagementObject mo in searcher.Get()) 
    { 
        if (mo.Properties["InterfaceType"].Value.ToString() != "USB") 
        { 
         totalSize += Convert.ToInt64(mo.Properties["Size"].Value.ToString()); 
        } 
    } 
    

    とUSBを介して接続されたものを除く私の固定ディスクのtotalsizeを得ることができますプロパティのMediaTypeの値を読み込むときに、私はとNullReferenceExceptionをreceieved .ToString()は、このプロパティが常に設定されているとは限りません。おそらく、 "FIXED HARD DISK"をチェックする前にNullReferenceを追加してstring.IsNullOrEmptyを追加しようとする可能性がありますが、固定ディスク上でこのプロパティがnullになることはありません。ところで

    は、Win32ManagementObjects.Win32_DiskDriveを使用すると、私がWin32ManagementObjects文字列を削除して、あなたは、古典的なWin32関数GetDriveType()を使用してDRIVE_REMOVABLEDRIVE_FIXEDを確認することができる唯一のWin32_DiskDrive

    +0

    申し訳ありません。エラーは発生していないので、「間違っている」と判断したため、エラーチェックコードを削除して読みやすくしました。 – Rick

    +0

    "USB接続SCSI"(USB大容量ストレージと比較してプロトコルオーバーヘッドが大幅に削減されている)について報告されているインターフェイスが不思議です。 –

    +0

    もちろん、これはFireWireやeSATAなどの他の外部ドライブの識別には役立ちません。 (Thunderbolt、おそらく?)IInspectableに言及されている「除去ポリシー」はよりよいアプローチです。 –

    -2

    を残しているManagementException InvalidQueryを与えます。

    +1

    'DRIVE_REMOVABLE'は、リムーバブルメディアを持つドライブであり、リムーバブルドライブではありません。それはフロッピーやZipディスクに当てはまる日に、今ではカードリーダー(コンパクトフラッシュ、MMC、SDなど)です。 –

    +0

    ストレート[GetDriveType](https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939.aspx)から:* "ドライブがUSBタイプのドライブかどうかを判断するには、[** SetupDiGetDeviceRegistryProperty **](https://msdn.microsoft.com/en-us/library/windows/desktop/ff551967.aspx)を開き、** SPDRP_REMOVAL_POLICY **プロパティを指定してください。 "* – IInspectable

    +0

    @IInspectable:より適切です。しかし、私は個人的にはWMI経由でチェックする方法を知らない。 –

    関連する問題