고유 한 컴퓨터 ID 생성


104

Windows OS를 실행하는 특정 컴퓨터에 고유 한 ID를 생성하는 함수를 작성해야합니다.

현재 저는 WMI를 사용하여 다양한 하드웨어 매개 변수를 쿼리하고 함께 연결하고 해시하여 고유 ID를 파생합니다. 내 질문은 내가 사용해야하는 제안 된 매개 변수는 무엇입니까? 현재 고유 ID를 생성하기 위해 bios \ cpu \ disk 데이터 조합을 사용하고 있습니다. 각 메트릭에 대해 여러 결과가있는 경우 첫 번째 결과를 사용하고 있습니다.

그러나 두 개의 다른 Windows OS로 이중 부팅하는 컴퓨터가 각 OS에서 다른 사이트 코드를 생성하는 문제가 발생했습니다.

참고로 다음은 내가 현재 사용중인 측정 항목입니다.

Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed
Win32_BIOS:Manufacturer
Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version
Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads
Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber
Win32_VideoController:DriverVersion, Name

답변:


25

SMBIOS를 직접 구문 분석하고 임의의 길이로 해시하십시오. 사용 가능한 모든 SMBIOS 구조에 대해서는 PDF 사양 을 참조하십시오 .

Windows에서 SMBIOS 정보를 쿼리하려면 EnumSystemFirmwareEntries, EnumSystemFirmwareTablesGetSystemFirmwareTable.

IIRC, CPUID 명령의 "고유 ID"는 P3 이상에서 더 이상 사용되지 않습니다.


14
이러한 기능을 사용하려면 최소한 Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 또는 Windows Server 2003 SP1이 필요합니다.
jcoffland 2011 년

33
내가 한 일을하지 말라는 메모는 GetSystemFirmwareTable ( 'RSMB'...); 전체 SMBIOSTableData 버퍼를 해시합니다. CPU 내부 온도를 해당 테이블에 기록한 워크 스테이션에 도달 할 때까지 훌륭하게 작동했습니다. 즉, 내 고유 ID가 몇 초마다 변경되었습니다.
Thomas

이 솔루션에 사용할 수있는 소스 코드가 있습니까?
Just Shadow

@Thomas 그래서 마침내 어떤 솔루션을 선택 했습니까?
Smith

@Smith 내 목표는 작은 8 자 ID였습니다. 사양을 읽고 어떤 필드가 다를 수 있는지 결정하고 제외했습니다. 그런 다음 수년 동안 기계에서 상수가 아닌 더 많은 필드를 제거했습니다. 마지막으로 입력으로 사용한 원시 데이터의 암호화 된 사본을 저장하고 closeEnough2 개의 필드에서만 변경되는 경우 일치하지 않는 ID를 허용하도록 함수를 만들었습니다 . 또한 초기에 동일한 시스템간에 충돌이 발생했기 때문에 해시에 프로세서 및 시스템 하드 드라이브에 대한 세부 정보를 포함합니다.
Thomas

72

나는 똑같은 문제가 있었고 약간의 조사 끝에 @Agnus가 제안한 것처럼 MachineGuid레지스트리 키 를 읽는 것이 가장 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography좋습니다. OS 설치 중에 생성되며 다른 OS를 새로 설치하지 않는 한 변경되지 않습니다. OS 버전에 따라 포함 된 네트워크 어댑터 MAC 주소 (임의를 포함한 다른 숫자 포함) 또는 의사 난수 번호, 최신 OS 버전의 경우 이후 (XP SP2 이후, 확신하지만 확실하지 않음)가 포함될 수 있습니다. 이론적으로 의사 난수 인 경우 위조 될 수 있습니다. 두 시스템이 실시간 시계를 포함하여 동일한 초기 상태를 갖는 경우입니다. 실제로 이것은 드물지만 하드 코어 해커의 공격을받을 수있는 보안 기반이 될 것으로 예상되는 경우주의해야합니다.

