碰到个钉子用户,要求程序不在administrator下运行,可我们的软件做了防拷机制,读的是机器的硬盘序列号加上函数加密,现在发现不在administrator下,硬盘序列号读不到,请问各位有什么好办法?

解决方案 »

  1.   

    读的是物理序列号,不是逻辑号,我在自己机器上试验,换了个用户登陆后就不行了(本来是administrator, 操作系统是 2000 SERVER)
      

  2.   

    这样的丁子户必竟少,那就改读别的玩意嘛,CPU,网卡,主板ID,都可以
      

  3.   

    查了查网上的资料,VC的程序中有用把IDE作为Scsi来读的程序,不需要管理员账号,希望有高手翻译成VB的。这个函数VC程序如下:
    int CGetMachineInfo::ReadIdeDriveAsScsiDriveInNT(void)
    {
    int done = FALSE;
       int controller = 0;   for (controller = 0; controller < 2; controller++)
       {
          HANDLE hScsiDriveIOCTL = 0;
          char   driveName [256];         //  Try to get a handle to PhysicalDrive IOCTL, report failure
             //  and exit if can't.
          sprintf (driveName, "\\\\.\\Scsi%d:", controller);
             //  Windows NT, Windows 2000, any rights should do
          hScsiDriveIOCTL = CreateFile (driveName,
                                   GENERIC_READ | GENERIC_WRITE, 
                                   FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                                   OPEN_EXISTING, 0, NULL);
          // if (hScsiDriveIOCTL == INVALID_HANDLE_VALUE)
          //    printf ("Unable to open SCSI controller %d, error code: 0x%lX\n",
          //            controller, GetLastError ());      if (hScsiDriveIOCTL != INVALID_HANDLE_VALUE)
          {
             int drive = 0;         for (drive = 0; drive < 2; drive++)
             {
                char buffer [sizeof (SRB_IO_CONTROL) + SENDIDLENGTH];
                SRB_IO_CONTROL *p = (SRB_IO_CONTROL *) buffer;
                SENDCMDINPARAMS *pin =
                       (SENDCMDINPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
                DWORD dummy;
       
                memset (buffer, 0, sizeof (buffer));
                p -> HeaderLength = sizeof (SRB_IO_CONTROL);
                p -> Timeout = 10000;
                p -> Length = SENDIDLENGTH;
                p -> ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY;
                strncpy ((char *) p -> Signature, "SCSIDISK", 8);
      
                pin -> irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;
                pin -> bDriveNumber = drive;            if (DeviceIoControl (hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT, 
                                     buffer,
                                     sizeof (SRB_IO_CONTROL) +
                                             sizeof (SENDCMDINPARAMS) - 1,
                                     buffer,
                                     sizeof (SRB_IO_CONTROL) + SENDIDLENGTH,
                                     &dummy, NULL))
                {
                   SENDCMDOUTPARAMS *pOut =
                        (SENDCMDOUTPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
                   IDSECTOR *pId = (IDSECTOR *) (pOut -> bBuffer);
                   if (pId -> sModelNumber [0])
                   {
                      DWORD diskdata [256];
                      int ijk = 0;
                      USHORT *pIdSector = (USHORT *) pId;
              
                      for (ijk = 0; ijk < 256; ijk++)
                         diskdata [ijk] = pIdSector [ijk];                  ReturnInfo (controller * 2 + drive, diskdata);                  done = TRUE;
                   }
                }
             }
             CloseHandle (hScsiDriveIOCTL);
          }
       }   return done;
    }