Eu preciso escrever uma função que gere um id que seja exclusivo para uma determinada máquina executando um sistema operacional Windows.
Atualmente, estou usando o WMI para consultar vários parâmetros de hardware e concatená-los juntos e hash para derivar o id exclusivo. Minha pergunta é: quais são os parâmetros sugeridos que devo usar? Atualmente, estou usando uma combinação de dados bios \ cpu \ disk para gerar a id exclusiva. E estou usando o primeiro resultado se houver vários resultados para cada métrica.
No entanto, encontrei um problema em que uma máquina que inicializa duas vezes em dois sistemas operacionais Windows diferentes gera códigos de site diferentes em cada sistema operacional, o que idealmente não deveria acontecer.
Para referência, estas são as métricas que estou usando atualmente:
Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed
Win32_BIOS:Manufacturer
Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version
Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads
Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber
Win32_VideoController:DriverVersion, Name
closeEnough
função para aceitar um id não correspondente se variasse apenas em 2 campos. Também incluo detalhes sobre o processador e o disco rígido do sistema em meu hash porque no início tive colisões entre sistemas idênticos.Tive o mesmo problema e após um pouco de pesquisa decidi que o melhor seria ler a
MachineGuid
chave de registroHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
, como sugeriu @Agnus. Ele é gerado durante a instalação do sistema operacional e não mudará, a menos que você faça uma nova instalação do sistema operacional. Dependendo da versão do sistema operacional, ele pode conter o endereço MAC do adaptador de rede embutido (mais alguns outros números, incluindo aleatório), ou um número pseudoaleatório, o mais recente para versões mais recentes do sistema operacional (após o XP SP2, eu acredito, mas não tenho certeza). Se for um pseudo-aleatório, teoricamente, pode ser forjado - se duas máquinas tiverem o mesmo estado inicial, incluindo relógio de tempo real. Na prática, isso será raro, mas esteja ciente se você espera que seja uma base de segurança que pode ser atacada por hackers radicais.É claro que uma entrada de registro também pode ser facilmente alterada por qualquer pessoa para forjar um GUID de máquina, mas o que eu descobri é que isso interromperia a operação normal de tantos componentes do Windows que na maioria dos casos nenhum usuário regular faria isso (de novo, cuidado para hackers hardcore).
fonte
Com nossa ferramenta de licenciamento , consideramos os seguintes componentes
No entanto, em vez de apenas fazer o hash dos componentes e criar um sistema aprovado / reprovado, criamos uma impressão digital comparável que pode ser usada para determinar a diferença entre dois perfis de máquina. Se a classificação de diferença estiver acima de uma tolerância especificada, peça ao usuário para ativar novamente.
Descobrimos nos últimos 8 anos, em uso com centenas de milhares de instalações de usuário final, que essa combinação funciona bem para fornecer uma id de máquina única e confiável - mesmo para máquinas virtuais e instalações de SO clonadas.
fonte
Que tal usar apenas o UniqueID do processador?
fonte
Eu odeio ser o cara que diz: "você só está fazendo errado" (eu sempre odeio aquele cara;) mas ...
Ele precisa ser gerado repetidamente para a máquina exclusiva? Você poderia apenas atribuir o identificador ou fazer uma chave pública / privada? Talvez se você pudesse gerar e armazenar o valor, você poderia acessá-lo de ambas as instalações do sistema operacional no mesmo disco?
Você provavelmente já explorou essas opções e elas não funcionam para você, mas se não, é algo a se considerar.
Se não for uma questão de confiança do usuário, você pode apenas usar endereços MAC.
fonte
Você deve procurar usar o endereço MAC na placa de rede (se houver). Geralmente são únicos, mas podem ser fabricados. Usei um software que gera seu arquivo de licença com base no endereço MAC do adaptador de rede, por isso é considerado uma maneira bastante confiável de distinguir entre computadores.
fonte
Para um dos meus aplicativos, eu uso o nome do computador, se for um computador sem domínio, ou o SID da conta da máquina de domínio para computadores de domínio. Mark Russinovich fala sobre isso nesta postagem do blog, Machine SID :
Você pode acessar o SID da conta da máquina de domínio via LDAP ou
System.DirectoryServices
.fonte
Em meu programa, primeiro verifico o Terminal Server e uso o WTSClientHardwareId. Caso contrário, o endereço MAC do PC local deve ser adequado.
Se você realmente quiser usar a lista de propriedades que forneceu deixar de fora coisas como
Name
eDriverVersion
,Clockspeed
, etc., já que é possivelmente OS dependente. Tente gerar as mesmas informações em ambos os sistemas operacionais e omita as diferenças entre eles.fonte
Existe uma biblioteca disponível para obter informações específicas de hardware: Extrator de número de série de hardware (CPU, RAM, HDD, BIOS)
fonte
Por que não usar o endereço MAC da sua placa de rede?
fonte
Talvez trapaceando um pouco, mas o endereço MAC do adaptador Ethernet de uma máquina raramente muda sem a mudança da placa-mãe atualmente.
fonte
Você pode puxar algum tipo de número de série do fabricante ou etiqueta de serviço?
Nossa loja é uma loja Dell, então usamos a etiqueta de serviço que é exclusiva para cada máquina para identificá-los. Sei que pode ser consultado na BIOS, pelo menos no Linux, mas não sei de imediato como fazer no Windows.
fonte
Eu tinha uma restrição adicional, estava usando .net express, então não podia usar o mecanismo de consulta de hardware padrão. Portanto, decidi usar o power shell para fazer a consulta. O código completo se parece com isto:
fonte
Procure CPUID para uma opção. Pode haver alguns problemas com sistemas multi-CPU.
fonte
Tente este, ele fornece um ID de disco rígido exclusivo: Porta do DiskId32 para Delphi 7-2010 .
fonte