ITPub博客

首页 > IT职业 > IT职场 > python用WMI等获取及修改windows系统信息

python用WMI等获取及修改windows系统信息

IT职场 作者:hmjie 时间:2021-09-09 10:19:52 0 删除 编辑


    通过查找相关资料,总结了一下python用WMI等获取windows系统信息以及修改系统的相关配置,代码如下(附件中有本代码附件):

#-*- coding:utf-8 -*-

import time

import datetime

import re

import subprocess

import sys

import wmi

import os

import ConfigParser

import _winreg

import win32net

import win32api

import win32con

import win32netcon

import win32security

#DEBUG=True

#DEBUG=False

#LOGFILE=r'c:win.log'

TIME_FORMAT=r'%Y-%m-%d %H:%M:%S'

#c=wmi.WMI(privileges=["Admin","Shutdown","Security"])

#实例化wmi类

c=wmi.WMI()

#定义myWmi类并返回实例化对象

class myWmi(object):

    #定义构造器

    def __init__(self,wmiclass,info={},name=""):

        if name:

            self.obj=wmiclass(Name=name)

        else:

            self.obj=wmiclass()

        self.info=info

        return self.obj

#定义myOs类用于系统信息查询及设置

class myOs(object):

    #定义构造器

    def __init__(self,wmiobj=c,info={}):

        #创建wmi实例

        self.obj=wmiobj.Win32_OperatingSystem()[0]                                          #用于获取计算机运行环境信息

        self.cobj=wmiobj.Win32_ComputerSystem()[0]                                          #用于获取计算机CPU数量,内存大小,主板相关信息

        self.disk_obj= wmiobj.Win32_DiskDrive()                                             #用于获取硬盘相关信息

        self.Partition_obj= wmiobj.Win32_LogicalDisk()                                      #用于获取分区相关信息

        self.networkAdapter_obj = wmiobj.Win32_NetworkAdapterConfiguration (IPEnabled=1)    #用于配置及获取网络连接相关信息

        self.process_obj = wmiobj.Win32_Processor()[0]                                      #用于获取CPU详细信息

        self.update_obj = wmiobj.Win32_QuickFixEngineering()                                #用于获取windows更新补丁相关信息

        self.info=info                                                                      #定义用于存放配置信息的字典

    def get_os_info(self):

        """

                    返回系统相关信息

        """

        self.info["os"]=self.obj.Caption                                                                                         #获取系统版本

        self.info["version"]=self.obj.CSDVersion                                                                                 #操作系统更新版本

        self.info["fullname"]=self.obj.CSName                                                                                    #获取计算机名

        self.info["localtime"]=datetime.datetime.strptime(str(str(self.obj.LocalDateTime ).split('.')[0]),'%Y%m%d%H%M%S')        #获取系统本地时间

        self.info["lastboottime"]=datetime.datetime.strptime(str(str(self.obj.LastBootUpTime ).split('.')[0]),'%Y%m%d%H%M%S')    #获取系统上次启动时间

        self.info["os_architecture"]=self.obj.OSArchitecture                                                                     #获取操作系统类型(32bit/64bit)

        self.info["mu_languages"]=self.obj.MUILanguages[0]                                                                       #获取操作系统语言版本

        self.info["SerialNumber"]=self.obj.SerialNumber                                                                          #获取操作系统序列号

        self.info["cpu_count"]=self.cobj.NumberOfProcessors                                                                      #获取cpu数量

        self.info["mainboard"]=self.cobj.Manufacturer                                                                            #获取主板厂商信息

        self.info["board_model"]=self.cobj.Model                                                                                 #获取主板型号

        self.info["systemtype"]=self.cobj.SystemType                                                                             #获取主板架构类型

        self.info["physical_memory"]=int(self.cobj.TotalPhysicalMemory)/1024/1024                                                #获取内存容量

        self.info["cpu_name"] = self.process_obj.Name                                                                            #获取cpu类型

        self.info["clock_speed"] = self.process_obj.MaxClockSpeed                                                                #获取操作系统主频

        self.info["number_core"] = self.process_obj.NumberOfCores                                                                #获取核心数量

        self.info["data_width"] = self.process_obj.DataWidth                                                                     #获取计算机的CPU数据宽度

        self.info["socket_desigination"] = self.process_obj.SocketDesignation                                                    #获取主板cpu接口类型

        self.info["l2_cache"] = self.process_obj.L2CacheSize                                                                     #获取cpu二级缓存大小

        self.info["l3_cache"] = self.process_obj.L3CacheSize                                                                     #获取cpu三级缓存大小

        return self.info

    #打印补丁更新信息

    def update_information(self):

        output=open(log_path,"a+")

        output.write('n')

        output.write('[Update information]rn')

        for s in self.update_obj:

            output.write('%-10s %-10s %-20s %-10sn' %(s.HotFixID,s.InstalledOn,s.Description,s.InstalledBy))

        output.write('n')

    #打印磁盘信息

    def get_diskinfo(self):

        for item in self.disk_obj:

            output=open(log_path,"a+")

            output.write('n')

            output.write('[disk info]rn')

            for item in self.disk_obj:

                output.write('%-25s Partition: %-3s SN: %-30s %-3sGn' %(item.Caption,str(item.Partitions),item.SerialNumber,str(int(item.Size)/1024/1024/1024)))

                #output.write('%-30s Partition: %-5s SN: %-30s %-10s Gn' %(item.Caption,str(item.Partitions),item.SerialNumber,str((item.Size)/1024/1024/1024)))

                output.write('n')

            break

    #打印磁盘分区信息

    def get_partitioninfo(self):

        Partition_count = len(self.Partition_obj)

        output=open(log_path,"a+")

        output.write('n')

        output.write('[Partition info]rn')

        output.write('rn')

        for x in range(len(self.Partition_obj)):

                if self.Partition_obj[x].DriveType == 3:

                    output.write('DeviceID = %-4s FileSystem = %-5s TotalSize = %-1sG    FreeSpace = %-1sGn' %(self.Partition_obj[x].DeviceID,self.Partition_obj[x].FileSystem,str(int(self.Partition_obj[x].Size)/1024/1024/1024),str(int(self.Partition_obj[x].FreeSpace)/1024/1024/1024)))

                    output.write('n')

    #打印网络配置信息

    def get_networkadapter(self):

        output=open(log_path,"a+")

        output.write('n')

        output.write('[network info]rn')

        for interface in self.networkAdapter_obj:

            output.write('IP Address:  %-10sn' %interface.IPAddress[0])

            output.write('NET Mask:    %-10sn' %interface.IPSubnet[0])

            output.write('Gateway:     %-10sn' %interface.DefaultIPGateway)

            output.write('Pri DNS:     %-10sn' %str(interface.DNSServerSearchOrder[0]))

            output.write('Sec DNS:     %-10sn' %str(interface.DNSServerSearchOrder[1]))

            output.write('Real Mac:    %-10sn' %interface.MACAddress)

            output.write('n')

            break

    #强制关机

    def win32shutdown(self):

        self.obj.Win32Shutdown()

    #重启操作系统

    def reboot(self):

        self.obj.Reboot()

    #关闭操作系统

    def shutdown(self):

        self.obj.Shutdown()

