Jump to content

Require a Serial


JohnOne
 Share

Recommended Posts

This is a very very basic example of how to make your program require a serial number.
Your serial number can be most anything you like within reason, it will be encrypted.
The crypted serial for this basic example will be inside your program.

if you want to use this examples serial it is "my serial"
It works like this.

1. Your program looks at a registry key value.
2. if the value does not exist or is wrong, the user will be asked for a serial.
3. if serial is correct, the regkey and value will be written to the registry and user will not be asked again because the next time they run it, the key and value will be there.
4. if serial is wrong, the program simply exits with a message.

This is a simple example and not intended to protect your program from attack/hack or anything else.
You should always be aware that the registry is used by your operating system, and is not to be played with.

Example using registry method

 


First you can make a serial for your program
 
#include <Crypt.au3>

$_InputBox = InputBox("Serial Maker", "Enter a Serial Number")

$AG5InputBox = _Crypt_HashData($_InputBox, $CALG_MD5)

Run("Notepad")
WinWaitActive("Untitled - Notepad")

Do
    ClipPut($AG5InputBox)
Until ClipGet() = $AG5InputBox

ControlSend("Untitled - Notepad", "", "[CLASS:Edit; INSTANCE:1]", "here is what your crypted serial looks like to AutoIt: " & $AG5InputBox & @CRLF)
ControlSend("Untitled - Notepad", "", "[CLASS:Edit; INSTANCE:1]", "And this is the serial you made: " & $_InputBox & @CRLF & _
        " your crypted serial is now in your clipboard, you can paste it wherever you like")

Now use your crypted serial in your program
 

#include <Crypt.au3>

Global  $MyCompanyName = "My Company"
Global  $MyProgramName = "My Program"

$_InputBox = InputBox($MyCompanyName, "Please Enter Serial Number")

$AG5InputBox = _Crypt_HashData($_InputBox, $CALG_MD5) ; this makes the crypt of the serial entered

If $AG5InputBox <> "0x01E9FC1C4E5C0E769F24A89AA3586251" Then ; your crypted serial will replace this, it's where the entered crypt is compared to your crypt
    ; If the wrong serial was entered, this message box will display and your program will exit
    Exit MsgBox(0,0,"Sorry Incorrect Serial")
EndIf

;your program starts here

_StartOfProject()

Func _StartOfProject()
    ; If the correct serial was entered, this message box will display
    MsgBox(0,$MyCompanyName, $MyProgramName)
EndFunc

So now your program will not run unless the user entered the correct serial.
But you don't want your user to have to put a serial in everytime they use your program.
So lets deal with that now.
Your program should first look at a registry entry to see if a correct serial was already entered.
 

#include <Crypt.au3>

Global $MyCompanyName = "My Company"
Global $MyProgramName = "My Program"

