什么能唯一标示一台电脑。

有道无术 2014-12-06 02:54:13
我要开发一个网络验证系统。用户试用软件的时候获取一个唯一标示上传到数据库,当用户试用的时候判断这个唯一标示是不是数据库里已经存在,存在就说明已经试用过了。

我尝试使用网上的什么 CPU编号,硬盘序列号。。

        string GetDiskID()
{
try
{
//获取硬盘ID
String HDid = "";
ManagementClass mc = new ManagementClass("Win32_DiskDrive");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
HDid = (string)mo.Properties["Model"].Value;
}
moc = null;
mc = null;
return HDid;
}
catch
{
return "unknow";
}
finally
{
}
}




        public String GetCpuID()
{
try
{
ManagementClass mc = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mc.GetInstances();

String strCpuID = null;
foreach (ManagementObject mo in moc)
{
strCpuID = mo.Properties["ProcessorId"].Value.ToString();
break;
}
return strCpuID;
}
catch
{
return "";
}

}





但是后来发现,两个用户的cpu编号完全相同。
后来使用 MD5(CPU编号+硬盘序列号),然后又发现。
两个用户的值还是相同。电脑是同一批次,配置一样。





难道要 MD5(cpu编号+硬盘编号+mac地址) 么

mac地址不是可以修改,改完了mac是不是可以继续试用。。



求好的解决方案。。。
...全文
1964 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
愈来愈好 2017-01-16
  • 打赏
  • 举报
回复
引用 16 楼 mosangbike 的回复:
[quote=引用 14 楼 yifangtao 的回复:] [quote=引用 8 楼 sp1234 的回复:] 首先,跟最初的问题一样,你以为的东西结果是“一片空白”,往往取不到值。 其次,你会发现一旦用起来,麻烦接踵而至。如果你没有遇到过大量“编码改变”而必须给人家确认为“合理改动”的情况,那么可能你只是在自己公司里意淫的阶段。 第三,市场........自己想吧。
我最烦你这种装逼货[/quote] 我也很烦那个装B的[/quote] 我也很烦。重点是不管哪个帖子,这个大神总要怼几句。
苏门答腊 2017-01-13
  • 打赏
  • 举报
回复
引用 14 楼 yifangtao 的回复:
[quote=引用 8 楼 sp1234 的回复:] 首先,跟最初的问题一样,你以为的东西结果是“一片空白”,往往取不到值。 其次,你会发现一旦用起来,麻烦接踵而至。如果你没有遇到过大量“编码改变”而必须给人家确认为“合理改动”的情况,那么可能你只是在自己公司里意淫的阶段。 第三,市场........自己想吧。
我最烦你这种装逼货[/quote] 我也很烦那个装B的
quentin66 2016-11-24
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
首先,跟最初的问题一样,你以为的东西结果是“一片空白”,往往取不到值。 其次,你会发现一旦用起来,麻烦接踵而至。如果你没有遇到过大量“编码改变”而必须给人家确认为“合理改动”的情况,那么可能你只是在自己公司里意淫的阶段。 第三,市场........自己想吧。
认同你的观点,我们的精力不应该是放在设置各种限制,而在于优化功能增强用户体验。除非做的是特定行业
software_artisan 2014-12-07
  • 打赏
  • 举报
回复
楼上的思路才是正确的!
threenewbee 2014-12-06
  • 打赏
  • 举报
回复
要想限制用户使用很简单,你可以采用短信验证的方法,用户很难伪造手机号。 也可以使用信用卡,同样的道理,用户不太可能为了试用你的软件办很多很多信用卡。
threenewbee 2014-12-06
  • 打赏
  • 举报
回复
(1)说了很多很多次,CPU ID不是唯一的。相同CPU ID的处理器有上亿个。 (2)没有办法表示一台唯一的电脑,如果你用过VMWare,或者Bochs就会知道,一台物理电脑可以虚拟出无穷多的虚拟机,它们在软件看来都是独立的计算机。
泡泡龙 2014-12-06
  • 打赏
  • 举报