#定义network_config类用于网络设置信息查询及设置

class network_config(object):

    #定义构造器

    def __init__(self,wmiobj=c):

        #实例化对象

        self.obj = wmiobj.Win32_NetworkAdapterConfiguration

    #设置LMHOSTS

    def config_setup(self):

        self.obj.EnableWINS(WINSEnableLMHostsLookup=False)

    #设置dns

    def tcp_config(self):

        interfaces = c.Win32_NetworkAdapterConfiguration(IPEnabled=True)

        device_count = len(interfaces)

        start_num = 0

        dns = ['202.106.196.115','202.106.0.20']

        while True:

            for first_if in interfaces:

                dns_result = first_if.SetDNSServerSearchOrder(DNSServerSearchOrder = dns)

                netbios_result = first_if.SetTcpipNetbios(TcpipNetbiosOptions = 2)

                start_num += 1

                if start_num > device_count:

                    break

            return dns_result,netbios_result

#############################

#                           #

#   Service                 #

#                           #

#############################

#定于myService()类用于系统服务检查及设置

class myService(object):

    """

    control system service

    """

    #定义构造器

    def __init__(self,name="",wmiobj=c,**kargs):

        self.name=name

        kargs={}

        args=""

        if self.name:

            self.obj=wmiobj.Win32_Service(Name=self.name)[0]    #obj in the list

        elif kargs:

            for key in kargs:

                args+=key+'='+'"'+kargs[key]+'"'+','

            args=args[:-1]

            cmd="wmiobj.Win32_Service("+args+")"

            self.obj=eval(cmd)

        else:

            self.obj=wmiobj.Win32_Service()

    def get_service_info(self):

        service_list=[]

        for ser in self.obj:

            service_dict={}

            service_dict["name"]=ser.Name

            service_dict["displayname"]=ser.Caption

            service_dict["pid"]=ser.ProcessID

            service_dict["stat"]=ser.State

            service_dict["startmode"]=ser.StartMode

            service_list.append(service_dict)

        return service_list

    #获取系统服务状态

    def status(self):

        return self.obj.State

    #启动服务

    def start(self):

        self.obj.StartService()

    #停止服务

    def stop(self):

        self.obj.StopService()

    #关闭黑名单中系统服务

    def change_mode(self,mode):

        blacklist_path = sys.path[0]+'/data/svr_blacklist.txt'

        f=open(blacklist_path)

        svr_blacklist = f.readlines()

        f.close()

        for b in svr_blacklist:

            b = b.strip()

            for s in self.obj:

                if  b in s.Name:

                    """

                    Three mode available: Auto, Manual and Disabled

                    """

                    s.ChangeStartMode(mode)

                else:

                    continue

            break

        #obj.ChangeStartMode(mode)

    #删除系统服务

    def delete(self):

        print "You should not delete a service, stop it instead."

