you should Hash the value that you get regardless. so even if you get that "OEM" message, after you Hash it, it will look like gibberish. depending on the Hash method you may get duplicates

i am protecting my software using some of the old Lazslo code, basically getting a machine fingerprint from the EnvGet variables as well as a CPUinfo() Mcode. the values are then hashed to give a machine fingerprint. its not completely unique, as i've run into a few duplicates, but nothing that really matters. i will look into this WMI stuff

my ahk script then calls a php script on my website, which stores the machine ID. when they purchase a license, i supply them with a random license code, and then i also store that code in the same database. then each time they use the script, it contacts out to the web database to verify the license.

originally i only allowed the software to be installed on 2 machines, which i would save both machine id's in the database. but ive since added a check that allows them to use the software on as many computers as they want, just not simultaneously. upon license check, if the license is already open on another machine, the check fails. i also allow one false positive every X days, incase of a computer crash where the license never gets unlocked when they exit

i really should abstract the whole thing out so others can use it. maybe even charge something

you should Hash the value that you get regardless. so even if you get that "OEM" message, after you Hash it, it will look like gibberish. depending on the Hash method you may get duplicates

i am protecting my software using some of the old Lazslo code, basically getting a machine fingerprint from the [c]EnvGet[/c] variables as well as a CPUinfo() Mcode. the values are then hashed to give a machine fingerprint. its not completely unique, as i've run into a few duplicates, but nothing that really matters. i will look into this WMI stuff

my ahk script then calls a php script on my website, which stores the machine ID. when they purchase a license, i supply them with a random license code, and then i also store that code in the same database. then each time they use the script, it contacts out to the web database to verify the license.

originally i only allowed the software to be installed on 2 machines, which i would save both machine id's in the database. but ive since added a check that allows them to use the software on as many computers as they want, just not simultaneously. upon license check, if the license is already open on another machine, the check fails. i also allow one false positive every X days, incase of a computer crash where the license never gets unlocked when they exit

i really should abstract the whole thing out so others can use it. maybe even charge something ;)

I am more interested in the incident rate than I am any given board. From the testing I've done/seen above it does look very likely that it "usually" (probably over 90% of the time) will return a unique value. In That fact it returned "To be filled by O.E.M" by tmplinshi means it won't always be perfect but I'm not looking for perfect.

I am more interested in the incident rate than I am any given board. From the testing I've done/seen above it does look very likely that it "usually" (probably over 90% of the time) will return a unique value. In That fact it returned "To be filled by O.E.M" by tmplinshi means it won't always be perfect but I'm not looking for perfect.

Ah! Got you! Sorry, it was me being thick... You were replying to Joe Glines' original post. I suspect Joe would be interested in make/model (or mainboard) of device that returned To be filled by O.E.M.

Ah! Got you! Sorry, it was me being thick... You were replying to Joe Glines' original post. I suspect Joe would be interested in make/model (or mainboard) of device that returned [c]To be filled by O.E.M.[/c]

Joe Glines wrote:BTW- I borrowed & tweaked my code from that original post but I can't claim to understand a lick of it (nor can I follow yours) Could you go back and annotate it to help me understand what they are doing?

I'm sure someone will correct me if I'm wrong but, to me, all this means is to run a WMI query against the Win32_BaseBoard collection and return the result for the object named SerialNumber. If you use Scriptomatic it will show you every available object available for each collection. Sorry, I don't use WMI often enough to have found a better tool... although I'm sure one or more exists.

Similarly, all this means is run a WMI query against all Win32_NetworkAdapterConfiguration collections that have IPEnabled set to True and return the result for the object named MACAddress. This way it will catch the active network adaptor and ignore inactive or pseudo/virtual adapters.

