문제

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

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

그러나 2개의 서로 다른 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 자신을 임의의 길이로 해시합니다.참조 PDF 사양 모든 SMBIOS 구조에 사용 가능합니다.

Windows에서 SMBIOS 정보를 쿼리하려면 다음을 사용할 수 있습니다. EnumSystemFirmwareEntries, EnumSystemFirmwareTables 그리고 GetSystemFirmwareTable.

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

다른 팁

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

물론 레지스트리 항목은 누구나 컴퓨터 GUID를 위조하기 위해 쉽게 변경할 수 있지만, 내가 발견한 것은 이것이 너무 많은 Windows 구성 요소의 정상적인 작동을 방해하여 대부분의 경우 일반 사용자가 이를 수행하지 않을 것이라는 것입니다(다시 말하지만, 주의하십시오). 하드코어 해커의 경우).

우리의 라이센스 도구 우리는 다음 구성 요소를 고려합니다

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

하지만 단순히 구성 요소를 해싱하고 합격/불합격 시스템을 만드는 것이 아니라 비슷한 지문 두 기계 프로필이 얼마나 다른지 확인하는 데 사용할 수 있습니다.차이 등급이 지정된 허용 오차를 초과하는 경우 사용자에게 다시 활성화하도록 요청합니다.

우리는 지난 8년 동안 수십만 건의 최종 사용자 설치를 통해 이 조합이 가상 머신 및 복제된 OS 설치의 경우에도 안정적으로 고유한 머신 ID를 제공하는 데 효과적이라는 것을 발견했습니다.

"넌 그냥 잘못하고 있는 거야"라고 말하는 사람은 싫지만(난 그 사람 항상 싫어 ;) 하지만...

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

아마도 이러한 옵션을 살펴봤지만 효과가 없을 수도 있지만 그렇지 않은 경우에는 고려해야 할 사항입니다.

사용자 신뢰의 문제가 아닌 경우 MAC 주소를 사용할 수 있습니다.

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

네트워크 카드(존재하는 경우)의 MAC 주소 사용을 조사해야 합니다.그것들은 일반적으로 독특하지만 조작될 수 있습니다.저는 네트워크 어댑터 MAC 주소를 기반으로 라이선스 파일을 생성하는 소프트웨어를 사용했기 때문에 컴퓨터를 구별하는 상당히 안정적인 방법으로 간주됩니다.

내 응용 프로그램 중 하나의 경우 도메인이 아닌 컴퓨터인 경우 컴퓨터 이름을 사용하거나 도메인 컴퓨터의 경우 도메인 컴퓨터 계정 SID를 사용합니다.Mark Russinovich는 이 블로그 게시물에서 이에 대해 이야기합니다. 머신 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 주소가 거의 변경되지 않습니다.

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

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

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

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

한 가지 옵션에 대해 CPUID를 찾아보세요.다중 CPU 시스템에는 몇 가지 문제가 있을 수 있습니다.

이것을 시도해 보세요. 고유한 하드 디스크 ID를 제공합니다. Delphi 7-2010용 DiskId32 포트.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top