#############################

#                           #

#   Process                 #

#                           #

#############################

#定义myProcess类用于进程查看

class myProcess(myWmi):

    def __init__(self,name=""):

        self.name=name

        myWmi.__init__(self,c.Win32_Process,name=self.name)

    def get_process_info(self):

        processlist=[]

        for process in self.obj:

            processlist.append((process.ProcessID,process.Name,process.CreationDate,process.ExecutablePath,process.Caption))

        return processlist

    def get_process_owner(self):

        return self.obj[0].GetOwner()

    def terminate(self):

        self.obj[0].Terminate()

#############################

#                           #

#   Software                #

#                           #

#############################

#定义mySoft类用于安装软件检查

class mySoft(myWmi):

    def __init__(self,name=""):

        self.name=name

        myWmi.__init__(self,c.Win32_Product,name=self.name)

    def get_software(self):

        softlist=[]

        for soft in self.obj:

            softlist.append((soft.Name,soft.InstallDate))

        return softlist

    def uninstall(self):

        #self.obj[0].Uninstall()

        pass

#############################

#                           #

#      User and Group       #

#                           #

#############################

'''

def dump(dict):

    for key,value in dict.items():

        print key,"=",str(value)'''

#定义myAccount类用于帐号检查及设置

class myAccount(myWmi):

    #类构造器

    def __init__(self,name="",group=""):

        self.uname=name

        self.gname=group

        self.uobj=myWmi.__init__(self,c.Win32_UserAccount,name=self.uname)

        self.guobj=myWmi.__init__(self,c.Win32_GroupUser,name=self.gname)

   #返回账户列表

    def show_user_list(self):

        ulist=[]

        for user in self.uobj:

            ulist.append(user.Name)

        return ulist

    #返回禁用的账户列表

    def show_user_info(self,username):

        info=win32net.NetUserGetInfo(None,username,3)

        info["disabled"]=user.Disabled      #Disabled is true means the account is disabled.

        info["status"]=user.Status

        return ulist

    #返回用户组

    def show_user_in_group(self):

        gulist={}

        for gu in self.guobj:

            if gu.GroupComponent.Name not in gulist:

                gulist[gu.GroupComponent.Name]=[gu.PartComponent.Name]

            else:

                gulist[gu.GroupComponent.Name].append(gu.PartComponent.Name)

        return gulist

    #返回管理员用户列表

    def show_userlist_admin(self):

        uresume = 0

        while True:

            admin_list = []

            users, total, uresume = win32net.NetLocalGroupGetMembers (None, 'Administrators', 0, uresume)

            for sid in (u['sid'] for u in users):

                username, domain, type = win32security.LookupAccountSid (None, sid)

                admin_list.append(username)

            return admin_list

            if uresume == 0:

                break

    #获取当前用户

    def get_current_user(self):

        return win32api.GetUserName()

    #删除用户

    def delete_user(self,username):

        win32net.NetUserDel(None,username)

    #添加用户

    def add_user(self,name,passwd,flags=win32netcon.UF_NORMAL_ACCOUNT|win32netcon.UF_SCRIPT,privileges=win32netcon.USER_PRIV_ADMIN):

        udata={}    #user info dict, can be gotten by win32net.NetUserGetInfo

        udata["name"]=name

        udata["password"]=passwd

        udata["flags"]=flags

        udata["priv"]=privileges

        win32net.NetUserAdd(None, 1, udata)

   #设置用户信息

    def modify_user(self,username,udict,level=2):

        win32net.NetUserSetInfo(None,username,level,udict)

    #修改用户密码

    def change_passwd(self,username,oldpass,newpass):

        win32net.NetUserChangePassword(None,username,oldpass,newpass)

    #重命名账户

    def rename_user(self,oldname,newname):

        for item in self.uobj:

            if oldname in item.id:

                item.Rename('admin')

            else:

                continue

