首页 > 编程语言 >python读取电脑产品码

python读取电脑产品码

时间:2023-09-16 23:01:31浏览次数:26  
标签:电脑产品 return 读取 python macDateCode 机器码 rgGUI print def

      开发完一个产品要通过加密解密来保护产品权益和控制运行,其中核心环节是读取电脑硬件信息和加密解密算法。这里介绍一种常用的方法。

# encoding = utf-8
# Time : 2023/09/16 18:36
# S.py 读取电脑产品码
# Author : HiFine

import wmi
import base64
from pyDes import *
import time
import registerGUI          #导入注册界面

from tkinter import *
from tkinter.messagebox import *

rgGUI = None
yxtime = ""           #有效期
Des_key = " Key,需八位"
Des_IV = "自定IV向量\x11\2\x2a\3\1\x27\2\0"
Date_Time = "2026-09-26 00:00:00"                     #定义截止日期

# 获取硬件信息,输出macode
# 1、CPU序列号(ID)  2、本地连接 无线局域网 以太网的MAC  3.硬盘序列号(唯一) 4.主板序列号(唯一)
global s
s = wmi.WMI()
# cpu序列号
def get_CPU_info():
    cpu = []
    cp = s.Win32_Processor()
    for u in cp:
        cpu.append(
            {
                "Name": u.Name,
                "Serial Number": u.ProcessorId,
                "CoreNum": u.NumberOfCores
            }
        )
    return cpu

# 硬盘序列号
def get_disk_info():
    disk = []
    for pd in s.Win32_DiskDrive():
        disk.append(
            {
                "Serial": s.Win32_PhysicalMedia()[0].SerialNumber.lstrip().rstrip(),  # 获取硬盘序列号
                "ID": pd.deviceid,
                "Caption": pd.Caption,
                "size": str(int(float(pd.Size) / 1024 / 1024 / 1024))
            }
        )
    return disk

# mac地址(包括虚拟机)
def get_network_info():
    network = []
    for nw in s.Win32_NetworkAdapterConfiguration():
        if nw.MacAddress != None:
            network.append(
                {
                    "MAC": nw.MacAddress,
                    "ip": nw.IPAddress
                }
            )
    return network

# 主板序列号
def get_mainboard_info():
    mainboard = []
    for board_id in s.Win32_BaseBoard():
        mainboard.append(board_id.SerialNumber.strip().strip('.'))
    return mainboard

# 由于机器码矿太长,故选取机器码字符串部分字符(此处获得机器码用于传给管理员)
def getCombinNumber():
    #a =get_network_info()
    b = get_CPU_info()
    c = get_disk_info()
    d = get_mainboard_info()
    # print('网卡:',a)
    # print('处理器:',b)
    # print('硬盘:',c)
    # print('主板:',d)
    machinecode_str = ""
    machinecode_str = machinecode_str + b[0]['Serial Number'] + c[0]['Serial'] + d[0]
    #machinecode_str = machinecode_str + a[0]['MAC'] + b[0]['Serial Number'] + c[0]['Serial'] + d[0]
    #print('机器码数据:',machinecode_str)
    #selectIndex = [8, 10, 15, 16, 17, 30, 32, 38, 43, 46]
    selectIndex = [随机正整数]
    macode = ""
    for i in selectIndex:
        macode = macode + machinecode_str[i]
        #print(machinecode_str[i])
    return macode

#合并得到授权码(包含机器码和日期)
def get_ComMacdate():
    macDateCode = getCombinNumber() + Date_Time
    return macDateCode

# DES+base64加密机器码+授权时间
def Encryted(tr):
    k = des(Des_key, CBC, Des_IV, pad=None, padmode=PAD_PKCS5)
    EncryptStr = k.encrypt(tr)
    return base64.b32encode(EncryptStr)  # 转base64编码返回

# base64+DES解密机器码+授权时间
def Dncryted(EncryptStr):
    bas1 = base64.b32decode(EncryptStr)        #先对加密后的对象解密
    k = des(Des_key, CBC, Des_IV, pad=None, padmode=PAD_PKCS5)
    tr = k.decrypt(bas1)
    return tr

