Il migliore in assoluto è basarsi su qualcosa di hardware, per riconoscere il pc su cui è installato.

Il metodo più semplice, se il pc è dotato di una scheda di rete, è quello di leggere (con apposite chiamate alle API Win32) il codice MAC della scheda di rete: ogni scheda di rete presente nel mondo ha un diverso codice MAC, e se all'interno del codice dell'applicazione mettete un controllo per un dato MAC address, potete fare in modo che il programma funzioni SOLO se c'è quella data scheda di rete.

Questo è MOLTO sicuro, in pratica a meno che il cliente non sia un provetto programmatore a sua volta e si scriva un crack, è praticamente impossibile che possa riuscire nell'intento, ma ha anche lo svantaggio che è strettamente legato ad un dato hardware, e che quindi dovrai ricompilare e riinviare il programmino al cliente se cambia PC o anche solo scheda di rete.

Altrimenti, potresti procedere così:
Durante l'installazione (o al primo avvio) generi un numero casuale molto grande e lo scrivi nel registro, poi chiedi all'utente di scrivere un codice e gli mostri il numeraccio che hai generato.
Lui ti telefona, ti legge il numeraccio, e tu che hai sottomano un programmino con cui trasformare il numeraccio in codice di sblocco, gli dai il suo codice di sblocco, che lui inserisce e sblocca il programma. Il tutto funziona perchè nel tuo programma che gli hai dato c'è lo stesso algoritmo con cui hai generato il codice di sblocco, e ad ogni avvio il programma prenderà il numeraccio e, con quell'algoritmo, otterrà il codice di sblocco e lo confronterà con quello, salvato, che tu hai dato al cliente, facendo avviare il programma solo se combaciano.

Questo secondo metodo, pur più comodo per l'utente, è molto più facilmente scavalcabile, però, perchè basta che l'utente trovi dove sono stati scritti i due dati, numeraccio e sblocco, per poterli passare a qualcun'altro e sorpassare così la protezione.

Ciao!