Вы можете использовать первый MAC-адрес, который назначается производителем оборудования и никогда не изменится.
Примерно так:
/**
return string containing first MAC address on computer
requires adding Iphlpapi.lib to project
*/
string GetMac()
{
char data[4096];
ZeroMemory( data, 4096 );
unsigned long len = 4000;
PIP_ADAPTER_INFO pinfo = ( PIP_ADAPTER_INFO ) data;
char sbuf[20];
string sret;
DWORD ret = GetAdaptersInfo( pinfo, &len );
if( ret != ERROR_SUCCESS )
return string("**ERROR**");
for(int k = 0; k < 5; k++ ) {
sprintf(sbuf,"%02X-",pinfo->Address[k]);
sret += sbuf;
}
sprintf(sbuf,"%02X",pinfo->Address[5]);
sret += sbuf;
return( sret );
}
ИМХО, этого достаточно для лицензирования программного обеспечения на сумму до тысячи долларов, где все, что необходимо, - это предотвратить случайное использование вашего программного обеспечения соседями. Мотивированный пират может обойти это, но пираты с достаточными знаниями и мотивацией не достаточно часты, чтобы вам стоило потратить больше усилий, пытаясь победить их, и, что еще более важно, вы не хотите причинять неудобства своим честным клиентам.
Если ваше программное обеспечение настолько ценно, что мотивированные пираты представляют собой реальную угрозу, тогда стоимость и неудобство аппаратного ключа становятся оправданными.
Я также не верю в нагромождение дополнительных аппаратных сигнатур, идентификаторов дисков, конфигураций материнских плат и так далее. Повышение безопасности минимально, и вероятность того, что что-то может пойти не так, значительно возрастает, так что вы в конечном итоге будете тратить часы на поддержку клиентов с необычными настройками и разозлите неизвестные номера, которые просто разочаровываются в вас.
Реализация простой системы с MAC-адресом, которая, кажется, всегда работает. Примите, что случайный пират может получить свои удары от нарушения вашей лицензии. Сконцентрируйте свои усилия на улучшении своего программного обеспечения, чтобы вы получили больше честных клиентов.
Система может иметь более одной сетевой карты (например, ethernet и беспроводная сеть), и пользователь может изменить порядок представления (зачем ему это делать?). Чтобы справиться с этим, лицензия должна соответствовать сетевой карте, присутствующей в любом месте системы, требуя код примерно такой:
/**
The MAC addresses of ethernet network cards present on computer
@param[out] vMAC vector of strings containing MAC addresses in XX-XX-XX-XX-XX-XX format
returns empty vector on error
See discussion of this
/5437934/sozdanie-apparatnogo-identifikatora-kompytera
*/
void cLicenser::GetMac( vector < string >& vMac )
{
vMac.clear();
char data[4096];
ZeroMemory( data, 4096 );
unsigned long len = 4000;
PIP_ADAPTER_INFO pinfo = ( PIP_ADAPTER_INFO ) data;
DWORD ret = GetAdaptersInfo( pinfo, &len );
if( ret != ERROR_SUCCESS )
return;
while ( pinfo ) {
if( pinfo->Type == MIB_IF_TYPE_ETHERNET ) (
// ignore software loopbacks and other strange things that might be present
continue;
char sbuf[20];
string sret;
for(int k = 0; k < 5; k++ ) {
sprintf(sbuf,"%02X-",pinfo->Address[k]);
sret += sbuf;
}
sprintf(sbuf,"%02X",pinfo->Address[5]);
sret += sbuf;
vMac.push_back( sret );
}
pinfo = pinfo->Next;
}
}