WMI can sometimes be a little flaky, especially now that PowerShell has gained such a foothold (which is why I've been playing with wrapping PowerShell cmdlets in AHK). Whilst PowerShell still supports WMI cmdlets, some WMI classes have been deprecated and I guess this trend will continue. Have a read of this CIM vs. WMI CmdLets – The top reasons I changed over article (http://maikkoster.com/cim-vs-wmi-cmdlets-the-top-reasons-i-changed/). On the other hand, most WMI queries will remain for some time... and only MS can tell us how long that will be.

Hope this helps...

[quote="Joe Glines"]BTW- I borrowed & tweaked my code from that original post but I can't claim to understand a lick of it (nor can I follow yours) Could you go back and annotate it to help me understand what they are doing? :oops:[/quote]ROFL. I've seen some of your posts on [url]http://the-automator.com/[/url] and you're streets ahead of me!

For creating WMI queries from scratch I still tend to use the [b]Scriptomatic V2 for Win 7[/b] HTA to construct the initial query then check out [b]AHK - WMI - Snippets[/b] ([url]https://autohotkey.com/boards/viewtopic.php?f=6&t=51&hilit=WMI[/url]) to see whether I have the AHK code right.

[code]While (ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\" . A_ComputerName . "\root\cimv2").ExecQuery("Select * From Win32_BaseBoard")._NewEnum)[objMBInfo] MsgBox % objMBInfo["SerialNumber"][/code]I'm sure someone will correct me if I'm wrong but, to me, all this means is to run a WMI query against the [c]Win32_BaseBoard[/c] collection and return the result for the object named [c]SerialNumber[/c]. If you use [b]Scriptomatic[/b] it will show you every available object available for each collection. Sorry, I don't use WMI often enough to have found a better tool... although I'm sure one or more exists.

[code]objWMIService := ComObjGet("winmgmts:{impersonationLevel = impersonate}!\\.\root\cimv2")colItems := objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")._NewEnumwhile colItems[objItem] if objItem.IPAddress[0] = A_IPAddress1 MsgBox % objItem.MACAddress[/code]Similarly, all this means is run a WMI query against all [c]Win32_NetworkAdapterConfiguration[/c] collections that have [c]IPEnabled[/c] set to [c]True[/c] and return the result for the object named [c]MACAddress[/c]. This way it will catch the [u]active[/u] network adaptor and ignore inactive or pseudo/virtual adapters.

WMI can sometimes be a little flaky, especially now that [b]PowerShell[/b] has gained such a foothold (which is why I've been playing with wrapping PowerShell cmdlets in AHK). Whilst [b]PowerShell[/b] still supports WMI cmdlets, some WMI classes have been deprecated and I guess this trend will continue. Have a read of this [b]CIM vs. WMI CmdLets – The top reasons I changed over[/b] article ([url]http://maikkoster.com/cim-vs-wmi-cmdlets-the-top-reasons-i-changed/[/url]). On the other hand, most WMI queries will remain for some time... and only MS can tell us how long that will be.

Agreed. The target market i'm planning to appeal to are non-programmers so it probably wouldn't matter.

BTW- I borrowed & tweaked my code from that original post but I can't claim to understand a lick of it (nor can I follow yours) Could you go back and annotate it to help me understand what they are doing?

Agreed. The target market i'm planning to appeal to are non-programmers so it probably wouldn't matter.

BTW- I borrowed & tweaked my code from that original post but I can't claim to understand a lick of it (nor can I follow yours) Could you go back and annotate it to help me understand what they are doing? :oops:

On a HP 6005 Pro desktop I get an ID.On a Dell 490 tower I get an ID prefixed by 2 commas.On a Dell Latitude E7440 laptop I get an ID with a forward slash at both the beginning and end.On a VMWare VM I get a null (as I would expect. )

Hope this helps...

PS - As the results appear to be variable, have you considered using the ethernet adaptor MAC address (which at least has fewer variations in string composition)?

On a HP 6005 Pro desktop I get an ID.On a Dell 490 tower I get an ID prefixed by 2 commas.On a Dell Latitude E7440 laptop I get an ID with a forward slash at both the beginning and end.On a VMWare VM I get a null (as I would expect. :) )

Hope this helps...

PS - As the results appear to be variable, have you considered using the ethernet adaptor MAC address (which at least has fewer variations in string composition)?

I've got some software that I'm hopeful I will get people willing to pay for. As with most things, trying to make them "100% safe" is not realistic. (locks on homes keep out the 98% of people that will try the handle and then move on).

I'm taking this approach for my software license in that I want to have a very basic, easy to implement, license that will stop most of the honest people.

For this reason I decided to get a "hardware footprint" to tie to a given customer's email address. I reviewed this thread on WMI tasks https://autohotkey.com/boards/viewtopic.php?t=1976 and created the below code which should grab a given computer's motherboard Serial number. I've tried it on 6 computers so far and it reliably pulled back a value. I'd LOVE to have a better idea of the ratio it will pull back a value instead of returning a Null.

If you're willing, please run the below code and let me know if it displayed an id or a null (I don't need to see the value)

I've got some software that I'm hopeful I will get people willing to pay for. :) As with most things, trying to make them "100% safe" is not realistic. (locks on homes keep out the 98% of people that will try the handle and then move on).

I'm taking this approach for my software license in that I want to have a very basic, easy to implement, license that will stop most of the honest people.

For this reason I decided to get a "hardware footprint" to tie to a given customer's email address. I reviewed this thread on WMI tasks https://autohotkey.com/boards/viewtopic.php?t=1976 and created the below code which should grab a given computer's motherboard Serial number. I've tried it on 6 computers so far and it reliably pulled back a value. I'd [b]LOVE[/b] to have a better idea of the ratio it will pull back a value instead of returning a Null.

If you're willing, please run the below code and let me know if it displayed an id or a null (I don't need to see the value)