C# - Identificador 'Digital' para o computador local


Que tal gerar um identificador para o seu computador local de forma que ele funcione como uma impressão digital e seja único ?

Neste artigo eu vou adaptar um projeto encontrado na web cujo objetivo é gerar um identificação única para um computador local.

É um projeto simples que precisa ser otimizado mas que dá uma ideia do que pode ser feito para poder identificar o hardware de um computador.

Eu vou usar o Visual C# 2010 Express Edition para criar o projeto exemplo.

Abra o Visual C# 2010 Express Edition e crie um novo projeto do tipo Windows Application com o nome IdentificacaoDigital:

A seguir inclua o formulário form1.cs um controle PictureBox(picId) , um controle Button(btnId) e um controle Label (lblId) conforme o leiaute abaixo:

Vamos incluir uma referência ao namespace System.Management em nosso projeto.

O namespace System.Management fornece acesso a um rico conjunto de informações gerenciais e gestão de eventos sobre o sistema, dispositivos e aplicativos instrumentados para a infraestrutura do Windows Management Instrumentation (WMI).

Aplicativos e serviços podem consultar informações de gestão interessantes (como quanto espaço livre é deixado no disco, o que é a utilização da CPU atual, qual banco de dados de uma determinada aplicação está conectado, e muito mais), usando classes derivadas de ManagementObjectSearcher e ManagementQuery , ou podem se inscrever para uma variedade de eventos de gerenciamento usando a classe ManagementEventWatcher. Os dados acessíveis podem ser de ambos os componentes gerenciados e não gerenciados no ambiente distribuído.

No menu Project clique em Add Reference e na janela a seguir clique na aba .NET e selecione System.Management e clique no botão OK;

A seguir no menu Project clique Add New Item -> Class e informe o nome Identifica.cs.

A seguir digite o código abaixo nesta classe:

using System.Management;
namespace IdentificacaoDigital
{
    class Identifica
    {
       //obtem os valores e empacota em uma string única
       public string Valor()
        {
            return empacota(cpuId()
                 + biosId()
                 + diskId()
                 + baseId()
                 + videoId()
                 + macId());
        }
        //Retorna o identificador do hardware
        private string identificador(string wmiClass, string wmiProperty, string wmiMustBeTrue)
        {
            string resultado = "";
           ManagementClass mc = new ManagementClass(wmiClass);
           ManagementObjectCollection moc = mc.GetInstances();
            foreach (ManagementObject mo in moc)
            {
                if (mo[wmiMustBeTrue].ToString() == "True")
                {
                    //pega somente o primeiro
                    if (resultado == "")
                    {
                        try
                        {
                            resultado = mo[wmiProperty].ToString();
                            break;
                        }
                        catch
                        {
                        }
                    }
                }
            }
            return resultado;
        }
        private string identificador(string wmiClass, string wmiProperty)
        ///Retorna o identificador do hardware
        {
            string resultado = "";
            ManagementClass mc = new ManagementClass(wmiClass);
            ManagementObjectCollection moc = mc.GetInstances();
            foreach (ManagementObject mo in moc)
            {

               //pega somente o primeiro
                if (resultado == "")
                {
                    try
                    {
                        resultado = mo[wmiProperty].ToString();
                        break;
                    }
                    catch
                    {
                    }
                }

            }
            return resultado;
        }

        private string cpuId()
        {
            //Usa o primeiro identificador da CPU na ordem de preferencia
            //Não pega todos os identificadores, pois demora muito tempo
            string retVal = identificador("Win32_Processor", "UniqueId");
            if (retVal == "") //Se não obter o UniqueID, usa o ProcessorID
            {
                retVal = identificador("Win32_Processor", "ProcessorId");

                if (retVal == "") //Se não pegar o ProcessorId, usa o Name
                {
                    retVal = identificador("Win32_Processor", "Name");


                    if (retVal == "") //Se não pegar o Name, usa o Manufacturer
                    {
                        retVal = identificador("Win32_Processor", "Manufacturer");
                    }
                    //Adiciona o clock speed por segurança
                    retVal += identificador("Win32_Processor", "MaxClockSpeed");
                }
            }

            return retVal;

        }
        private string biosId()
        //identifica a BIOS
        {
            return identificador("Win32_BIOS", "Manufacturer")
            + identificador("Win32_BIOS", "SMBIOSBIOSVersion")
            + identificador("Win32_BIOS", "IdentificationCode")
            + identificador("Win32_BIOS", "SerialNumber")
            + identificador("Win32_BIOS", "ReleaseDate")
            + identificador("Win32_BIOS", "Version");
        }
        private string diskId()
        //ID do principal disco rigido
        {
            return identificador("Win32_DiskDrive", "Model")
            + identificador("Win32_DiskDrive", "Manufacturer")
            + identificador("Win32_DiskDrive", "Signature")
            + identificador("Win32_DiskDrive", "TotalHeads");
        }
        private string baseId()
        //ID da Motherboard
        {
            return identificador("Win32_BaseBoard", "Model")
            + identificador("Win32_BaseBoard", "Manufacturer")
            + identificador("Win32_BaseBoard", "Name")
            + identificador("Win32_BaseBoard", "SerialNumber");
        }
        private string videoId()
        //ID do controlador de video primário
        {
            return identificador("Win32_VideoController", "DriverVersion")
            + identificador("Win32_VideoController", "Name");
        }
        private string macId()
        //ID da rede habilitada
        {
            return identificador("Win32_NetworkAdapterConfiguration", "MACAddress", "IPEnabled");
        }
        private string empacota(string text)
        //Empacota a string para 8 digitos
        {
            string retVal;
            int x = 0;
            int y = 0;
            foreach (char n in text)
            {
                y++;
                x += (n * y);
            }

            retVal = x.ToString() + "00000000";
            return retVal.Substring(0, 8);
        }
    }
}

Agora no evento Click do botão de comando btnId inclua o código abaixo:

private void btnId_Click(object sender, EventArgs e)
{
            Identifica id = new Identifica();
            lblId.Text = id.Valor().ToString();
}

Executando o projeto e clicando no botão de comando teremos o número gerado que servirá para identificar o computador como uma impressão digital.

É óbvio que se o computador for formatado um novo número diferente será gerado. Leve isso em conta.

O processo de geração do número poderá ser um tanto lento dependendo da forma de aplicação e isto pode ser otimizado.

Simples e funcional como só o C# consegue ser...

Pegue o projeto completo aqui:  IdentificacaoDigitalCSharp.zip

Mar 1:39 Foi, então, por toda a Galiléia, pregando nas sinagogas deles e expulsando os demônios.

Mar 1:40 E veio a ele um leproso que, de joelhos, lhe rogava, dizendo: Se quiseres, bem podes tornar-me limpo.

Mar 1:41 Jesus, pois, compadecido dele, estendendo a mão, tocou-o e disse-lhe: Quero; sê limpo.

Mar 1:42 Imediatamente desapareceu dele a lepra e ficou limpo.

Referências:


José Carlos Macoratti