물론 레지스트리 항목은 누구나 쉽게 변경할 수있어 컴퓨터 GUID를 위조 할 수 있지만 이로 인해 많은 Windows 구성 요소의 정상적인 작동이 중단되어 대부분의 경우 일반 사용자가 수행하지 않을 것입니다. 하드 코어 해커 용).


6
KEY_WOW64_64KEY 플래그를 사용하여 항상 레지스트리 키의 "실제"버전을 얻도록 할 수 있습니다.
Colen 2011-06-08

13
드라이브 이미지를 복제하면 동일하게 유지됩니다. 따라서 이것은 전혀 조작이 안전하지 않으며 매우 안전하지 않습니다.
bitbonk 2011

19
요점을 명확히하기 위해 소프트웨어에 DRM 조치를 적용 할 때 내 주요 목표는 사람들이 '전문'해적이 소프트웨어의 불법 복사본을 제한없이 판매 할 수있는 균열을 만드는 것을 방지하는 것입니다. 나는 내 소프트웨어를 사용할 수 있도록 친구의 드라이브를 복제하는 가끔 해커에 대해 그렇게 걱정하지 않는다. 그런 경우에 그 사람들은 일반적으로 돈보다 더 많은 시간을 가지며 어쨌든 돈을 지불하지 않을 것입니다. 소프트웨어 비용이 $ 100이고 임금이 $ 50 / h 이상이면 비용을 지불하면됩니다. 번거 로움은 2 시간보다 더 많은 시간이 소요됩니다.
Fabio Ceconello 2011

7
특히 마스터 머신 이미지를 복제하여 Windows가 설치된 환경에서는 MachineGuid가 모두 동일합니다.
nandhp

8
sysprep & all을 사용하여 정확하고 합법적으로 수행하면 아닙니다. 해적판을 복사하고 "그냥 복제"한 사람들에게는 또 다른 문제입니다. 그러나 어쨌든 그들은 그렇게 쉽게 멈추지 않을 것입니다.
Fabio Ceconello 2012 년

34

우리와 함께 라이선스 도구 우리는 다음과 같은 구성 요소를 고려

  • MAC 주소
  • CPU (일련 번호가 아니라 스테핑 및 모델과 같은 실제 CPU 프로필)
  • 시스템 드라이브 일련 번호 (볼륨 레이블 아님)
  • 기억
  • CD-ROM 모델 및 공급 업체
  • 비디오 카드 모델 및 공급 업체
  • IDE 컨트롤러
  • SCSI 컨트롤러

그러나 구성 요소를 해싱하고 합격 / 불합격 시스템을 만드는 것보다 두 개의 컴퓨터 프로필이 얼마나 다른지 확인하는 데 사용할 수 있는 유사한 지문 을 만듭니다 . 차이 등급이 지정된 허용 오차를 초과하면 사용자에게 다시 활성화하도록 요청하십시오.

지난 8 년 동안 수십만 건의 최종 사용자 설치와 함께 사용되어이 조합이 안정적으로 고유 한 컴퓨터 ID를 제공하는 데 효과적이라는 사실을 확인했습니다. 심지어 가상 컴퓨터와 복제 된 OS 설치에서도 마찬가지입니다.


1
사용하는 MAC 주소를 어떻게 결정합니까? 머신에는 여러 NIC가있을 수 있으며 이들은 동적으로 추가됩니다 (애플릿을 통해 새 VPN에 연결하면 가상 NIC가 추가됨). 일부는 가상이고 이더넷 유형이며 가상으로 식별하기 어렵습니다. 기타 네트워크 상태 (wifi)에 따라 Up / Down
Marek

가상 NICS, blue-tooth 등을 제외한 모든 물리적 NIC를 사용합니다. 이들은 모두 결합되어 통합 해시를 생성합니다.
폴 알렉산더

CPU 일련 번호를 사용하지 않는 것이 좋습니다.
Mojtaba Rezaeian