回复
网上代码很多的,不过只有一个函数在管理员和非管理员权限下的返回值是相同的,WMI不行
有道无术 2014-12-06
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
首先,跟最初的问题一样,你以为的东西结果是“一片空白”,往往取不到值。 其次,你会发现一旦用起来,麻烦接踵而至。如果你没有遇到过大量“编码改变”而必须给人家确认为“合理改动”的情况,那么可能你只是在自己公司里意淫的阶段。 第三,市场........自己想吧。
你说的啥,没看懂就不要在这说。你家的软件都是用之前先远程验脸的吗。你是传说中的大神么。
  • 打赏
  • 举报
回复
首先,跟最初的问题一样,你以为的东西结果是“一片空白”,往往取不到值。 其次,你会发现一旦用起来,麻烦接踵而至。如果你没有遇到过大量“编码改变”而必须给人家确认为“合理改动”的情况,那么可能你只是在自己公司里意淫的阶段。 第三,市场........自己想吧。
powerat123 2014-12-06
  • 打赏
  • 举报
回复
一般是获取硬盘序列号。
capry0518 2014-12-06
  • 打赏
  • 举报
回复
一般都还要加上网卡ID的嘛
失落的神庙 2014-12-06
  • 打赏
  • 举报
回复
自己改改。 有少量的获取不到的 。前提是要有管理员权限。
失落的神庙 2014-12-06
  • 打赏
  • 举报
