Eu sugiro dar uma olhada no artigo do Projeto de Código da Gerando Chave Única (Impressão Digital) para um Computador para Fins de Licenciamento .
Você encontrará o código em C # que, por sua vez, foi encontrado pelo autor e que ele mesmo usa para suas necessidades de licenciamento.
O autor lista esses pontos muito sensatos:
- Generate a key from only the Motherboard, Processor and BIOS since the user normally doesn't change these parts.
- Don't use MAC ID, Graphics Card ID AND Disk ID since it's very common to change these devices.
- It takes significant time to get IDs of devices. So make the finger print generating function static and save it in a static variable so that it generates the key only once in the whole application.
Em relação ao número de série da placa-mãe retornado como nulo, Esta é uma questão diferente que merece um estudo mais aprofundado. Pode ser que o código incluído no artigo funcione melhor, ou talvez a CPU e o disco possam fazer onde a serial da placa-mãe inacessível.
Eu observo que você não precisa de uma função que usa dados que são universalmente disponível, já que hardware diferente pode não ter todos os você quer. Tudo o que você precisa é concatenar dados de várias fontes, ignorando os que não estão disponíveis, apenas tendo certeza de que o total as sequências de impressões digitais resultantes daquelas que estão disponíveis serão bastante exclusivas.