请教如何在sql 2000上用代码获得本机的硬盘和主板的序列号(100分)

  • 主题发起人 主题发起人 xej
  • 开始时间 开始时间
X

xej

Unregistered / Unconfirmed
GUEST, unregistred user!
本人用delphi 6做为前台,sql 2000做为后台。请教如何用delphi6的代码或sql 2000方法获得本机的硬盘和主板的序列号
 
获取硬盘序列号: <br>function GetHardDiskSerial(const DriveLetter: Char): string; <br>var <br>&nbsp;NotUsed: &nbsp; &nbsp; DWORD; <br>&nbsp;VolumeFlags: DWORD; <br>&nbsp;VolumeInfo: &nbsp;array[0..MAX_PATH] of Char; <br>&nbsp;VolumeSerialNumber: DWORD; <br>begin <br>&nbsp;GetVolumeInformation(PChar(DriveLetter + ':/'), <br>&nbsp; &nbsp;nil, SizeOf(VolumeInfo), @VolumeSerialNumber, NotUsed, <br>&nbsp; &nbsp;VolumeFlags, nil, 0); <br>&nbsp;//Result := Format('Label=%sVolSer = %8.8X', <br>&nbsp;Result := Format('%sVolSer=%8.8X', <br>&nbsp; &nbsp;[VolumeInfo, VolumeSerialNumber]) <br>end; <br>procedure TForm1.Button1Click(Sender: TObject); <br>begin <br>edit1.text:=GetHardDiskSerial('c'); <br>end;
 
uses SHA1, Base64; <br><br>function GetHashedBiosInfo: string; <br>var <br>SHA1Context: TSHA1Context; <br>SHA1Digest: TSHA1Digest; <br>begin <br>// Get the BIOS data <br>SetString(Result, PChar(Ptr($F0000)), $10000); <br>// Hash the string <br>SHA1Init(SHA1Context); <br>SHA1Update(SHA1Context, PChar(Result), Length(Result)); <br>SHA1Final(SHA1Context, SHA1Digest); <br>SetString(Result, PChar(@SHA1Digest), sizeof(SHA1Digest)); <br>// Return the hash string encoded in printable characters <br>Result := B64Encode(Result); <br>end; <br><br><br>function GetBiosInfoAsText: string; <br>var <br>p, q: pchar; <br>begin <br>q := nil; <br>p := PChar(Ptr($FE000)); <br>repeat <br>if q &lt;&gt; nil then begin <br>if not (p^ in [#10, #13, #32..#126, #169, #184]) then begin <br>if (p^ = #0) and (p - q &gt;= 8) then begin <br>Result := Result + TrimRight(String(q)) + #13#10; <br>end; <br>q := nil; <br>end; <br>end else <br>if p^ in [#33..#126, #169, #184] then <br>q := p; <br>inc(p); <br>until p &gt; PChar(Ptr($FFFFF)); <br>Result := TrimRight(Result); <br>end; <br><br>procedure TForm1.FormCreate(Sender: TObject); <br>begin <br>Memo1.Lines.Text := GetBiosInfoAsText; <br>end; <br><br>SHA1, Base64这两个单元可以在这里下载到<br>http://www.latiumsoftware.com/en/articles/00005.php
 
获取硬盘物理序列号的代码参见:<br>http://www.2ccc.com/article.asp?articleid=979<br>盒子这个站上这样的资源很多,我觉得这个最好,支持串口硬盘,而且完全是源码(当然其他的也可参考)<br>主板、网卡什么的也有。<br>至于取服务器的硬盘ID等,可以考虑把myfun中的代码改写,做成一个SQL Server的扩展存储过程(DLL),这样就可以在客户端获取了,具体的请你查一下资料,只是目前对于服务器常用的SCSI硬盘,好象办法不多!
 
用SQL的我還沒有看過,有誰有?
 
写成扩展存储过程,在sql里调用
 
来自:yhy0371, 时间:2008-3-6 22:06:42, ID:3878209 <br>写成扩展存储过程,在sql里调用<br>&nbsp;<br>有写过没?
 
&gt;&gt;写成扩展存储过程,在sql里调用<br>这一条一点都不难,资料很多,网上一搜一大堆<br>&nbsp; &nbsp; 难的在于SQL SERVER一般都安装在专用的server上,这种server都是SCSI硬盘,有的还使用了各种阵列,取得序列号还必须对阵列卡进行底层访问,且据说SCSI硬盘是没有硬件序列号的!<br>&nbsp; &nbsp; 另外,必须注意到我们能找到的都是依据IDE的标准来获取的,又据说某些品牌的IDE硬盘序列号是空串或空格串,且SATA标准好象也是没有序列号的,当然常用的SATA是在BIOS中仿真成IDE的,这时多数可以取得序列号。<br>&nbsp; &nbsp; 综上所说,取得服务器的硬盘序列号实在不是一个好主意。建议方案:<br>1、完全采用客户端加密,反正网络版的价格也有一个用户数量的因素在内;<br>2、采用软件狗、网卡MAC、CPU ID、BIOS信息等等其他方式(当然也可以结合硬盘ID)
 
晕,LZ还在天天顶[:D]
 

Similar threads

回复
0
查看
589
不得闲
回复
0
查看
795
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部