回复
 #endregion

        #region GetHddInfoNT

        private static HardDiskInfo GetHddInfoNT(byte driveIndex)
        {
            GetVersionOutParams vers = new GetVersionOutParams();
            SendCmdInParams inParam = new SendCmdInParams();
            SendCmdOutParams outParam = new SendCmdOutParams();
            uint bytesReturned = 0;

            // We start in NT/Win2000 
            IntPtr hDevice = CreateFile(
                string.Format(@"//./PhysicalDrive{0}", driveIndex),
                GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                IntPtr.Zero,
                OPEN_EXISTING,
                0,
                IntPtr.Zero);
            if (hDevice == IntPtr.Zero)
            {
                throw new Exception("");
            }
            if (0 == DeviceIoControl(
                hDevice,
                DFP_GET_VERSION,
                IntPtr.Zero,
                0,
                ref vers,
                (uint)Marshal.SizeOf(vers),
                ref bytesReturned,
                IntPtr.Zero))
            {
                CloseHandle(hDevice);
                throw new Exception(string.Format("Drive {0} may not exists.", driveIndex + 1));
            }
            // If IDE identify command not supported, fails 
            if (0 == (vers.fCapabilities & 1))
            {
                CloseHandle(hDevice);
                throw new Exception("");
            }
            // Identify the IDE drives 
            if (0 != (driveIndex & 1))
            {
                inParam.irDriveRegs.bDriveHeadReg = 0xb0;
            }
            else
            {
                inParam.irDriveRegs.bDriveHeadReg = 0xa0;
            }
            if (0 != (vers.fCapabilities & (16 >> driveIndex)))
            {
                // We don't detect a ATAPI device. 
                CloseHandle(hDevice);
                throw new Exception(string.Format("Drive {0} is a ATAPI device. we don't detect it.", driveIndex + 1));
            }
            else
            {
                inParam.irDriveRegs.bCommandReg = 0xec;
            }
            inParam.bDriveNumber = driveIndex;
            inParam.irDriveRegs.bSectorCountReg = 1;
            inParam.irDriveRegs.bSectorNumberReg = 1;
            inParam.cBufferSize = 512;

            if (0 == DeviceIoControl(
                hDevice,
                DFP_RECEIVE_DRIVE_DATA,
                ref inParam,
                (uint)Marshal.SizeOf(inParam),
                ref outParam,
                (uint)Marshal.SizeOf(outParam),
                ref bytesReturned,
                IntPtr.Zero))
            {
                CloseHandle(hDevice);
                throw new Exception("");
            }
            CloseHandle(hDevice);

            return GetHardDiskInfo(outParam.bBuffer);
        }

        #endregion

        private static HardDiskInfo GetHardDiskInfo(IdSector phdinfo)
        {
            HardDiskInfo hddInfo = new HardDiskInfo();

            ChangeByteOrder(phdinfo.sModelNumber);
            hddInfo.ModuleNumber = Encoding.ASCII.GetString(phdinfo.sModelNumber).Trim();

            ChangeByteOrder(phdinfo.sFirmwareRev);
            hddInfo.Firmware = Encoding.ASCII.GetString(phdinfo.sFirmwareRev).Trim();

            ChangeByteOrder(phdinfo.sSerialNumber);
            hddInfo.SerialNumber = Encoding.ASCII.GetString(phdinfo.sSerialNumber).Trim();

            hddInfo.Capacity = phdinfo.ulTotalAddressableSectors / 2 / 1024;

            return hddInfo;
        }

        private static void ChangeByteOrder(byte[] charArray)
        {
            byte temp;
            for (int i = 0; i < charArray.Length; i += 2)
            {
                temp = charArray[i];
                charArray[i] = charArray[i + 1];
                charArray[i + 1] = temp;
            }
        }

        #endregion

        static bool b=false;

        public static bool Mac
        {
            get 
            {
                string Guidstr___ = string.Empty;
                string HardId = string.Empty;
                string Pid = string.Empty;
                if (File.Exists(Application.StartupPath + "\\Data\\Serial.txt"))
                {
                    try
                    {
                        StreamReader sr = new StreamReader(Application.StartupPath + "\\Data\\Serial.txt", Encoding.Default);
                        string Tempstr = sr.ReadToEnd();
                        sr.Close();
                        Guidstr___ = Tempstr.Replace("\r\n", "|").Split('|')[0].Trim();
                        Pid = md5(Guidstr___ + HardId + "100weiyingxiao", 32);
                    }
                    catch
                    {
                        return false;
                    }
                }
                else
                {
                    try
                    {
                        HardId = AtapiDevice.GetHddInfo(0).SerialNumber;
                    }
                    catch
                    {
                        HardId = "";
                    }
                    if ((HardId == "" || HardId.Contains(".") || HardId.Contains("error")) && Guidstr___ == "")
                    {
                        Guidstr___ = Guid.NewGuid().ToString();
                        StreamWriter sw = new StreamWriter(Application.StartupPath + "\\Data\\Serial.txt", false);
                        sw.Write(Guidstr___ + "\r\n");
                        sw.Close();

                        Pid = md5(Guidstr___ + HardId + "100weiyingxiao", 32);
                    }
                    else
                    {
                        Pid = md5(Guidstr___ + HardId + "100weiyingxiao", 32);
                    }
                }
                if (Properties.Settings.Default.MacCode != string.Empty && Properties.Settings.Default.MacCode != Pid)
                {
                    Application.Exit();
                    return false;
                }
                else
                    Properties.Settings.Default.MacCode = Pid;
                return true;
            }
            private set { b = value; }
        }
        static string md5(string str, int code)
        {
            if (code == 16)
            {
                return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(8, 16);
            }
            else
            {
                return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
            }
        }
失落的神庙 2014-12-06
  • 打赏
  • 举报