#从加密后的授权码中将日期解析出来(传入字符串即可,里面自动转换成bytes类型,好用于解码)
def jiexi_datetime(jiami_macDateCode):
    #对从注册文件中的进行还原成bytes类型
    jiami_macDateCode = bytes(jiami_macDateCode, encoding='utf-8')
    #print(jiami_macDateCode)
    #将解密得到机器码+日期
    try:
        jiemi_macDateCode = Dncryted(jiami_macDateCode)
    except:
        return None
    #print('jiemi_macDateCode',jiemi_macDateCode)
    jiemi_macDateCode = str(jiemi_macDateCode).replace("b'", '').replace("'", '')  # 将授权码变成字符串

    maccode = getCombinNumber()          #获得本机的机器码
    maccode = str(maccode).replace("b'",'').replace("'",'')  #将机器码变成字符串
    #print('本机机器码',maccode)             :001B6AXH8
    #如果本机机器码在授权码中
    if maccode in jiemi_macDateCode:
        Datetime = jiemi_macDateCode.replace(maccode,'')    #将机器码替换就得到日期了
    else:
        return None
    return Datetime             #2023-09-16 00:00:00


#判断当前日期是否大于有效截止期
def check_time(Datetime):
    nowtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    if nowtime > Datetime:
        #print("已过期,无法正常使用")
        return False
    else:
        #print("未过期,可正常使用")
        return True

# 用于检查验证注册信息的唯一及有效日期
def checkAuthor():
    global rgGUI
    global yxtime
    try:
        with open('./DATA/register.txt', 'r') as f:
            key = f.read()    #读取所有信息
    except:
        return False

    key = key.strip()  # 去除换行符的影响
    #print(key)
    #print(type(key))
    datetime =jiexi_datetime(key)        #对key的内容解析,解析成功不是None,说明是本机唯一验证码
    if datetime==None:        
        # 隐藏以tk开头的弹窗
        root = Tk()
        root.withdraw()
        root.iconbitmap('./images/tb02.ico')        
        #弹出提示信息
        messagebox.showinfo(title='提示',message='请输入正确的注册码完成注册')#注册码错误请重新输入
        #print("非本机注册码,无效")
        return False
    else:
        if check_time(datetime):            
            yxtime = datetime               #获得截止日期
            return True
        else:
            # 隐藏以tk开头的弹窗
            root = Tk()
            root.withdraw()
            root.iconbitmap('./images/tb02.ico')
            #弹出提示信息
            messagebox.showinfo(title='提示',message='注册码已过期!')
            #print("已过期,无法使用")
            return False


#用于点击按钮进行注册(即保存注册信息)
def regis():
    global rgGUI
    global yxtime
    key = rgGUI.message.get('0.0','end')   #获取text中的全部内容
    #print(key)

    # 读写文件要加判断(将内容写入注册文件中)
    with open('./DATA/register.txt', 'w') as f:
        f.write(key)

    #注册信息后立即进行验证
    if checkAuthor():
        rgGUI.root.destroy()    #销毁窗口并进入下一环节
        # 进入主界面
        maingui = mainGUI.mainGUI()
        maingui.yxqL['text'] = "有效期截止到:"+yxtime + "\n" + "\n" +"请关闭页面重新登陆"
        maingui.root.mainloop()
    else:
        #验证失败返回到注册界面
        return

#该函数用来将需要的字符串或文字复制到剪切板.
def Copy_To_Clipboard(string):
    from tkinter import Tk
    r = Tk()
    r.withdraw()
    r.clipboard_clear()
    r.clipboard_append(string)
    r.update()

# 粘贴事件函数(将粘贴板上的信息粘贴入文本框(message))
def callback(event=None):    
    rgGUI.message.event_generate('<<Paste>>')

#显示注册窗口
def show_reg():

    ma1 = getCombinNumber()  # 获得本机机器码,并将其显示在界面上:001B6AXH8
    global rgGUI
    rgGUI = registerGUI.registerMGUI(version="1.2")  # 创建界面窗口对象(包含窗口及其各个控件)
    #rgGUI.button_start.bind("<Button-1>", lambda x: regis())  # 点击注册
    rgGUI.button_copy1.bind("<Button-1>", lambda x: Copy_To_Clipboard(ma1)) #复制产品码到粘贴板
    #rgGUI.button_paste.bind("<Button-1>", callback) #将粘贴板上的信息粘贴到文本框
    rgGUI.alert(ma1)  # 将机器码显示在窗口界面
    #print(ma1)
    #rgGUI.root.attributes("-topmost", True)
    # 手动加入消息队列
    rgGUI.root.mainloop() 
