如何在SQL中获取硬盘序列号与网卡地址

blackcolor 2001-12-13 02:58:20
一个可以用来在SQL Server中取硬盘ID、网卡地址(MAC)的小工具。可以在查询分析器、存储过程、PB、VB、VFP等前端工具取得服务器硬盘的序列号和服务器网卡的地址。
下载:http://liliacsying.top263.net/
...全文
414 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ylhylhylh 2001-12-14
  • 打赏
  • 举报
回复
说得对!
不过读取硬盘序列号可以用VXD来实现,在WINDOWS平台上的话,可以绕过4级保护模式!
至于VXD怎么做得查相关手册了
blackcolor 2001-12-14
  • 打赏
  • 举报
回复
呵呵,MSDN上面明明写着是volume,
The GetVolumeInformation function returns information about a file system and volume whose root directory is specified
如果一个硬盘分成几个区那么每个区的volume serial number是不一样的,
而硬盘的出厂ID则是不变的,而且与硬盘的分区没有关系,还有的硬盘根本没有出厂ID,
取硬盘的出厂ID目前没有任何一个API可以做到的
ylhylhylh 2001-12-14
  • 打赏
  • 举报
回复
你第二点说的对!但第一点不对!应该就是序列号,每个硬盘都是唯一的!可以用这个号来加密软件!
blackcolor 2001-12-13
  • 打赏
  • 举报
回复
1.GetVolumeInformation取得的是卷标而不是硬盘的出厂序列号
2.客户端PB不能取得SQL Server上硬盘的序列号,只能取自己本机的序列号
ylhylhylh 2001-12-13
  • 打赏
  • 举报
回复
要读取硬盘序列号我们可以用汇编来实现,但毕竟不容易,况且也不能有效的结合到PB脚本中。在PB中我们可以通过调用Windows提供的外部函数GetVolumeInformationA()来实现。这相对来说比较简单。

  该函数的原型为:

  BOOL GetVolumeInformation(

  LPCTSTR lpRootPathName,

  LPTSTR lpVolumeNameBuffer,

  DWORD nVolumeNameSize,

  LPDWORD lpVolumeSerialNumber,

  LPDWORD lpMaximumComponentLength,

  LPDWORD lpFileSystemFlags,

  LPTSTR lpFileSystemNameBuffer,

  DWORD nFileSystemNameSize

  上述原型中,参数类型只要是以"LP-"开头的表明该参数用的是长指针(Long Pointer)类型,即在PB中调用时的参数传递是通过引用传递。在8个参数中对我们真正有用的只有两个LPCTSTR lpRootPathName和LPDWORD lpVolumeSerialNumber。其中参数lpRootPathName是指向文件系统根目录的地址,我们需要用它来指明所要获取序列号的硬盘盘符;参数lpVolumeSerialNumber是返回的硬盘序列号的地址,这正是我们需要的。

  众所周知,PB在调用任何外部函数前都要首先进行函数声明,可以将声明放在全局或局部函数声明中。具体声明如下:

  Function Boolean GetVolumeInformationA( &

  ref String ls_Rootpath, &

  ref String ls_volumnename, &

  Ulong lul_VolumeNameSize, ref Ulong lul_VolumeSerialNumber, &

  ref Ulong lul_MaximumComponentLength, &

  ref Ulong lul_FileSystemFlags, &

  ref String ls_FileSystemNameBuffer, &

  Ulong lul_FileSystemNameSize &

  ) Library "Kernel32.dll"



  上述声明中,"ref"指明是该参数是通过引用传递的,有关函数引用的详细内容请参见有关教程。声明完毕我们不能马上进行调用,还必需确保已为它分配足够的内存空间,即使是参数引用传递也是这样,否则的话将会出现调用错误,这跟C语言的引用调用不同,这一点往往被忽视,希望读者能够注意。也就是为什么我在调用该函数前将有些字符串参数给它预先分配了多达256个字符空间以及给一些整型类型的参数赋初始值256。完整的读取硬盘序列号的程序代码如下:

/******************* 程序代码 ************************/

String ls_Rootpath, ls_volumnename

ls_Rootpath = "C:" // 指定要得到序列号的硬盘,

// 一般情况都是C盘,除非你能保证用户存在其它逻辑盘或物理盘

ls_volumnename = Space(256) // 分配足够的空间,下同

Ulong lul_VolumeNameSize

lul_VolumeNameSize = 256

Ulong lul_VolumeSerialNumber, lul_MaximumComponentLength, lul_FileSystemFlags

lul_MaximumComponentLength = 256

String ls_FileSystemNameBuffer

ls_FileSystemNameBuffer = space(256)

Ulong lul_FileSystemNameSize

lul_FileSystemNameSize = 256

beep(1)

boolean lb_rtn

lb_rtn = False

lb_rtn = GetVolumeInformationA(ls_Rootpath, ls_volumnename, lul_VolumeNameSize,

lul_VolumeSerialNumber, lul_MaximumComponentLength, lul_FileSystemFlags,

ls_FileSystemNameBuffer, lul_FileSystemNameSize)

if lb_rtn = true then

MessageBox("提示","函数调用成功!")

else

MessageBox("提示","函数调用失败!")

end if

sle_1.text = String(lul_VolumeSerialNumber) // 得到硬盘序列号

397

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