Есть ли более быстрый способ получить серийный номер тома? - PullRequest
3 голосов
/ 17 июля 2009

Привет! Я использую этот код для генерации подписи машины. Но это займет заметное время, чтобы выполнить. Интересно, почему это так медленно? Какой более быстрый метод рекомендуется?

Public Shared Function DriveSN(ByVal DriveLetter As String) As String
    Dim disk As ManagementObject = New ManagementObject(String.Format("Win32_Logicaldisk='{0}'", DriveLetter))
    Dim VolumeName As String = disk.Properties("VolumeName").Value.ToString()
    Dim SerialNumber As String = disk.Properties("VolumeSerialnumber").Value.ToString()
    Return SerialNumber.Insert(4, "-")
End Function

Private Shared msig As String = Nothing

Public Shared Function MachineSignature() As String
    If msig Is Nothing Then
        Dim list As New List(Of String)
        For Each d As DriveInfo In DriveInfo.GetDrives()
            If (d.IsReady) Then
                list.Add(DriveSN(d.Name.Substring(0, 2)))
            End If
        Next
        msig = String.Join(" & ", list.ToArray())
    End If
    Return msig
End Function

Ответы [ 3 ]

3 голосов
/ 17 июля 2009

Существует также .Net путь из egghead cafe с использованием пространства имен System.Management.

Во-первых, вам нужно добавить ссылку на dll System.Management в vb.net. Использование пункта меню Project-> Add Reference.

Затем следующий код получает серийный номер диска C:

Dim drive As String = "C"
Dim disk As System.Management.ManagementObject = _
       New System.Management.ManagementObject _
       ("win32_logicaldisk.deviceid=""" + drive + ":""")
disk.Get()
Dim SerialNumber as String = disk("VolumeSerialNumber").ToString()
2 голосов
/ 18 июля 2009

Это смущает. Проблему производительности можно решить, просто проверив наличие «фиксированного» диска.

Public Shared Function MachineSignature() As String
    If msig Is Nothing Then
        Dim list As New List(Of String)
        For Each d As DriveInfo In DriveInfo.GetDrives()
            If (d.DriveType = DriveType.Fixed) AndAlso (d.IsReady) Then  ' <-- check for DriveType'
                list.Add(DriveSN(d.Name.Substring(0, 2)))
            End If
        Next
        msig = String.Join(" & ", list.ToArray())
    End If
    Return msig
End Function
0 голосов
/ 17 июля 2009

Существует также вызов Win32 API, но я думаю, что WMI - лучший способ, так как он все еще является управляемым кодом.

Функция Win32 API: GetVolumeInformation

Я нашел следующую функцию в eggheadcafe (это C #, но это не должно быть проблемой в vb.net) для извлечения серийного номера:

public string GetVolumeSerial(string strDriveLetter)
{
uint serNum = 0;
uint maxCompLen = 0;
StringBuilder VolLabel = new StringBuilder(256); // Label
UInt32 VolFlags = new UInt32();
StringBuilder FSName = new StringBuilder(256); // File System Name
strDriveLetter+=":\\"; // fix up the passed-in drive letter for the API call
long Ret = GetVolumeInformation(strDriveLetter, VolLabel, (UInt32)VolLabel.Capacity, ref serNum, ref maxCompLen, ref VolFlags, FSName, (UInt32)FSName.Capacity);

return Convert.ToString(serNum);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...