Определение физических дисков на компьютере

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Определение физических дисков на компьютере

Сообщение edyapd » 04.10.2011 (Вт) 13:08

Подскажите как можно определить количество физических дисков на компьютере и вывести по ним информацию?
Есть такая программа:
Код: Выделить всё
'Beispiel: VB .Net - WMI - Win32_PhysicalMedia - Laufwerksinformationen ermitteln - Seriennummer ermitteln
'
Option Explicit On
Option Strict On

Imports System.Management
Imports System.Text
Imports System.Environment

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles MyBase.Load
        With Me
            .CenterToScreen()
        End With
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
            Handles Button1.Click
        Dim arrProp(13) As String
        arrProp(0) = "Caption"
        arrProp(1) = "CreationClassName"
        arrProp(2) = "Description"
        arrProp(3) = "Manufacturer"
        arrProp(4) = "MediaDescription"
        arrProp(5) = "Model"
        arrProp(6) = "Name"
        arrProp(7) = "OtherIdentifyingInfo"
        arrProp(8) = "PartNumber"
        arrProp(9) = "SerialNumber"
        arrProp(10) = "SKU"
        arrProp(11) = "Status"
        arrProp(12) = "Tag"
        arrProp(13) = "Version"
        Dim i As Integer
        Dim Result As String
        Me.TextBox1.Text = ""
        For i = 0 To 13
            Result = DiskPropety(arrProp(i))
            If Result IsNot Nothing Then
                Me.TextBox1.Text = Me.TextBox1.Text + arrProp(i) + " = " + Result + NewLine
            Else
                Me.TextBox1.Text = "Nothing"
            End If
        Next
    End Sub

    Private Shared ReadOnly Property DiskPropety(ByVal prop As String) As String
        Get
            Try
                Dim moc As ManagementObjectCollection = InitManagement()
                Dim mo As ManagementObject
                If moc IsNot Nothing Then
                    For Each mo In moc
                        If mo.Properties(prop).Value.ToString() IsNot Nothing Then
                            Return mo.Properties(prop).Value.ToString()
                        End If
                    Next
                Else
                    Return "Нет данных"
                End If
            Catch
                Return "Нет данных"
            End Try
            Return "Нет данных"
        End Get
    End Property

    Private Shared Function InitManagement() As ManagementObjectCollection
        Try
            Dim query As String = " Select * from Win32_PhysicalMedia"
            Dim mos As ManagementObjectSearcher = New ManagementObjectSearcher(query)
            Dim moc As ManagementObjectCollection = mos.Get()
            Return moc
        Catch
            Return Nothing
        End Try
        Return Nothing
    End Function
End Class

Но она выдает данные только по PHYSICALDRIVE0.
Да и то только Серийный номер.
Подскажите как можно получить данные по другим дискам

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Определение физических дисков на компьютере

Сообщение FireFenix » 04.10.2011 (Вт) 13:27

Да и то только Серийный номер.

Средствами фреймворка: http://msdn.microsoft.com/ru-ru/library ... einfo.aspx

Средствами WMI: Win32_Diskdrive -> Win32_DiskPartition -> Win32_LogicalDisk
Последний раз редактировалось FireFenix 04.10.2011 (Вт) 17:32, всего редактировалось 1 раз.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 04.10.2011 (Вт) 14:05

FireFenix писал(а):Средствами фреймворка: http://msdn.microsoft.com/ru-ru/library ... einfo.aspx

Это логические диски, а не физические.

FireFenix писал(а):Средствами WMI: Win32_Diskdrive -> Win32_DiskPartition -> Win32_Diskdrive

По названию кажется, что и это - тоже.

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: Определение физических дисков на компьютере

Сообщение edyapd » 04.10.2011 (Вт) 14:15

http://msdn.microsoft.com/en-us/library/aa394134(VS.85).aspx
Здесь вроди как соответствие физических и логических дисков. Если я правильно понял.
Но не знаю как создать запрос, чтобы получить перечисление всех возможных вариантов.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Определение физических дисков на компьютере

Сообщение FireFenix » 04.10.2011 (Вт) 17:31

Qwertiy писал(а):
FireFenix писал(а):Средствами фреймворка: http://msdn.microsoft.com/ru-ru/library ... einfo.aspx

Это логические диски, а не физические.

Спасибо Капитан Очевидность!
Получению информации это не мешает.

Qwertiy писал(а):
FireFenix писал(а):Средствами WMI: Win32_Diskdrive -> Win32_DiskPartition -> Win32_Diskdrive

По названию кажется, что и это - тоже.

Да ладно? Когда кажется - креститься нада! Взял бы да помог человеку...

edyapd писал(а):Но не знаю как создать запрос, чтобы получить перечисление всех возможных вариантов.

