2014-01-19 9 views
1

Я попытался ioctl с HDIO_GET_IDENTITY, чтобы определить серийный номер жесткого диска, но для этого требуются привилегии root.c программа для linux, чтобы получить серийный номер устройства, для пользователя без полномочий root

Пожалуйста, помогите мне написать программу в c, чтобы получить серийный номер устройства (hdd, cpu, mb) или адрес mac, который не требует прав root.

ответ

1

Почему бы вам не использовать MAC-адрес как уникальный идентификатор компьютера. Вот код для получения MAC-адреса одного из интерфейсов. В приведенном ниже коде в основном считывается имя всех доступных интерфейсов, а затем проходит через них, чтобы получить MAC-адрес первого, исключая интерфейс loopback.

int main() 
{ 
struct ifreq ifr; 
struct ifconf ifc; 
char buf[1024]; 
int success = 0; 

int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); 
if (sock == -1) { /* handle error*/ }; 

ifc.ifc_len = sizeof(buf); 
ifc.ifc_buf = buf; 
if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { /* handle error */ } 

struct ifreq* it = ifc.ifc_req; 
const struct ifreq* const end = it + (ifc.ifc_len/sizeof(struct ifreq)); 

for (; it != end; ++it) { 
    strcpy(ifr.ifr_name, it->ifr_name); 
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) { 
     if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback 
      if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) { 
       success = 1; 
       break; 
      } 
     } 
    } 
    else { /* handle error */ } 
} 

unsigned char mac_address[6]; 

if (success) memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6); 
} 
+1

Невозможно изменить адрес mac на большинстве сетевых адаптеров? И что произойдет, если пользователь заменит сетевую карту? –

+0

Да, возможно в случае подключаемых карт NIC, но сложно, если его бортовой –

+1

Такая же проблема при использовании серийного номера HD. Пользователь также может изменить HD. –

Смежные вопросы