code

고유 한 컴퓨터 ID 생성

codestyles 2020. 8. 18. 07:43
반응형

고유 한 컴퓨터 ID 생성


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

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

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

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


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

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


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

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

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

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


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


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

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

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

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


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


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

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

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


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

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


하드웨어 특정 정보를 가져 오는 데 사용할 수있는 라이브러리가 있습니다. 하드웨어 일련 번호 추출기 (CPU, RAM, HDD, BIOS)


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


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


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

Our shop is a Dell shop, so we use the service tag which is unique to each machine to identify them. I know it can be queried from the BIOS, at least in Linux, but I don't know offhand how to do it in Windows.


I had an additional constraint, I was using .net express so I couldn't use the standard hardware query mechanism. So I decided to use power shell to do the query. The full code looks like this:

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

Look up CPUID for one option. There might be some issues with multi-CPU systems.


Try this one, it gives a unique hard disk ID: Port of DiskId32 for Delphi 7-2010.

참고URL : https://stackoverflow.com/questions/99880/generating-a-unique-machine-id

반응형