Код: Выделить всё
Imports System.Management

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Dim scope As New ManagementScope
        Dim query As New ObjectQuery("SELECT * FROM Win32_Diskdrive")

        Dim searcher As New ManagementObjectSearcher(scope, query)

        Dim queryCollection As ManagementObjectCollection = searcher.[Get]()

        For Each m As ManagementObject In queryCollection '
            Console.WriteLine("DeviceID: " & m("DeviceID"))
            Console.WriteLine("Caption: " & m("Caption"))
            Console.WriteLine("Size: " & Math.Round((Convert.ToDecimal(m("Size")) / 1073741824), 2))

            For Each b As ManagementObject In m.GetRelated("Win32_DiskPartition")
                Console.WriteLine("{0}", b("Name"))

                For Each c As ManagementBaseObject In b.GetRelated("Win32_LogicalDisk")
                    If Convert.ToInt32(c("DriveType")) = 3 Then
                        Console.WriteLine(vbTab & " System: {0}", m("SystemName"))
                        Console.WriteLine()
                        Console.WriteLine(vbTab & " Size: {0}", Math.Round((Convert.ToDecimal(m("Size")) / 1073741824), 2))
                        Console.WriteLine(vbTab & " Health: {0}", Convert.ToString(m("Status")))
                    End If
                Next
            Next

            Console.WriteLine()
        Next
    End Sub
End Class

Результат:
Код: Выделить всё
DeviceID: \\.\PHYSICALDRIVE0
Caption: MAXTOR STM31000340AS
Size: 931,51
Disk #0, Partition #0
    System: SKYFANTOM

    Size: 931,51
    Health: OK

DeviceID: \\.\PHYSICALDRIVE1
Caption: SAMSUNG SP2004C
Size: 186,31
Disk #1, Partition #0
    System: SKYFANTOM

    Size: 186,31
    Health: OK

DeviceID: \\.\PHYSICALDRIVE2
Caption: WDC WD5000AAKX-001CA0
Size: 465,76
Disk #2, Partition #0
    System: SKYFANTOM

    Size: 465,76
    Health: OK


Все доступные поля и их значение можно посмотреть здесь:
Win32_DiskDrive
Win32_DiskPartition
Win32_LogicalDisk
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: Определение физических дисков на компьютере

Сообщение edyapd » 04.10.2011 (Вт) 18:34

FireFenix
Спасибо, буду разбираться

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 04.10.2011 (Вт) 23:02

FireFenix писал(а):Взял бы да помог человеку...

Я бы помог, если бы знал как.

edyapd
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 03.10.2011 (Пн) 19:54

Re: Определение физических дисков на компьютере

Сообщение edyapd » 05.10.2011 (Ср) 15:56

FireFenix
Чуток поправил даную программку заработала на УРА.
Код: Выделить всё
                        Console.WriteLine(vbTab & " System: {0}", m("SystemName"))
                        Console.WriteLine(vbTab & " Size: {0}", Math.Round((Convert.ToDecimal(m("Size")) / 1073741824), 2))
                        Console.WriteLine(vbTab & " Health: {0}", Convert.ToString(m("Status")))

В этих строках заменил m на c
Сам удивляюсь как получилось вытащить серийники физических дисков таким запросом:
Код: Выделить всё
            For Each sn As ManagementObject In m.GetRelated("Win32_PhysicalMedia")
                Me.TextBox1.Text = Me.TextBox1.Text + NewLine + ("SerialNumber: " & sn("SerialNumber"))
            Next

Появилось несколько вопросов:
Чем отличаются:
For Each b As ManagementObject In m.GetRelated("Win32_DiskPartition")
от
For Each c As ManagementBaseObject In b.GetRelated("Win32_LogicalDisk")
Подставил вместо ManagementBaseObject - ManagementObject результат тот же.
И для чего ставится "{0}" в выражении Console.WriteLine("{0}", b("Name"))

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Определение физических дисков на компьютере

Сообщение FireFenix » 05.10.2011 (Ср) 17:41

edyapd писал(а):Подставил вместо ManagementBaseObject - ManagementObject результат тот же.

ManagementBaseObject - Содержит базовые элементы управляющего объекта. Служит в качестве базового класса для других классов управляющих объектов.
Код: Выделить всё
Public Class ManagementBaseObject _
   Inherits Component _
   Implements ICloneable, ISerializable


ManagementObject - Представляет экземпляр WMI.
Код: Выделить всё
Public Class ManagementObject _
   Inherits ManagementBaseObject _
   Implements ICloneable


edyapd писал(а):И для чего ставится "{0}" в выражении Console.WriteLine("{0}", b("Name"))

Вообще это форматирование вывода
Код: Выделить всё
Console.WriteLine(vbTab & " Health: {0}", Convert.ToString(m("Status")))

тоже самое если бы
Код: Выделить всё
Console.WriteLine(vbTab & " Health: " & Convert.ToString(m("Status")))

Суть - облегчить постановку значения где-то внутри текста.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

    TopList