#############################

#                           #

#   Registry                #

#                           #

#############################

#定义myRegistry类用于注册表项目检查及设置

class myRegistry(object):

    """

    #print myRegistry().get_value(win32con.HKEY_LOCAL_MACHINE,r'SAMSAMDomainsAccountUsers','Names')

    #myRegistry().add_key(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARETJTG')

    #print myRegistry().list_keys(_winreg.HKEY_LOCAL_MACHINE,r'SAMSAMDomainsAccountUsersNames')

    #myRegistry().add_value(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARETJTG','AtionName','TJ7PP')

    #myRegistry().delete_value(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARETJTG','AtionName')

    #myRegistry().delete_key(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARETJTG')

    #print myRegistry().get_value(_winreg.HKEY_LOCAL_MACHINE,r'SOFTWARETracker Softwarepdfxctrl.PdfPrinterPreferences','XCL_PATH')

    """

    #定义构造函数

    def __init__(self):

        #self.obj=wmi.Registry()

        self.obj=wmi.WMI(namespace='DEFAULT').StdRegProv

    #列出注册表项

    def list_keys(self,root,subkey):

        result,names=self.obj.EnumKey(hDefKey=root,sSubKeyName=subkey)

        if result == 2:

            print "No such keys"

        return names

    #返回对应注册表项键值

    def get_value(self,root,subkey,valuename,type="string"):

        if type == "string":

            result,value = self.obj.GetExpandedStringValue(hDefKey=root,sSubKeyName=subkey,sValueName=valuename)

        elif type == "dword":

            result,value = self.obj.GetDWORDValue(hDefKey=root,sSubKeyName=subkey,sValueName=valuename)

        else:

            result,value = self.obj.GetBinaryValue(hDefKey=root,sSubKeyName=subkey,sValueName=valuename)

        return value

    #添加注册表项

    def add_key(self,root,subkey):

        return self.obj.CreateKey(hDefKey=root,sSubKeyName=subkey)

    #old value can be overwritten

    #设置键值

    def set_value(self,root,subkey,valuename,value,type):

            if type == "string":

                    value = self.obj.SetStringValue(hDefKey=root,sSubKeyName=subkey,sValueName=valuename,sValue=value)

            else:

                    value = self.obj.SetDWORDValue(hDefKey=root,sSubKeyName=subkey,sValueName=valuename,uValue=value)

            return value

    #删除注册表项

    def delete_key(self,root,subkey):

        return self.obj.DeleteKey(root,subkey)

    #删除键值

    def delete_value(self,root,subkey,valuename):

        return self.obj.DeleteValue(root,subkey,valuename)

#获取注册表中用户列表

def get_sys_sid():

    reg_user_list = myRegistry().list_keys(_winreg.HKEY_LOCAL_MACHINE,r'SAMSAMDomainsAccountUsers')

    sid_admin = u'000001F4'

    reg_user_list.remove(sid_admin)

    length =len(reg_user_list)

    key_list = []

    raw_pattern = re.compile(r'^00000')

    n = 0

    while True:

        for m in reg_user_list:

            if raw_pattern.match(m):

                n += 1

                if n < length:

                    key_list.append(m)

                else:

                    break

        break

    return key_list

#检查克隆账户

def chk_clone_account():

    a = get_sys_sid()

    sid_value = myRegistry().get_value(_winreg.HKEY_LOCAL_MACHINE, r'SAMSAMDomainsAccountUsers

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1512/viewspace-2820324/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-15

  • 博文量
    93
  • 访问量
    675