Global $_HasUserAlreadyEnteredCorrectSerial = RegRead("HKCU\software\" & $MyCompanyName, $MyProgramName)

If @error Or $_HasUserAlreadyEnteredCorrectSerial <> 1 Then ; you only ask for serial if one was not already entered, else start your program immediately
    $_InputBox = InputBox($MyCompanyName, "Please Enter Serial Number")

    ;;http://www.autoitscript.com/autoit3/docs/libfunctions/_Crypt_HashData.htm
    $AG5InputBox = _Crypt_HashData($_InputBox, $CALG_MD5) ; this makes the crypt of the serial entered

    If $AG5InputBox <> "0x01E9FC1C4E5C0E769F24A89AA3586251" Then ; your crypted serial will replace this, it's where the entered crypt is compared to your crypt
        ; If the wrong serial was entered, this message box will display and your program will exit
        Exit MsgBox(0, 0, "Sorry Incorrect Serial")
    Else
        ;If correct serial is entered you will write 1 to the registry key HKEY_CURRENT_USER\Software\My CompanyMy Program
        ;and the user will not be asked again
        RegWrite("HKCU\software\" & $MyCompanyName, $MyProgramName, "REG_DWORD", 1)
    EndIf

EndIf

;your program starts here

_StartOfProject()

Func _StartOfProject()
    ; If the correct serial was entered, this message box will display
    MsgBox(0, $MyCompanyName, $MyProgramName)
EndFunc   ;==>_StartOfProject

Testing your program and need to delete registry key?
 

$MyCompanyName = "My Company"

RegDelete("HKCU\software\" & $MyCompanyName)

 



Here is an even more basic example using a folder existence method.

 


Example using just a directory to determine if the user has the serial.

It works much like the first but without using the registry.
You should be able to follow it easily having looked at the first.

It checks to see if a folder exists with the same name as your crypted serial, if it does not
it askes for serial, if the serial is correct it creates the folde so the user is not asked again
If user enters incorrect serial, the program exits.
 
#include <Crypt.au3>

Global $MyCompanyName = "My Company"
Global $MyProgramName = "My Program"
Global $MyCryptedSerial = "0x01E9FC1C4E5C0E769F24A89AA3586251"

;http://www.autoitscript.com/autoit3/docs/functions/RegRead.htm
Global $_HasUserAlreadyEnteredCorrectSerial = FileExists (@AppDataCommonDir & "\" & $MyCryptedSerial); Your crypted serial will replace this , it is checking if the folder exists

If Not $_HasUserAlreadyEnteredCorrectSerial Then
    _AskToEnterSerial($MyCryptedSerial) ;Pass crypted serial to function
EndIf

If @error Then
    ; If the wrong serial was entered, this message box will display and your program will exit
    Exit MsgBox(0, 0, "Sorry Incorrect Serial")
EndIf

;your program starts here

_StartOfProject()

Func _StartOfProject()
    ; If the correct serial was entered, this message box will display
    MsgBox(0, $MyCompanyName, $MyProgramName)
EndFunc   ;==>_StartOfProject

Func _AskToEnterSerial($crypt)
    $_InputBox = InputBox($MyCompanyName, "Please Enter Serial Number")
    $AG5InputBox = _Crypt_HashData($_InputBox, $CALG_MD5) ; this makes the crypt of the serial entered
    If $AG5InputBox <> $crypt Then
        ;Set @error and return
        Return SetError(1)
    EndIf
    ;If correct serial is entered you will create the folder
    ;and the user will not be asked again
    Do
        DirCreate(@AppDataCommonDir & "\" & $crypt)
    Until FileExists (@AppDataCommonDir & "\" & $crypt)
EndFunc

Need to delete folder for testing?

DirRemove(@AppDataCommonDir & "\" & $crypt)

 

 

Edited by JohnOne

AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Link to comment
Share on other sites

@JohnOne - Good attempt, but it could be improved greatly (quite simply), by adding in elements that work with a drive serial number for instance or processor detail, username, etc. That way, the encrypted registry info couldn't just be swapped around from PC to PC.

Make sure brain is in gear before opening mouth!
Remember, what is not said, can be just as important as what is said.

Spoiler

What is the Secret Key? Life is like a Donut

If I put effort into communication, I expect you to read properly & fully, or just not comment.
Ignoring those who try to divert conversation with irrelevancies.
If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it.
I'm only big and bad, to those who have an over-active imagination.

I may have the Artistic Liesense ;) to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)

userbar.png

Link to comment
Share on other sites

That's very very very very good of you! muttley

Make sure brain is in gear before opening mouth!
Remember, what is not said, can be just as important as what is said.

Spoiler

What is the Secret Key? Life is like a Donut

If I put effort into communication, I expect you to read properly & fully, or just not comment.
Ignoring those who try to divert conversation with irrelevancies.
If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it.
I'm only big and bad, to those who have an over-active imagination.

I may have the Artistic Liesense ;) to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)

userbar.png

Link to comment
Share on other sites

  • Moderators

@JohnOne - Good attempt, but it could be improved greatly (quite simply), by adding in elements that work with a drive serial number for instance or processor detail, username, etc. That way, the encrypted registry info couldn't just be swapped around from PC to PC.

IMO... Using a single method is going to create more of a headache than it's worth even applying only one of those ( been there, done that ).

My suggestion is to have 5 to 7 items like you suggest.

In the "single" method, if it's correct, great!

However, if the user replaced the hard drive/motherboard/changed bios, whatever you're using, to upgrade their system, now you have to take the time to prove he did ( if you're extreme ), re-issue a valid working serial, log it yourself, etc

Using multiple, you can set your own rules, eg.. if 5 out of 7 are ok, great, probably not sent to VM to be distributed, probably not on another PC, and you've lessened your headache(s) exponentially.

Edited by SmOke_N

Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.

Link to comment
Share on other sites

@SmOke_N - Can only agree, and that's how I would do it, but I was trying to keep it in line with JohnOne's simple theme.

In his scenario, it sounds like the user knows the serial anyway, so all he is doing is saving them a little trouble. If they modify their PC, then they just need to re-enter the serial just once again, so no biggie really. The simplest way of course, is to use the USER name (which is unlikely to change) and the 'C' drive serial number (if that latter changes, then a re-install may be on the cards anyway). I'd then encrypt them along with the serial, separating each element with a pipe. Pretty simple and not ideal against a determined hacker without including some randomness, but should be fine for what he seems to be aiming for ... and certainly a lot more secure than the present state.

Make sure brain is in gear before opening mouth!
Remember, what is not said, can be just as important as what is said.

Spoiler

What is the Secret Key? Life is like a Donut

If I put effort into communication, I expect you to read properly & fully, or just not comment.
Ignoring those who try to divert conversation with irrelevancies.
If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it.
I'm only big and bad, to those who have an over-active imagination.

I may have the Artistic Liesense ;) to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)

