5

通过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 机器上,该命令无法识别。

4

9 回答 9

8

以下返回磁盘序列号。应该使用多个驱动器,您只会得到多个结果。只需使用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 的专业版。

于 2009-04-02T11:14:09.423 回答
5

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

您将不得不

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

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

于 2009-04-02T10:10:37.457 回答
2
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

那是你要找的吗?

于 2009-04-02T10:08:31.063 回答
1

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

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

于 2009-04-02T10:09:28.333 回答
1

使用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
于 2017-10-07T21:09:32.543 回答
0

在基于 *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
于 2014-11-05T07:30:58.323 回答
0

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

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

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

于 2009-04-02T10:07:14.577 回答
0

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

<?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;

?>
于 2014-06-09T11:44:53.263 回答
0

您可以使用

    $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' 部分是从这里的建议中使用的。

于 2012-12-10T12:16:42.060 回答