Avatar billede karas Nybegynder
29. juli 2006 - 00:55 Der er 6 kommentarer og
1 løsning

Hvordan læser man harddiskens serie nummer?

Jeg har tænkt mig at lave et licens system hvor jeg vil knytte softwaren til PCen ved hjælp af harddiskens serie nummer.

Hvordan læser man HDens serie nummer?

Mit software skal køre på en windows platform. I fremtiden skal det dog også køre på linux, så hvis du ved hvordan det gøre der, så er informationen meget velkommen.
Avatar billede bertelbrander Novice
29. juli 2006 - 01:48 #1
På windows:

#include <iostream>
#include <windows.h>

int main()
{
  char VolumeNameBuffer[1024], FileSystemNameBuffer[1024];
  DWORD SerialNumber, MaximumComponentLength, FileSystemFlags;
  if(!GetVolumeInformation("C:\\",
                            VolumeNameBuffer,
                            sizeof(VolumeNameBuffer),
                            &SerialNumber,
                            &MaximumComponentLength,
                            &FileSystemFlags,
                            FileSystemNameBuffer,
                            sizeof(FileSystemNameBuffer)))
  {
      std::cout << "Failed to get volume info: " << GetLastError() << std::endl;
      return 1;
  }
  std::cout << std::hex << SerialNumber << std::endl;
}

Jeg ved ikke hvordan på Linux.
Avatar billede arne_v Ekspert
29. juli 2006 - 02:26 #2
det er lige værd at være opmærksom på at der er 2 serie numre på en hard disk
på windows

et volumen serie nummer på disk elle rpartition som tildeles ved formatering

det er den som returneres af GetVolumeInformation

det er principielt muligt at ændre dette serie nummer

se f.eks. http://www.sysinternals.com/Utilities/VolumeId.html

et rigtig hardware serie nummer som er tildelt den fysiske disk af
producenten

det kan man så vidt jeg ved ikke ændre

hvis man skal have fat i det så skal man bruge WMI og Win32_PhysicalMedia

(og WMI i C++ er besværligt ad h til)
Avatar billede arne_v Ekspert
29. juli 2006 - 02:32 #3
for Linux så har jeg hapset dette på nettet og det returnerer et eller andet
på min Linux box:

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <linux/hdreg.h>
#include <fcntl.h>
#include <errno.h>

int main()
{
    struct hd_driveid id;
    int fd;
    fd = open("/dev/hda", O_RDONLY|O_NONBLOCK); 
    if (fd < 0)
    {
        perror("/dev/hda");
    }
    if(!ioctl(fd, HDIO_GET_IDENTITY, &id))
    {
        printf("Serial Number=%s\n",id.serial_no);
    }
    return 0;
}

[su påkrævet !]
Avatar billede karas Nybegynder
29. juli 2006 - 12:26 #4
Tak for jeres udførlige eksempler, men som arne_v skriver, det ser ud til at være muligt at ændre dette (virtuelle) serie nummer. See evt http://www.codeproject.com/system/change_drive_sn.asp

Det ser mere interessant ud mht. Win32_PhysicalMedia (forudsat det returnere the "rigtig hardware serie nummer som er tildelt den fysiske disk af producenten", som skrevet af arne_v), men det har jeg ikke set på før. jeg graver lige lidt i det og vender tilbage i morgen.
Avatar billede karas Nybegynder
31. juli 2006 - 22:39 #5
Det rigtige må være at benytte Win32_PhysicalMedia, efter som det skal bruges til licens.

Læg et svar, så skal i få lidt point for hjælpen.
Avatar billede arne_v Ekspert
01. august 2006 - 00:18 #6
svar
Avatar billede bertelbrander Novice
01. august 2006 - 00:29 #7
Jeg samler ikke på point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester