منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
لا استطيع الحصول على الرقم التسلسلي للقرص C - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم اسئلة VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=183)
+--- الموضوع : لا استطيع الحصول على الرقم التسلسلي للقرص C (/showthread.php?tid=45960)



لا استطيع الحصول على الرقم التسلسلي للقرص C - ابو محمد محمد محمد - 25-04-23

سلام الله عليكم جميعا

استخدم كود لجلب الرقم التسلسلي للقرص الصلب C ولكن يجلب لي رقم لقرص اخر

كود :
Operators.ConditionalCompareObjectEqual(current("Tag"), "\\.\PHYSICALDRIVE0", False) Then

وحسب ما افهم ان PHYSICALDRIVE0 المفترض ان تكون للقرص الاول او الذي عليه النظام

وشكرا


RE: لا استطيع الحصول على الرقم التسلسلي للقرص C - aljzazy - 25-04-23

PHP كود :
Imports System.Management

Public Function GetSerialNumber() As String
    Dim disk 
As ManagementObject = New ManagementObject("Win32_LogicalDisk.DeviceID=""C:""")
 
   disk.Get()
 
   Return disk("VolumeSerialNumber").ToString()
End Function 

يمكنك استدعاءه كالتالي :
PHP كود :
Dim serialNumber As String GetSerialNumber()
MessageBox.Show("C drive serial number: " serialNumber



RE: لا استطيع الحصول على الرقم التسلسلي للقرص C - ابو محمد محمد محمد - 25-04-23

جزاك الله كل خير ساحاول التغيير فيه فيبدو انه يجلب الرقم المنطقي وليس الحقيقي للقرص الصلب


RE: لا استطيع الحصول على الرقم التسلسلي للقرص C - aljzazy - 26-04-23

(25-04-23, 11:18 PM)ابو محمد محمد محمد كتب : جزاك الله كل خير ساحاول التغيير فيه فيبدو انه يجلب الرقم المنطقي وليس الحقيقي للقرص الصلب

بالنسبة للهارديسك يوجد فيه النالي :
1. disk id
2. disk serial number
3. disk modle

وهذه فنكشين تجلبهم 

كود :
Public diskId As String 'Digital ID
   Public diskSerialNumber As String 'This we will call it the serial number for the time being.
   Public diskModel As String 'serial number

Public Sub Get_Hard_Serial()
       Dim cmicWmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")

       For Each cmicWmiObj As ManagementObject In cmicWmi.Get
           diskId = cmicWmiObj("signature")
           diskSerialNumber = cmicWmiObj("serialnumber")
           diskModel = cmicWmiObj("Model")
       Next
   End Sub



RE: لا استطيع الحصول على الرقم التسلسلي للقرص C - ابو محمد محمد محمد - 27-04-23

جزاك الله كل خير

جربتها من قبل ولا تفلح المشكلة تحدث عندما تكون هناك العديد من الاقراص بالكمبيوتر ويكون القرص C الذي عليه النظام ليس هو الاول في التسجيل
فمثلا هذا الاستعلام

كود :
SELECT * FROM Win32_DiskDrive  WHERE Index = '0'

لن يفيد لان القرص الذي عليه النظام ليس هو القرص الاول والنظام يفهرسه على انه الثاني او الثالث

ولهذا الخيار هو الاستعلام بحرف القرص وليس الفهرس

والحل هنا

كود :
class Program
{
   static void Main(string[] args)
   {
       const string drive = "C:";

       Console.WriteLine("Drive {0}'s Model Number is {1}", drive, GetModelFromDrive(drive));
   }

   public static string GetModelFromDrive(string driveLetter)
   {
       // Must be 2 characters long.
       // Function expects "C:" or "D:" etc...
       if (driveLetter.Length != 2)
           return "";

       try
       {
           using (var partitions = new ManagementObjectSearcher("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='" + driveLetter +
                                            "'} WHERE ResultClass=Win32_DiskPartition"))
           {
               foreach (var partition in partitions.Get())
               {
                   using ( var drives = new ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" +
                                                        partition["DeviceID"] +
                                                        "'} WHERE ResultClass=Win32_DiskDrive"))
                   {
                       foreach (var drive in drives.Get())
                       {
                           return (string) drive["Model"];
                       }
                   }
               }
           }
       }
       catch
       {
           return "<unknown>";
       }

       // Not Found
       return "<unknown>";
   }
}