3
CPU 일련 번호는 인텔 칩에서 수년 동안 활성화되지 않았습니다. 시스템 호출은 여전히 ​​존재하지만 안정적인 값을 반환하지 않습니다. 나는 그것이 반환하는 것을 기억할 수 없습니다-더미 데이터 또는 모든 기계에 대해 동일한 값. 어느 쪽이든 신뢰할 수있는 하드웨어 메트릭이 아닙니다.
Paul Alexander

1
@PaulAlexander 당신이 언급 한 도구가 당신이 언급 한 모든 매개 변수의 유효성을 검사하거나 그들 중 일부가 작동하지 않을까요? 이제 시스템은 보통 CD-ROM으로 구성되지 않기 때문에
FaizanHussainRabbani

3

프로세서의 UniqueID를 사용하는 것은 어떻습니까?


14
요즘은 감가 상각 자산 아닌가요?
Jake Wilson

15
아마도 그는 '사용되지 않음'을 의미 할 것입니다. CPU 제조업체는 한 단계에서 고유 ID를 입력하기 시작했지만 개인 정보 문제에 대한 반발로 인해 다시 중단되었습니다. 따라서 일부는 고유 한 ID를 가지고 있지만 대부분의 최신 CPU는 그렇지 않습니다.
TripleAntigen

1
참고로, 펜티엄 III의 간략한 배치에만 읽을 수있는 CPU 일련 번호가있었습니다. 이후 버전에는 일련 번호가 있지만 기본적으로 비활성화되었습니다. 펜티엄 IV 이상 CPU는 전혀 지원하지 않았습니다.
폴 알렉산더

2

나는 "당신은 단지 잘못하고있다"고 말하는 사람이 되기는 싫다 (나는 항상 그 사람을 싫어한다;) 그러나 ...

고유 한 기계에 대해 반복적으로 생성되어야합니까? 식별자를 할당하거나 공개 / 개인 키를 수행 할 수 있습니까? 값을 생성하고 저장할 수 있다면 동일한 디스크에 설치된 두 OS에서 액세스 할 수 있습니까?

아마도 이러한 옵션을 살펴 보았고 작동하지 않을 수도 있지만 그렇지 않은 경우 고려해야 할 사항입니다.

사용자 신뢰의 문제가 아니라면 MAC 주소 만 사용할 수 있습니다.


5
기기에 네트워크 카드가 없으면 MAC 주소가 작동하지 않습니다.
Brian

7
@Brian-네트워크 카드가없는 컴퓨터를 식별하기 위해 정말 고유 한 값이 필요합니까? 기계에 카드가 있다는 것이 꽤 안전한 것 같습니다.
romandas

1

네트워크 카드 (존재하는 경우)의 MAC 주소를 사용하는 방법을 살펴 봐야합니다. 이들은 일반적으로 고유하지만 조작 할 수 있습니다. 네트워크 어댑터 MAC 주소를 기반으로 라이선스 파일을 생성하는 소프트웨어를 사용 했으므로 컴퓨터를 구분하는 데 상당히 안정적인 방법으로 간주됩니다.


6
아니요, 그렇지 않습니다. 많은 제조업체에서 변경할 수 있습니다. 일부 공급 업체가 동일한 MAC 주소를 가진 모든 컴퓨터를 제공하기 때문에 클러스터 작업시 매우 유용합니다 (몇 년 전에이 문제가 발생했습니다).
gizmo

이것은 많은 경우에 유효한 아이디어입니다. 질문은 스푸핑 또는 오프라인을 지정하지 않습니다. 일반적으로 네트워크에서 식별하려면 고유 ID를 생성해야합니다
Hurda

동일한 컴퓨터에 여러 네트워크 장치를 가질 수 있습니다. 항상 동일한 순서로 감지되거나 어느 시점에서 교체되지 않을 것이라는 보장은 없습니다. 더 영구적 인 하드웨어를 사용하는 것이 좋습니다.
넣고 아직 Hammerthief

1

내 응용 프로그램 중 하나의 경우 도메인 컴퓨터가 아닌 경우 컴퓨터 이름을 사용하고 도메인 컴퓨터의 경우 도메인 컴퓨터 계정 SID를 사용합니다. Mark Russinovich는이 블로그 게시물 인 Machine SID 에서 이에 대해 설명합니다 .

