開發了一個程式,希望安裝到每臺電腦上時獲取機器碼,以此作為密碼對程式進行保護,請教各位大神,這個方法可行嗎?代碼怎么寫呢?
uj5u.com熱心網友回復:





uj5u.com熱心網友回復:





uj5u.com熱心網友回復:
[機器碼]硬碟序列號格式化后會自動變的,沒用的uj5u.com熱心網友回復:
Mac地址是不可改變的。不過查不到獲取的方法。uj5u.com熱心網友回復:
你所謂的機器碼,可能有CPU序列號,硬碟序列號,等等,一般保護程式,使用硬碟序列號的比較多,一個硬碟有一個唯一的序列號,如果不更換硬碟,硬碟序列號是不會發生變化的,樓上說的格式化后硬碟序列號會變化是不正確的。獲取硬碟序列號可以使用API函式獲取,獲取后,你得到這個序列號,然后按這個序列號授權就可以了。
uj5u.com熱心網友回復:
Public Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As LongPublic Function GetVolumeSerialNumber(ByVal RootPath As String) As String
Dim lpszVolumeNameBuffer As String
Dim lpszFileSystemNameBuffer As String
Dim lVolumeNameSize As Long
Dim lpVolumeSerialNumber As Long
Dim lpMaximumComponentLength As Long
Dim lpFileSystemFlags As Long
Dim nFileSystemNameSize As Long
Dim lRetVal As Long
lpVolumeSerialNumber = 0
lpMaximumComponentLength = 0
lpFileSystemFlags = 0
lpszVolumeNameBuffer = Space$(255)
lpszFileSystemNameBuffer = Space(255)
lVolumeNameSize = Len(lpszVolumeNameBuffer)
nFileSystemNameSize = Len(lpszFileSystemNameBuffer)
lRetVal = GetVolumeInformation(RootPath,lpszVolumeNameBuffer, lVolumeNameSize,lpVolumeSerialNumber,lpMaximumComponentLength, lpFileSystemFlags,lpszFileSystemNameBuffer, nFileSystemNameSize)
GetVolumeSerialNumber = Hex$(lpVolumeSerialNumber)
End Function
使用這段代碼試了一下,獲得的應該是卷的序列號,這個序列號不唯一,在三臺電腦上試了,其中兩臺的卷序列號重復。
請教:硬碟序列號怎么獲得呢?
uj5u.com熱心網友回復:
Dim cpuSetDim cpu
Dim a,i
Set cpuSet = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_Processor")
For Each cpu In cpuSet
a = (cpu.ProcessorId)
Next
msgbox "cpu序列號為:" & a
這個方法獲得的cpu序列號也不是唯一的。
uj5u.com熱心網友回復:
Dim DriveID As ObjectDim mySerial
Set driveID=createObject("Scripting.FileSystemObject")
mySerial=DriveID.GetDrive("C").SerialNumber
msgbox mySerial
Dim PcName As String
Dim a As Object
Set a=createObject("Wscript.NetWork")
PcName=a.Computername
msgbox Pcname
這樣可以獲得C盤序列號和電腦名,電腦名唯一,但是可以更改。C盤序列號不唯一,有兩臺電腦的C盤序列號一樣。
以上方法都不行。
求各位高手賜教!
uj5u.com熱心網友回復:
既然單個硬體序列有可能不是唯一,那你用累計的方式來啊,CPU+硬碟+mac地址等,不同組合,選擇一種,生成一個字串作為序列號就是uj5u.com熱心網友回復:
常數+常數+變數=變數,關鍵還是在于這個變數。不知道我的理解對不對。
或者換個思路,用其他方式保護。
uj5u.com熱心網友回復:
硬碟ID、CPU ID、MAC地址都是變數,不可能找出兩臺完全一樣的來,所以多加幾個變數,得出來的變數,肯定結果就是完全不同的,就不用擔心了
uj5u.com熱心網友回復:
用CPUID+BIOS序列號,這2個是固定不變的,WMI就可以獲取。uj5u.com熱心網友回復:
1、本來CPU是有序列號的,但被生產廠家禁止,要獲取CPU序列號,需要授權,這個想都不要想,獲取這個都是用來干壞事的,所以授權幾乎不可能,廠家為什么要禁止,其實也有道理的。2、如果要考慮用機器碼,一般用用CPUID+BIOS序列號+BIOS版本就可以了,不要用硬碟序列號,要允許用戶更換硬碟。MAC地址也不要用,要允許人家更換網卡。CPU和主板一般不會更換,如果要更換就等于買新電腦了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/7367.html
標籤:VB基礎類
上一篇:請問如何 將一個整數 按壓縮BCD碼存入一個陣列和 將 存入陣列的壓縮BCD碼還原成 整數
下一篇:VB資料庫查詢功能無法實作
