Pergunta

Eu preciso escrever uma função que gera uma identificação que é exclusivo para uma determinada máquina executando um sistema operacional do Windows.

Atualmente, estou usando o WMI para consultar vários parâmetros de hardware e concatenar-los juntos e de hash-los para obter o ID único. A minha pergunta é, quais são os parâmetros sugeridos devo usar? Atualmente, estou usando uma combinação de bios \ cpu \ dados do disco para gerar a identificação única. E estou usando o primeiro resultado se vários resultados estão aí para cada métrica.

No entanto, eu corri para um problema onde uma máquina que botas duplas em 2 diferentes SO Windows gera diferentes códigos de site em cada OS, 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
Foi útil?

Solução

Parse a SMBIOS si mesmo e de hash para um comprimento arbitrário. Veja a PDF especificação para todas as estruturas SMBIOS disponível.

Para consultar a informação SMBIOS do Windows você pode usar EnumSystemFirmwareEntries , EnumSystemFirmwareTables e GetSystemFirmwareTable .

IIRC, o "ID único" da instrução CPUID está obsoleto a partir de P3 e mais recente.

Outras dicas

Eu tive o mesmo problema e depois de um pouco de pesquisa eu decidi o melhor seria ler MachineGuid na chave de registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, como @Agnus sugeriu. Ele é gerado durante a instalação do sistema operacional e não vai mudar a menos que você faça instalar outro sistema operacional fresco. Dependendo da versão do sistema operacional que pode conter o adaptador de rede endereço MAC incorporado (além de alguns outros números, incluindo aleatório), ou um número pseudo-aleatório, o mais tarde para as versões mais recentes do sistema operacional (após XP SP2, creio eu, mas não tenho certeza). Se é um pseudo teoricamente pode ser forjado - se duas máquinas têm o mesmo estado inicial, incluindo relógio de tempo real. Na prática, isso será raro, mas esteja ciente se você espera que ele seja uma base para a segurança que podem ser atacados por hackers hardcore.

É claro que uma entrada de registro também pode ser facilmente alterada por qualquer pessoa para forjar um GUID máquina, mas o que eu encontrei é que isso iria perturbar o funcionamento normal de muitos componentes do Windows que na maioria dos casos utilizador não regulares iria fazê-lo (novamente , atente para hackers graves).

Eu odeio ser o cara que diz: "você está apenas fazendo errado" (eu sempre odeio esse cara;) mas ...

Tem que ser repetidamente gerado para a máquina original? você poderia simplesmente atribuir o identificador ou fazer uma chave pública / privada? Talvez se você pudesse gerar e armazenar o valor, você pode acessá-lo de ambas as instalações do sistema operacional no mesmo disco?

Você provavelmente explorou estas opções e não funcionar para você, mas se não, é algo a considerar.

Se não é uma questão de confiança do usuário, você pode simplesmente usar endereços MAC.

O que sobre apenas usando o UniqueID do processador?

Você deve olhar para usar o endereço MAC da placa de rede (se existir). Aqueles são geralmente única, mas podem ser fabricados. Eu tenho software usado que gera o seu arquivo de licença com base no seu adaptador de rede endereço MAC, por isso é considerada uma forma bastante confiável para distinguir entre computadores.

Para uma das minhas aplicações, eu usar o nome do computador se for computador sem domínio, ou o SID da conta de máquina de domínio para computadores de domínio. Mark Russinovich fala sobre isso neste post, Máquina SID :

O caso final, onde SID duplicação seria um problema é se um aplicativo usado distribuídos SID da máquina para identificar computadores. software não Microsoft faz isso e usando o SID máquina dessa forma não funciona apenas para o fato de que todos da DC têm o mesmo SID máquina. Software que depende de identidades únicas de computador ou usa nomes de computador ou computador SID de domínio (o SID do computador contas no domínio).

Você pode acessar o SID da conta de máquina de domínio via LDAP ou System.DirectoryServices.

No meu programa eu verificar primeiro para o Terminal Server e utilizar o WTSClientHardwareId. Caso contrário, o endereço MAC do PC local deve ser adequada.

Se você realmente quiser usar a lista de propriedades que forneceu deixar de fora coisas como Name e DriverVersion, Clockspeed, etc. uma vez que é, possivelmente, OS dependente. Tente produzir a mesma informação em ambos os sistemas operacionais e deixar de fora o que difere entre.

Há um disponível biblioteca para obter informações específicas de hardware: Hardware número de série extractor (CPU, RAM, HDD, BIOS)

Por que não usar o endereço MAC da placa de rede?

Talvez enganar um pouco, mas o endereço MAC de um máquinas Ethernet adaptador raramente muda, sem a placa-mãe mudando estes dias.

Você pode puxar algum tipo de fabricante número ou serviço de série tag?

Nossa loja é uma loja Dell, por isso usamos a etiqueta de serviço que é único para cada máquina para identificá-los. Eu sei que pode ser consultado a partir do BIOS, pelo menos em Linux, mas eu não sei de improviso como fazê-lo no Windows.

Eu tive uma restrição adicional, eu estava usando .net expressar assim que eu não poderia usar o mecanismo de consulta hardware padrão. Então eu decidi usar shell poder para fazer a consulta. Os olhares de código completo como este:

Private Function GetUUID() As String
    Dim GetDiskUUID As String = "get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID"
    Dim X As String = ""
    Dim oProcess As New Process()
    Dim oStartInfo As New ProcessStartInfo("powershell.exe", GetDiskUUID)
    oStartInfo.UseShellExecute = False
    oStartInfo.RedirectStandardInput = True
    oStartInfo.RedirectStandardOutput = True
    oStartInfo.CreateNoWindow = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()
    oProcess.WaitForExit()
    X = oProcess.StandardOutput.ReadToEnd
    Return X.Trim()
End Function

Olhe para cima CPUID para uma opção. Pode haver alguns problemas com sistemas multi-CPU.

Tente este, dá uma ID de disco rígido única: Port of DiskId32 para Delphi 7-2010 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top