後來windows 就提供了一個Machine GUID(Globally Unique Identifier),來作唯一的識別
從登錄檔裡HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography路徑下可以觀察到,如圖
取得machine GUID的VC++程式碼如下:
#include <windows.h>
#include <stdio.h>
int main()
{
HKEY hky;
LONG ern;
DWORD typ = REG_SZ;
DWORD siz;
CHAR dat[37];
siz = sizeof dat;
ern = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_WRITE | KEY_READ | KEY_WOW64_64KEY, &hky);
if (ERROR_SUCCESS == ern) {
ern = RegQueryValueExA(hky, "MachineGuid", NULL, &typ, (LPBYTE)dat, &siz);
RegCloseKey(hky);
if (ERROR_SUCCESS == ern) {
if (typ != REG_SZ) { printf("Error: The MachineGuid value is not of the expected type.\n"); return 1; }
if (sizeof dat != siz || dat[sizeof dat - 1] || sizeof dat - 1 != strlen(dat)) { printf("Error: The MachineGuid value is shorter than expected, is missing the terminating null, or contains embedded nulls.\n"); return 1; }
printf("%s\n", dat);
system("pause");
return 0;
}
else {
if (ERROR_MORE_DATA == ern) { printf("Error: The MachineGuid value is longer than expected.\n"); return 1; }
printf("RegQueryValueExA: ");
}
}
else { printf("RegOpenKeyExA: "); }
LPVOID lpMsgBuf;
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ern, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&lpMsgBuf, 0, NULL);
printf("Error 0x%u: %s\n", (UINT)ern, (LPSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
system("pause");
return 1;
}
參考資料 : The Best Way To Uniquely Identify A Windows MachinePrint MachineGuid

沒有留言:
張貼留言