通过WMI获取根据盘符获取U盘物理序列号Word下载.docx
《通过WMI获取根据盘符获取U盘物理序列号Word下载.docx》由会员分享,可在线阅读,更多相关《通过WMI获取根据盘符获取U盘物理序列号Word下载.docx(36页珍藏版)》请在冰豆网上搜索。
1解密步骤
3.打开文件xxxx_private.ukey,读入50*10个可见字符,标为串3;
5.打开文件xxxx_private.ukey,读取MD5值;
6.比较计算的和读取的MD5值是否相同,相同则通过验证,否则失败。
2JavaScript读取U盘物理序列号(推荐方案3)
准备
1读取U盘盘符
/**
*判断是否有U盘并获取U盘盘符,只适用于IE?
*@returns{string}返回U盘盘符
*@constructor
*/
functionCheckUsb(){
vare,x;
varForReading=1,
RorWriting=2;
varbfResult='
'
;
try{
varfso=newActiveXObject("
Scripting.FileSystemObject"
);
}catch(err){
returnbfResult;
}
e=newEnumerator(fso.Drives);
for(;
!
e.atEnd();
e.moveNext()){
x=e.item();
if(x.DriveType==1){
if(x.Path!
="
A:
"
){
bfResult+=x.Path+'
'
}
方案1:
根据WMI的Win32_USBHub读取U盘物理序列号
缺陷:
无法根据盘符一对一获取U盘物理序列号
缺陷说明:
此方法获取的intCount,及U盘迭代index跟注册表中的键对应
注册表键地址:
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum\\"
+(intCount+1)
次部分键对应的值的注册表地址为:
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Enum\\USBSTOR\\"
+值
在此处可以查看U盘的物理序列号,可验证获取的是否正确。
点击物理序列号会出现右侧:
其键ParentIdPrefix对应的即盘符信息。
盘符信息注册表地址:
HKEY_LOCAL_MACHINE\\SYSTEM\\MountedDevices"
需要将ParentIdPrefix转换成十六进制,并在此处与值查询,获得的键即盘符信息。
参考地址:
出错场景:
当有多个U盘,第一次可能会通过,比如有G,I,H三个盘,此时根据注册顺序分别为1,2,3;
如果在验证过程中将G盘拔出,此时I,H盘的顺序为1,2;
再插入G盘进行验证,此时G盘顺序为3;
但是准备部分获取的U盘盘符顺序为G,I,H,此时迭代的盘符index或获取到I盘的物理序列号,导致验证失败。
读取U盘物理序列号
迭代准备部分获取的U盘盘符,并将盘符和迭代index传入此方法,获取物理序列号
*根据盘符获取物理序列号
*@paramdrivepath盘符
*@paramintCount轮询获取次数
*@returns{*}返回盘符与物理序列号字符串,格式:
G:
XXXXXXXXXXXXXX
functionReadUsbSnEach(drivepath,intCount){
varproperties=service.ExecQuery("
SELECT*FROMWin32_USBHub"
//Win32_USBHub所有属性说明:
vare=newEnumerator(properties);
varcount=0;
varp=e.item();
varsn=p.DeviceID;
//1:
GenericUSBHub;
2:
USBRootHub;
3:
USBMassStorageDeviceUSB大容量存储设备
//ConfigManagerErrorCode=0Deviceisworkingproperly.
//因每个盘的Name不同,这里只判断英文和中文两种,超过的U盘将不被验证通过
if(p.Name=="
USBMassStorageDevice"
||p.Name=="
USB大容量存储设备"
count=count+1;
if(count==intCount+1){
//&
p.ConfigManagerErrorCode==0
if((p.Name=="
)){
strSN+=GetUsbSN(sn);
//alert(drivepath+"
------"
+count+"
-----"
+p.Name+"
+strSN);
returnstrSN;
Win32参考地址:
物理序列号处理:
*分解通过注册表获取的值或其他方式获取同样的值,只取物理序列号即可
*@paramsn通过注册表获取的值或其他方式获取的同格式的值
*@returns{*}物理序列号
functionGetUsbSNByReg(sn)
{
varUsbSN;
varstrSN=sn;
vararraySN=newArray();
if(strSN.indexOf("
&
)>
0){
arraySN=strSN.split("
\\"
if(arraySN.length>
2){
UsbSN=arraySN[2].split(("
))[0];
}else{
UsbSN="
returnUsbSN;
方案3:
根据注册表读取U盘物理序列号
参考方案1缺陷对应部分
*通过注册表获取物理序列号
*@paramintCount盘符index
*@returns{string}
functionReadUsbSnEachByReg(drivepath,intCount){
varsn="
varobj=newActiveXObject("
WScript.Shell"
vars="
+(intCount+1);
varsNic=obj.RegRead(s);
//USBSTOR\Disk&
Ven_Kingston&
Prod_DT_101_G2&
Rev_5.00\1401051502351655498409&
sn=drivepath+GetUsbSNByReg(sNic);
}catch(e){
returnsn;
方案2:
根据WMI的其他Win32方法读取U盘物理序列号
其他Win32方法
(Win32_LogicalDisk,Win32_LogicalDiskToPartition,Win32_DiskDriveToDiskPartition,Win32_DiskDrive)
*@paramintCount轮询获取次数目前无用,保留,注释的Win32_USBHub方式获取有使用到
*@returns{*}返回盘符与物理序列号字符串,格式:
varstrSN=drivepath;
//存放序列号
varlocator=newActiveXObject("
WbemScripting.SWbemLocator"
varservice=locator.ConnectServer("
."
varlogical_disk_query="
selectDeviceId,CreationClassName,SystemNamefromWin32_LogicalDiskwhereCaption='
+drivepath+"
varlogical_disk_property=service.ExecQuery(logical_disk_query);
varlogical_disk_Enum=newEnumerator(logical_disk_property);
logical_disk_Enum.atEnd();
logical_disk_Enum.moveNext()){
varlogical_disk_item=logical_disk_Enum.item();
vardependent="
//"
+logical_disk_item.SystemName+"
/root/cimv2:
+logical_disk_item.CreationClassName+"
.DeviceID='
+logical_disk_item.DeviceId+"
varlogical_disk_to_part_query="
selectAntecedent,DependentfromWin32_LogicalDiskToPartitionwhereDependent=\"
+dependent+"
\"
varlogical_disk_to_part_property=service.ExecQuery(logical_disk_to_part_query);
varlogical_disk_to_part_Enum=newEnumerator(logical_disk_to_part_property);
logical_disk_to_part_Enum.atEnd();
logical_disk_to_part_Enum.moveNext()){
varlogical_disk_to_part_item=logical_disk_to_part_Enum.item();
vardependent=logical_disk_to_part_item.Antecedent.replace(/\\/g,"
/"
vardisk_drive_to_part_query="
selectAntecedent,DependentfromWin32_DiskDriveToDiskPartitionwhereDependent='
vardisk_drive_to_part_property=service.ExecQuery(disk_drive_to_part_query);
vardisk_drive_to_part_Enum=newEnumerator(disk_drive_to_part_property);
disk_drive_to_part_Enum.atEnd();
disk_drive_to_part_Enum.moveNext()){
vardisk_drive_to_part_item=disk_drive_to_part_Enum.item();
vardisk_drive_query="
selectSystemName,CreationClassName,DeviceID,PNPDeviceIDfromWin32_DiskDrivewhereinterfaceType='
USB'
vardisk_drive_property=service.ExecQuery(disk_drive_query);
vardisk_drive_Enum=newEnumerator(disk_drive_property);
disk_drive_Enum.atEnd();
disk_drive_Enum.moveNext()){
vardisk_drive_item=disk_drive_Enum.item();
\\\\"
+disk_drive_item.SystemName+"
\\root\\cimv2:
+disk_drive_item.CreationClassName+"
.DeviceID=\"
+disk_drive_item.DeviceId.replace(/\\/g,"
)+"
if(disk_drive_to_part_item.Antecedent==dependent){
varsn=GetUsbSNByReg(disk_drive_item.PNPDeviceID);
returnstrSN+sn;
returnstrSN;
代码解析:
此处使用《WMI资源浏览器.exe》显示查看个方法获取的数据
下载地址:
步骤1:
1通过盘符在Win32_LogicalDisk中获取三个字段DeviceId,CreationClassName,SystemName
2处理此三个字段为符合Win32_LogicalDiskToPartition格式的串
步骤2:
1将步骤1中处理的串当成步骤2Dependent的值查询两个字段Antecedent,Dependent
2处理字段Antecedent为Win32_DiskDriveToDiskPartition合适的串
logical_disk_to_part_item.Antecedent.replace(/\\/g,"
步骤3:
1将步骤2中处理的串当成步骤3Dependent的值查询两个字段Antecedent,Dependent
步骤4:
1查询Win32_DiskDrive出四个字段SystemName,CreationClassName,DeviceID,PNPDeviceID
2将此四个字段按照步骤3中Antecedent的值的格式拼接
3如果两个值相同,则取出步骤3中的Antecedent的值进行处理,处理方法见方案1中的物理序列号处理
4处理后的即根据盘符得到的U盘物理序列号
3按照加密工具加密的步骤进行加密
4与加密工具加密读取出的MD5值比较
5验证成功或失败
四:
完整的JavaScript代码
functioninclude(path){
vara=document.createElement("
script"
a.type="
text/javascript"
a.src=path;
varhead=document.getElementsByTagName("
head"
)[0];
head.appendChild(a);
//include("
./jquery1.3.2.js"
document.write('
<
scripttype=\\"
text/javascript\\"
src=\\"
./jquery1.3.2.js\\"
>
/script>
*读取U盘内文件ipbc_private.ukey内的MD5值和随机串FF存在问题
*@parampathfile文件路径
*@returns{*}返回content_array数组
*[0]为md5值
*[1]为50*10随机串
functionread(pathfile){
varcontent_array=newArray();
if(typeofwindow.ActiveXObject!
='
undefined'
varreader=fso.openTextFile(pathfile,1);
vari=0;
varcontent=