SID 복제가 문제가되는 마지막 경우는 분산 응용 프로그램이 컴퓨터 SID를 사용하여 컴퓨터를 고유하게 식별하는 경우입니다. Microsoft 소프트웨어는 그렇게하지 않으며 이러한 방식으로 시스템 SID를 사용하는 것은 모든 DC가 동일한 시스템 SID를 가지고 있다는 사실에만 작동하지 않습니다. 고유 한 컴퓨터 ID에 의존하는 소프트웨어는 컴퓨터 이름 또는 컴퓨터 도메인 SID (도메인에있는 컴퓨터 계정의 SID)를 사용합니다.

LDAP 또는를 통해 도메인 컴퓨터 계정 SID에 액세스 할 수 있습니다 System.DirectoryServices.


1

내 프로그램에서 먼저 터미널 서버를 확인하고 WTSClientHardwareId를 사용합니다. 그렇지 않으면 로컬 PC의 MAC 주소가 적절해야합니다.

당신이 정말로 속성 목록을 사용하려면 당신은 같은 것들을 밖으로 휴가를 제공 Name하고 DriverVersion, Clockspeed그것은 아마도 OS 의존적이기 때문에, 등. 두 운영 체제에서 동일한 정보를 출력하고 서로 다른 정보는 제외하십시오.



0

네트워크 카드의 MAC 주소를 사용하지 않는 이유는 무엇입니까?


14
Mac 주소가 스푸핑 될 수 있음
Henry B

이것은 많은 경우에 유효한 아이디어입니다. 질문은 스푸핑 또는 오프라인을 지정하지 않습니다. 일반적으로 네트워크에서 식별하려면 고유 ID를 생성해야합니다
Hurda

0

약간의 속임수 일 수도 있지만, 요즘 마더 보드가 변경되지 않으면 이더넷 어댑터의 MAC 주소는 거의 변경되지 않습니다.


많은 제조업체에서 변경할 수 있습니다. 일부 공급 업체가 동일한 MAC 주소를 가진 모든 컴퓨터를 제공하기 때문에 클러스터 작업시 매우 유용합니다 (몇 년 전에이 문제가 발생했습니다).
gizmo

1
MAC은 매우 쉽게 변경 될 수 있기 때문에 완전히 신뢰할 수 없습니다 (Google 검색으로 만 변경하면이 작업을 수행하는 많은 무료 도구를 볼 수 있습니다). WMI도 마찬가지입니다.
InTheNameOfScience 2015-04-07

0

어떤 종류의 제조업체 일련 번호 나 서비스 태그를 가져올 수 있습니까?

저희 매장은 Dell 매장이므로 각 시스템에 고유 한 서비스 태그를 사용하여 식별합니다. 적어도 Linux에서는 BIOS에서 쿼리 할 수 ​​있다는 것을 알고 있지만 Windows에서 수행하는 방법을 직접 알지 못합니다.


0

추가 제약이 있었기 때문에 .net express를 사용하고 있었기 때문에 표준 하드웨어 쿼리 메커니즘을 사용할 수 없었습니다. 그래서 쿼리를 수행하기 위해 파워 쉘을 사용하기로 결정했습니다. 전체 코드는 다음과 같습니다.

Private Function GetUUID() As String
    Dim GetDiskUUID As String = "get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID"
    Dim X As String = ""
    Dim oProcess As New Process()
    Dim oStartInfo As New ProcessStartInfo("powershell.exe", GetDiskUUID)
    oStartInfo.UseShellExecute = False
    oStartInfo.RedirectStandardInput = True
    oStartInfo.RedirectStandardOutput = True
    oStartInfo.CreateNoWindow = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()
    oProcess.WaitForExit()
    X = oProcess.StandardOutput.ReadToEnd
    Return X.Trim()
End Function

-1

한 가지 옵션에 대해 CPUID를 찾으십시오. 다중 CPU 시스템에 몇 가지 문제가있을 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.