【问题标题】:Getting Serial Number of the Hard Drive Provided by the manufacturer through PHP通过PHP获取厂商提供的硬盘序列号
【发布时间】:2010-10-17 02:00:59
【问题描述】:

获取硬盘的序列号 由制造商通过 PHP 提供: 如何做呢? 我想将它存储在一个文件中。

操作系统:windows 2000、XP、ME、Vista...

是的,我想要服务器的硬盘驱动器的序列号

或者可以通过 Adob​​e AIR 完成吗? 或者可以通过Windows上的C程序来完成吗?

C:\Documents and Settings\Administrator>dir
 Volume in drive C has no label.
 Volume Serial Number is BC16-5D5F

这个数字:BC16-5d5f 对于硬盘来说是唯一的吗? 它与制造商给出的序列号有何不同?

wmic DISKDRIVE GET SerialNumber

在我的 Vista 机器上仅显示以下文本:

序列号

在我的 XP 机器上,该命令无法识别。

【问题讨论】:

  • 您没有得到答复的原因是您的特定硬盘驱动器没有向操作系统提供此信息或已损坏。

标签: php hard-drive serial-number


【解决方案1】:

以下返回磁盘序列号。应该使用多个驱动器,您只会得到多个结果。只需使用shell_exec 运行它。

wmic DISKDRIVE GET SerialNumber

wmic.exe 位于您的 windows system32 文件夹中。 wmic 确实存在于 WinXP 上,我自己在那里用过。

我在 Vista 上的结果:

C:\Windows\System32>wmic DISKDRIVE GET SerialNumber
SerialNumber
20202020202054534241354c4*snip*

我不知道是否所有硬盘都向操作系统提供序列号。

看来wmic命令只适用于Windows XP、Windows Vista和Windows 7的专业版。

【讨论】:

  • 我的研究得出的结论是 wmic 在 Windows XP Professional 上,但不在 Windows XP Home 上。你家有吗?我正在寻找一种获取信息的方法,并且我想使用 WMIC。
  • @coding_idiot 它适用于我的 Windows 7 Home Premium(64 位)副本。只需打开一个 CLI 窗口并输入上面的命令。
【解决方案2】:

PHP 本身无法访问这样的硬件。

你必须要么

  • 使用操作系统的命令并使用system()exec() 调用它
  • 为 PHP 编写一个可以返回信息的扩展

如果您在 Linux 上并且拥有必要的权限和配置,您可以使用 $r = system("hdparm -I /dev/hda");(将 hda 替换为您的 hd)来获取给定硬盘驱动器的序列号。

【讨论】:

  • 为了避免root访问,我们还有ls /dev/disk/by-id/my answer;)
【解决方案3】:
hdparm -i /dev/sdX

这是在 linux 上,但在 windows 上不确定。你可以通过“system()”来执行

看看http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.hk.msdn.connection&tid=e41f0af2-2e76-4be6-9b7b-636e79ac0491&cat=zh_HK_3b03d742-993a-4f96-accd-1063c6bfd559&lang=zh&cr=HK&sloc=&p=1

可能是前进的方向。

另外,当我在命令提示符下运行“dir”时,它会显示:

C:\Documents and Settings\Administrator>dir
 Volume in drive C has no label.
 Volume Serial Number is BC16-5D5F

这就是你要找的吗?

【讨论】:

  • 那个卷(即分区)的序列号。
  • 这个数字 BC16-5d5f 对于硬盘来说是唯一的吗?顺便说一句,这个数字是如何生成的,它与制造商给出的序列号有什么不同?
  • 这个数字对硬件没有用处。它只是格式化驱动器时分配给卷的软件序列号。
【解决方案4】:

我不能告诉你答案,但我想你必须看看扩展的方向(甚至可能自己写一个)。我怀疑这是 PHP 的核心。

编辑:我忘记了“exec”的原始力量:-/

【讨论】:

    【解决方案5】:

    使用shell_exec 运行以下命令(如果需要,在命令提示符中进行测试):

    wmic path win32_physicalmedia get Tag,SerialNumber
    

    DISKDRIVE 没有获得显示通过 IDE 通道插入的驱动器的实际序列号。以上似乎得到了我所有驱动器的实际序列号。标签还将返回您它是什么类型的驱动器,这可能有助于识别不同的驱动器。

    示例输出:

    SerialNumber     Tag
    WD-WX55D33JQNZ4  \\.\PHYSICALDRIVE4
    S1OKIJNH938475   \\.\PHYSICALDRIVE0
    WD-CV44HJ5L765Y  \\.\PHYSICALDRIVE1
    WD-WX41D65SD1UU  \\.\PHYSICALDRIVE2
    WD-WXB1SD3OIJHG  \\.\PHYSICALDRIVE3
                     \\.\CDROM0
    

    【讨论】:

      【解决方案6】:

      您想要来自服务器还是客户端的硬盘驱动器? PHP 在服务器上运行,因此对我来说,直接从客户端获取它似乎是不可能的。

      手册建议您可以在服务器上执行命令: http://nl2.php.net/manual/en/ref.exec.php

      不幸的是,我没有足够的 Unix 来为您提供硬盘序列号。

      【讨论】:

        【解决方案7】:

        你可以使用

            $hdserial =`wmic DISKDRIVE GET SerialNumber 2>&1` 
        

            $hdserial =`wmic bios get serialnumber 2>&1` 
        

        然后你就可以回显了。

        根据Patrick Daryll Glandien 的提示,您可以在基于 *nix 的机器上执行以下操作。 $hdserial=hdparm -I /dev/hda

        hdparm -i /dev/sda 返回较少的信息。但是由于 hdparm 需要 root 访问权限,所以它没有为我运行 php。

        '2>&1' 部分用于suggestion here

        【讨论】:

        • 这个答案被 wmic 部分接受here
        • 这和我的回答一样,仅仅 3 年后......它不被接受的原因是问题发布者要么没有正确的 wmic 命令(因为他没有专业) 或者硬盘没有给操作系统提供序列号。
        • @OIS 你的意思是说我只是复制了你的答案?
        • 是的。您的 bios 示例是错误的,您的 unix 示例超出了范围。
        • 没有明显的理由可以这么说。我仅将其视为您的意见。 :)
        【解决方案8】:

        试试这段代码,它工作正常。

        <?php
           function GetVolumeLabel($drive) {
               // Try to grab the volume name
               if (preg_match('#Volume Serial Number is (.*)\n#i', shell_exec('dir '.$drive.':'), $m)) {
                  $volname = ' ('.$m[1].')';
               } else {
                   $volname = '';
               }
           return $volname;
        }
        
        $serial = str_replace("(","",str_replace(")","",GetVolumeLabel("c")));
        echo $serial;
        
        ?>
        

        【讨论】:

          【解决方案9】:

          在基于 *nix 的机器上,您也可以使用 ls /dev/disk/by-id/,因为 hdparm 需要 root 权限(请参阅 Patrick Daryll G. 答案)。

          <?php
          exec($command.' 2>&1', $output);
          echo 'HDD: '.$output[0].'<br>';
          
          $outputs = explode('_', $outputs[0]);
          $outputs = end($outputs);
          echo 'HDD-SN: '.$output.'<br>';
          

          你会得到这样的东西

          HDD: ata-HGST_XXX1234567890XX_ABCD123456789X  // <connection>-<hdd_model>_<hdd_sn>
          HDD-SN: ABCD123456789X  // Your HDD Serial Number
          

          【讨论】:

            猜你喜欢
            • 2011-05-04
            • 2016-08-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-06
            • 2019-03-27
            • 2016-06-10
            相关资源
            最近更新 更多