if __name__ == '__main__':
    show_reg()

      运行测试结果如下:

python读取电脑产品码_字符串

标签:电脑产品,return,读取,python,macDateCode,机器码,rgGUI,print,def
From: https://blog.51cto.com/u_14629072/7496847

相关文章

  • python实现猜拳小游戏
    功能需求假设石头剪刀布分别由1,2,3代表,程序在石头剪刀布中随机生成一个结果,根据用户输入的结果判断用户的输赢。用户输赢和平局否需要打印出结果。石头赢剪刀剪刀赢布布赢石头功能分析1:定义猜拳的手势、名称和结果2:定义一个函数get_user_gesture()获取用户的手势信息,并且需要考虑......
  • python | 连接数据库
    介绍一些python中用于连接常用数据库的依赖库。SQLite3SQLite3是Python中自带的数据库模块,适用于小型应用和快速原型开发。SQLite是一个进程内的库,实现了自给自足的、无服务器的、是非常小的,是轻量级的、事务性的SQL数据库引擎。它是一个零配置的数据库,不需要在系统中配置......
  • Python 基本操作
    Python语法可以直接在命令行中编写并执行:>>>print("Hello,World!")Hello,World!或者,可以在服务器上创建一个带有.py文件扩展名的Python文件,并在命令行中运行它:C:\Users\YourName>pythonmyfile.pyPython缩进缩进是指代码行开头的空格。在其他编程语言中,代码中的缩进......
  • Python-day9
    #集合和元组#可变序列可以增删改操作:列表、字典、集合#不可变序列不可以增删改操作:字符串、元组str='beabetterperson,'print(id(str))str=str+'thisisouragreement'print(str)print(id(str))#元组的创建&元组只有一个元素的创建&空元组Y1=('I','like','grape',......
  • Python的模块调用给包的使用
    Python的模块调用给包的使用名字查找顺序模块的相对导入和绝对导入包的使用软件开放目录命名规范正则表达式(简单了解)名字查找顺序以后再给文件名或者叫模块名起名字的时候一定不能跟内置模块名冲突1.先从内存中查找2.再从内置模块中查找3.最后去环境变量sys.path......
  • Python分享之对象的属性
    Python一切皆对象(object),每个对象都可能有多个属性(attribute)。Python的属性有一套统一的管理方案。属性的__dict__系统对象的属性可能来自于其类定义,叫做类属性(classattribute)。类属性可能来自类定义自身,也可能根据类定义继承来的。一个对象的属性还可能是该对象实例定义的,......
  • python 正则表达式之 怎么匹配一对中括号 [ ]
    ----------------------------------------------------------------------------------------在正则表达式中,前中括号[属于特殊字符,要匹配它,需要转义,那就加上转义字符\来进行转义,即加上\res=re.findall(r"\[[\dA-Z]*]",'AAAA[CEBT905A1B6A]/#')print(res)------[......
  • 用Python编写的FTP CLIENT端脚本
    1importftplib,os2temp=os.environ["temp"]3#参考连接:https://blog.csdn.net/wyt2wyt/article/details/1289510394ftp=ftplib.FTP()5ftp.connect("127.0.0.1",2121)6ftp.login("user","123456789")78defuplo......
  • 个人项目:Python实现简易论文查重
    这个作业属于哪个课程软件工程这个作业要求在哪里个人项目这个作业的目标个人项目,实现论文查重功能本项目上传至个人GitHub:yulinnn/3121004802项目需求题目:论文查重描述如下:设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论......
  • 用Python编写的FTP SERVER端脚本
    1frompyftpdlib.authorizersimportDummyAuthorizer2frompyftpdlib.handlersimportFTPHandler,ThrottledDTPHandler3frompyftpdlib.serversimportFTPServer4frompyftpdlib.logimportLogFormatter5importlogging67#记录日志,这里既输出到屏幕又输......