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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
http://msdn.microsoft.com/en-us/library/system.management.aspx
ASP .NET - Gerenciando serviços como System ... - Macoratti.net