ولكنه سي شارب ويحتاج الى تحويل وحولته عن طريق احد المواقع كالتالي:

كود :
Class Program
   Private Shared Sub Main(ByVal args As String())
       Const drive As String = "C: "
       Console.WriteLine("Drive {0}'s Model Number is {1}", drive, GetModelFromDrive(drive))
   End Sub

   Public Shared Function GetModelFromDrive(ByVal driveLetter As String) As String
       If driveLetter.Length <> 2 Then Return ""

       Try

           Using partitions = New ManagementObjectSearcher("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='" & driveLetter & "'} WHERE ResultClass=Win32_DiskPartition")

               For Each Partition In partitions.[Get]()

                   Using drives = New ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & Partition("DeviceID") & "'} WHERE ResultClass=Win32_DiskDrive")

                       For Each drive In drives.[Get]()
                           Return CStr(drive("Model"))
                       Next
                   End Using
               Next
           End Using

       Catch
           Return "<unknown>"
       End Try

       Return "<unknown>"
   End Function
End Class


ولكن يوجد خطاء يقول الـ Partition غير معروف
مع العلم مستخدمي سي شارب يقولون انه يعمل
 التحويل ينقص شئ ما


RE: لا استطيع الحصول على الرقم التسلسلي للقرص C - Taha Okla - 27-04-23

اذا كانت المشكلة بتحويل الكود .. فالأمر بسيط جداً

وهذا هو الكود بعد التحويل :
كود :
Public Shared Function GetModelFromDrive(driveLetter As String) As String
    Dim result As String
    If driveLetter.Length <> 2 Then
        result = ""
    Else
        Try
            Using partitions As ManagementObjectSearcher = New ManagementObjectSearcher("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='" + driveLetter + "'} WHERE ResultClass=Win32_DiskPartition")
                For Each partition As ManagementBaseObject In partitions.[Get]()
                    Dim str As String = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='"
                    Dim obj As Object = partition("DeviceID")
                    Using drives As ManagementObjectSearcher = New ManagementObjectSearcher(str + If((obj IsNot Nothing), obj.ToString(), Nothing) + "'} WHERE ResultClass=Win32_DiskDrive")
                        Using enumerator2 As ManagementObjectCollection.ManagementObjectEnumerator = drives.[Get]().GetEnumerator()
                            If enumerator2.MoveNext() Then
                                Dim drive As ManagementBaseObject = enumerator2.Current
                                Return CStr(drive("Model"))
                            End If
                        End Using
                    End Using
                Next
            End Using
        Catch
            Return "<unknown>"
        End Try
        result = "<unknown>"
    End If
    Return result
End Function

والاستدعاء يكون بالأمر :
كود :
MsgBox("Drive C:'s Model Number is  " & GetModelFromDrive("C:"),, "The Serial :")

الكود جربته عندي وهو يعمل #C  و VB

فهذا الكود هو يجلب الرقم التسلسلي للهارد ديسك الذي تقوم بتحديد القرص منه وليس الرقم التسلسلي للقرص نفسه..

لكن هل هذا الكود الذي تريده ويلبي طلبك  أم لا ؟؟ فهذا شأنك..

بالتوفيق ..


RE: لا استطيع الحصول على الرقم التسلسلي للقرص C - ابو محمد محمد محمد - 27-04-23

جزاك الله خير

اجل هذا بالضبط ما ابحث عنه تحديد القرص بحرفه وهذا لتفادي مشكلة ان القرص الذي عليه النظام فهرسته ليست الاولى في النظام