userbar.png

Link to comment
Share on other sites

I'd probably just use _WinApi_UniquehardwareID for something like that.

I would as well, with all options.

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

Didn't know that one, but it sounds the way to go.

With that, I'm presuming you can make one or two hardware changes and not affect things.

Make sure brain is in gear before opening mouth!
Remember, what is not said, can be just as important as what is said.

Spoiler

What is the Secret Key? Life is like a Donut

If I put effort into communication, I expect you to read properly & fully, or just not comment.
Ignoring those who try to divert conversation with irrelevancies.
If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it.
I'm only big and bad, to those who have an over-active imagination.

I may have the Artistic Liesense ;) to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)

userbar.png

Link to comment
Share on other sites

The only downside to _WinAPI_UniqueHardwareID, is it requires WMI to be running.

#include <APIConstants.au3>
#include <WinAPIEx.au3>

MsgBox(4096, '',  'My UniqueID: ' & _WinAPI_UniqueHardwareID(BitOR($UHID_MB, $UHID_BIOS, $UHID_HDD))) ; $UHID_MB is used regardless.

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

  • Moderators

The only downside to _WinAPI_UniqueHardwareID, is it requires WMI to be running.

Which is a reason it's not an option for my deployments. Would be nice to "require" specific things to run "your" software on "their" systems. But the truth is, we're slaves to the client side system setup.

Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.

Link to comment
Share on other sites

Look here for a non winapi HWID code, that is promised to be 100% the same across any operating system, windows, or emulated on linux, as long as the hardware doesn't change.

You can use this along with a serial key system based on a regexp + php/mysql verification to make sure they key actually exists and is active, in addition to matching the pattern.

Edited by nullschritt
Link to comment
Share on other sites

Which is a reason it's not an option for my deployments. Would be nice to "require" specific things to run "your" software on "their" systems. But the truth is, we're slaves to the client side system setup.

I tried to create a similar function to Yashied's >>

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

  • 2 months later...

I'm wondering why serials are still used, sure for physical media they are still usefull, but for Internet downloads one could have unique downloads for each user.

Example:

1. User goes to website and click the download button.

2. Webserver checks users PC for some hardware ID

3. Webserver compiles a unique EXE with the hardware ID hardcoded into it (so no need for registry entries).

4. Profit

Some guy's script + some other guy's script = my script!

Link to comment
Share on other sites

I'd be interested in seeing the code for that.

But what about when your user changes hardware?

In my opinion it is neither big nor clever to inconvenience your clients, and that is one reason for a serial.

AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Link to comment
Share on other sites

How long would that compilation take? How much would it affect the program download time if you had 1000 people downloading it at the same time and each one had to be compiled first?

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

I'd be interested in seeing the code for that.

But what about when your user changes hardware?

In my opinion it is neither big nor clever to inconvenience your clients, and that is one reason for a serial.

I assume we talk paid software, so the user would have an account where he could download a fresh exe if he changes hardware.

How long would that compilation take? How much would it affect the program download time if you had 1000 people downloading it at the same time and each one had to be compiled first?

It would take lesser time than going to the store and buy a CD with the software :P

If it's a small program it, obviously, wouldnt take too long, if it's a big program, you could split the download up in two or more parts/files, dowloading all the media like sounds and graphics first, and the exe last, so while he downloads all the media, the server compiles the exe and have it ready.

Again assuming it's paid software, as there would be no reason to include security on free software, having 1000 simultanous users buying and downloading the software, then you would also have enough cash to have some beefy servers that could get the job done fast.

Some guy's script + some other guy's script = my script!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...