通过PHP获取制造商提供的硬盘序列号
正在获取硬盘驱动器的序列号 由制造商通过PHP提供: 怎样才能做到呢? 我想把它存储在一个文件中 操作系统:windows 2000、XP、ME、Vista 是的,我想要服务器硬盘驱动器的序列号。 或者可以通过AdobeAIR完成? 或者可以通过Windows上的C程序来完成通过PHP获取制造商提供的硬盘序列号,php,hard-drive,serial-number,Php,Hard Drive,Serial Number,正在获取硬盘驱动器的序列号 由制造商通过PHP提供: 怎样才能做到呢? 我想把它存储在一个文件中 操作系统:windows 2000、XP、ME、Vista 是的,我想要服务器硬盘驱动器的序列号。 或者可以通过AdobeAIR完成? 或者可以通过Windows上的C程序来完成 C:\Documents and Settings\Administrator>dir Volume in drive C has no label. Volume Serial Number is BC16-5
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
在my Vista计算机上仅显示以下文本:
序列号
在我的XP计算机上,该命令无法识别。您希望硬盘驱动器来自服务器还是客户端? PHP在服务器上运行,所以直接从客户端获取PHP对我来说似乎是不可能的 手册建议您可以在服务器上执行以下命令: 不幸的是,我没有足够的Unix为您提供hdd系列
hdparm -i /dev/sdX
这是在linux上,但不确定在windows上。您可以通过“system()执行该操作”
看看
这可能是一个前进的方向
另外,当我在命令提示符下运行“dir”时,它显示:
C:\Documents and Settings\Administrator>dir
Volume in drive C has no label.
Volume Serial Number is BC16-5D5F
这就是你想要的吗?我不能告诉你答案,但我想你必须朝着扩展的方向看(甚至可能自己写一个)。我怀疑这是PHP的核心所具备的
编辑:我忘记了“exec”的原始功能:-/PHP本身无法访问那样的硬件 你要么
- 使用操作系统的命令,并使用
或system()
exec()
- 为PHP编写一个扩展,它将返回信息
如果您在Linux上并且拥有必要的特权和配置,那么可以使用
$r=system(“hdparm-I/dev/hda”)代码>(将hda替换为您的hd)以获取给定硬盘驱动器的序列号。以下返回磁盘序列号。如果使用多个驱动器,您将得到多个结果。用它来运行它
wmic.exe位于windows system32文件夹中。wmic确实存在于WinXP上,我自己也在那里使用过
我在Vista上的结果:
C:\Windows\System32>wmic DISKDRIVE GET SerialNumber
SerialNumber
20202020202054534241354c4*snip*
我不知道是否所有硬盘都向操作系统提供了序列号
wmic命令似乎只在Windows XP、Windows Vista和Windows 7的专业版本上可用 您可以使用
$hdserial =`wmic DISKDRIVE GET SerialNumber 2>&1`
或
然后你可以回应它
根据的提示,您可以在基于*nix的机器上执行以下操作。
$hdserial=hdparm-I/dev/hda
hdparm-i/dev/sda
返回较少的信息。但由于hdparm需要根访问权限,所以我没有使用php运行它
“2>&1”部分是从中使用的。请尝试此代码,因为它工作正常
<?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;
?>
在基于*nix的机器上,您也可以使用ls/dev/disk/by id/
,因为hdparm
需要root权限(请参阅答案)
使用运行以下操作(如果需要,在命令提示符下进行测试):
DISKDRIVE没有获取通过IDE通道插入的驱动器的实际序列号。上面的内容似乎得到了我所有驱动器的实际序列号。标签还将返回驱动器的类型,这可能有助于识别不同的驱动器
示例输出:
SerialNumber Tag
WD-WX55D33JQNZ4 \\.\PHYSICALDRIVE4
S1OKIJNH938475 \\.\PHYSICALDRIVE0
WD-CV44HJ5L765Y \\.\PHYSICALDRIVE1
WD-WX41D65SD1UU \\.\PHYSICALDRIVE2
WD-WXB1SD3OIJHG \\.\PHYSICALDRIVE3
\\.\CDROM0
该卷(即分区)序列号。该编号BC16-5d5f对于硬盘驱动器是唯一的吗?顺便说一句,这个数字是如何生成的,它与制造商给定的序列号有何不同?这个数字对硬件没有用处。这只是格式化驱动器时分配给卷的软件序列号。我的研究得出结论,wmic在Windows XP Professional上,而不是Windows XP Home上。你带在家里了吗?我正在寻找一种方法来获取一些信息,我想使用WMIC。@coding\u在我的Windows 7 Home Premium(64位)副本上就是这样做的。只需打开CLI窗口并键入上面的命令。wmic部件已接受此答案。这与我的答案相同,仅3年后。。。不被接受的原因是问题海报没有正确的wmic命令(因为他没有专业版),或者hdd没有给操作系统序列号。@OIS你的意思是我只是复制了你的答案吗?是的。您的bios示例是错误的,而您的unix示例超出了范围。您没有明显的理由可以这么说。我认为那只是你的意见您没有得到答案的原因是,您的特定硬盘驱动器未向操作系统提供此信息或已损坏。为了避免root访问,我们还提供了ls/dev/disk/by id/
see;)
<?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;
?>
<?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
wmic path win32_physicalmedia get Tag,SerialNumber
SerialNumber Tag
WD-WX55D33JQNZ4 \\.\PHYSICALDRIVE4
S1OKIJNH938475 \\.\PHYSICALDRIVE0
WD-CV44HJ5L765Y \\.\PHYSICALDRIVE1
WD-WX41D65SD1UU \\.\PHYSICALDRIVE2
WD-WXB1SD3OIJHG \\.\PHYSICALDRIVE3
\\.\CDROM0