回复
 [Serializable]
    public struct HardDiskInfo
    {
        /// <summary> 
        /// 型号 
        /// </summary> 
        public string ModuleNumber;
        /// <summary> 
        /// 固件版本 
        /// </summary> 
        public string Firmware;
        /// <summary> 
        /// 序列号 
        /// </summary> 
        public string SerialNumber;
        /// <summary> 
        /// 容量,以M为单位 
        /// </summary> 
        public uint Capacity;
    }

    #region Internal Structs

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    internal struct GetVersionOutParams
    {
        public byte bVersion;
        public byte bRevision;
        public byte bReserved;
        public byte bIDEDeviceMap;
        public uint fCapabilities;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public uint[] dwReserved; // For future use. 
    }

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    internal struct IdeRegs
    {
        public byte bFeaturesReg;
        public byte bSectorCountReg;
        public byte bSectorNumberReg;
        public byte bCylLowReg;
        public byte bCylHighReg;
        public byte bDriveHeadReg;
        public byte bCommandReg;
        public byte bReserved;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    internal struct SendCmdInParams
    {
        public uint cBufferSize;
        public IdeRegs irDriveRegs;
        public byte bDriveNumber;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public byte[] bReserved;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public uint[] dwReserved;
        public byte bBuffer;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    internal struct DriverStatus
    {
        public byte bDriverError;
        public byte bIDEStatus;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
        public byte[] bReserved;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
        public uint[] dwReserved;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    internal struct SendCmdOutParams
    {
        public uint cBufferSize;
        public DriverStatus DriverStatus;
        public IdSector bBuffer;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 512)]
    internal struct IdSector
    {
        public ushort wGenConfig;
        public ushort wNumCyls;
        public ushort wReserved;
        public ushort wNumHeads;
        public ushort wBytesPerTrack;
        public ushort wBytesPerSector;
        public ushort wSectorsPerTrack;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public ushort[] wVendorUnique;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
        public byte[] sSerialNumber;
        public ushort wBufferType;
        public ushort wBufferSize;
        public ushort wECCSize;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public byte[] sFirmwareRev;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
        public byte[] sModelNumber;
        public ushort wMoreVendorUnique;
        public ushort wDoubleWordIO;
        public ushort wCapabilities;
        public ushort wReserved1;
        public ushort wPIOTiming;
        public ushort wDMATiming;
        public ushort wBS;
        public ushort wNumCurrentCyls;
        public ushort wNumCurrentHeads;
        public ushort wNumCurrentSectorsPerTrack;
        public uint ulCurrentSectorCapacity;
        public ushort wMultSectorStuff;
        public uint ulTotalAddressableSectors;
        public ushort wSingleWordDMA;
        public ushort wMultiWordDMA;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
        public byte[] bReserved;
    }

    #endregion

    /// <summary> 
    /// ATAPI驱动器相关 
    /// </summary> 
    public class AtapiDevice
    {

        #region DllImport

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern int CloseHandle(IntPtr hObject);

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr CreateFile(
            string lpFileName,
            uint dwDesiredAccess,
            uint dwShareMode,
            IntPtr lpSecurityAttributes,
            uint dwCreationDisposition,
            uint dwFlagsAndAttributes,
            IntPtr hTemplateFile);

        [DllImport("kernel32.dll")]
        static extern int DeviceIoControl(
            IntPtr hDevice,
            uint dwIoControlCode,
            IntPtr lpInBuffer,
            uint nInBufferSize,
            ref GetVersionOutParams lpOutBuffer,
            uint nOutBufferSize,
            ref uint lpBytesReturned,
            [Out] IntPtr lpOverlapped);

        [DllImport("kernel32.dll")]
        static extern int DeviceIoControl(
            IntPtr hDevice,
            uint dwIoControlCode,
            ref SendCmdInParams lpInBuffer,
            uint nInBufferSize,
            ref SendCmdOutParams lpOutBuffer,
            uint nOutBufferSize,
            ref uint lpBytesReturned,
            [Out] IntPtr lpOverlapped);

        const uint DFP_GET_VERSION = 0x00074080;
        const uint DFP_SEND_DRIVE_COMMAND = 0x0007c084;
        const uint DFP_RECEIVE_DRIVE_DATA = 0x0007c088;

        const uint GENERIC_READ = 0x80000000;
        const uint GENERIC_WRITE = 0x40000000;
        const uint FILE_SHARE_READ = 0x00000001;
        const uint FILE_SHARE_WRITE = 0x00000002;
        const uint CREATE_NEW = 1;
        const uint OPEN_EXISTING = 3;

        #endregion

        #region GetHddInfo

        /// <summary> 
        /// 获得硬盘信息 
        /// </summary> 
        /// <param name="driveIndex">硬盘序号</param> 
        /// <returns>硬盘信息</returns> 
        /// <remarks> 
        /// 参考lu0的文章:http://lu0s1.3322.org/App/2k1103.html 
        /// by sunmast for everyone 
        /// thanks lu0 for his great works 
        /// 在Windows 98/ME中,S.M.A.R.T并不缺省安装,请将SMARTVSD.VXD拷贝到%SYSTEM%/IOSUBSYS目录下。 
        /// 在Windows 2000/2003下,需要Administrators组的权限。 
        /// </remarks> 
        /// <example> 
        /// AtapiDevice.GetHddInfo() 
        /// </example> 
        public static HardDiskInfo GetHddInfo(byte driveIndex)
        {
            switch (Environment.OSVersion.Platform)
            {
                case PlatformID.Win32Windows:
                    return GetHddInfo9x(driveIndex);
                case PlatformID.Win32NT:
                    return GetHddInfoNT(driveIndex);
                case PlatformID.Win32S:
                    throw new NotSupportedException("");
                case PlatformID.WinCE:
                    throw new NotSupportedException("");
                default:
                    throw new NotSupportedException("");
            }
        }

        #region GetHddInfo9x

        private static HardDiskInfo GetHddInfo9x(byte driveIndex)
        {
            GetVersionOutParams vers = new GetVersionOutParams();
            SendCmdInParams inParam = new SendCmdInParams();
            SendCmdOutParams outParam = new SendCmdOutParams();
            uint bytesReturned = 0;

            IntPtr hDevice = CreateFile(
                @"//./Smartvsd",
                0,
                0,
                IntPtr.Zero,
                CREATE_NEW,
                0,
                IntPtr.Zero);
            if (hDevice == IntPtr.Zero)
            {
                throw new Exception("");
            }
            if (0 == DeviceIoControl(
                hDevice,
                DFP_GET_VERSION,
                IntPtr.Zero,
                0,
                ref vers,
                (uint)Marshal.SizeOf(vers),
                ref bytesReturned,
                IntPtr.Zero))
            {
                CloseHandle(hDevice);
                throw new Exception("");
            }
            // If IDE identify command not supported, fails 
            if (0 == (vers.fCapabilities & 1))
            {
                CloseHandle(hDevice);
                throw new Exception("");
            }
            if (0 != (driveIndex & 1))
            {
                inParam.irDriveRegs.bDriveHeadReg = 0xb0;
            }
            else
            {
                inParam.irDriveRegs.bDriveHeadReg = 0xa0;
            }
            if (0 != (vers.fCapabilities & (16 >> driveIndex)))
            {
                // We don't detect a ATAPI device. 
                CloseHandle(hDevice);
                throw new Exception(string.Format("Drive {0} is a ATAPI device, we don't detect it", driveIndex + 1));
            }
            else
            {
                inParam.irDriveRegs.bCommandReg = 0xec;
            }
            inParam.bDriveNumber = driveIndex;
            inParam.irDriveRegs.bSectorCountReg = 1;
            inParam.irDriveRegs.bSectorNumberReg = 1;
            inParam.cBufferSize = 512;
            if (0 == DeviceIoControl(
                hDevice,
                DFP_RECEIVE_DRIVE_DATA,
                ref inParam,
                (uint)Marshal.SizeOf(inParam),
                ref outParam,
                (uint)Marshal.SizeOf(outParam),
                ref bytesReturned,
                IntPtr.Zero))
            {
                CloseHandle(hDevice);
                throw new Exception("");
            }
            CloseHandle(hDevice);

            return GetHardDiskInfo(outParam.bBuffer);
        }
  • 打赏
  • 举报
回复
嗯,现在视频也有假的。你在视频验证的时候,还要对方按照你得命令“捏捏鼻子、做个鬼脸儿”之类的才行啊。
  • 打赏
  • 举报
回复
电脑的使用者不同,你就让每一个人使用你程序时必须给你视频验证一下吧。

110,525

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