wxpython 实现远程自动连接

时间:2022-06-25 07:13:18

前端测试组需要经常连接远程机器测试兼容性(我们不用虚拟机或是IEtester),所以写了一个远程连接的工具,支持自动登录,不需要输入IP和帐户名密码
windows的自动连接实际上是,你在链接时,选择保存帐户名和密码,这时候系统会自动给你生成一个RDP的文件,里边保存了信息,下次再连接时,实际直接使用的RDP进行连接
也可以直接将RDP保存到桌面下次直接连,不过我不喜欢桌面上一对文件,还是写个软件好了


1.通过远程python发送远程连接命令mstsc
MSTSC [<Connection File>] [/v:<sever[:port]>] [/console] [/f[ullscreen]]
  [/w:<width> /h:<height>] | /Edit"ConnectionFile" | /Migrate | /?
  <Connection File> -- 指定连接的 .rdp 文件的名称。
  /v:<sever[:port]> -- 指定要连接到的终端服务器。
  /console -- 连接到服务器的控制台会话。
  /f -- 以全屏模式启动客户端。
  /w: <width> -- 指定远程桌面屏幕的宽度。
  /h:<height> -- 指定远程桌面屏幕的亮度。
  /edit -- 打开指定的 .rdp 文件来编辑。
  /migrate -- 将客户端连接管理器创建的旧版连接文件迁移到新的 .rdp 连接文件。
  /? -- 生成这个用法消息。运行 mstsc /v:IP /console
具体使用可百度
2.使用wxPython画程序的GUI界面,GUI界面分两部分(VERTICAL)排列,上边是一个时钟(自己感觉挺好看就加上了,无意义,装13用的哈哈),下边是所有远程机器的连接按钮
3.无菜单栏和状态来,喜欢的可以自己加,支持最小化程序,双击托盘展示程序,邮件托盘菜单,程序右上角的关闭按钮改成了最小化,无法关闭程序
4.软件给别人用时,会自动根据其机器生产一个RDP文件


下面是程序,本人也是刚开始写wxpython,很多地方自己还没有完善,必须没有判断程序是否已经启动,下次在启动时应弹出软件已经运行,欢迎指出不足


# -*- coding:utf-8 -*-
import wx
import wx.lib.analogclock as ac
import wx.lib.agw.aquabutton as AB
import wx.gizmos as gizmos
import time
import random,os,sys
import binascii
import win32crypt,cmd


u_pwd = unicode('123456')   #密码
pwdHash = win32crypt.CryptProtectData(u_pwd,u'',None,None,None,0)
pwd = 'password 51:b:' + binascii.hexlify(pwdHash).upper() #密码加密


uname = 'username:s:' #RDP文件的用户名前缀(他就这么用的、、、)
keys = ['IE6', 'IE7', 'IE8', 'IE9', 'IE10', 'win32IE11', 'win64IE11']

for mname in keys:
    if not os.path.exists('./rdp/'+mname+'.rdp'):
        model = open('./model/'+mname+'.txt')
        mdate = model.read()
        new = open('./rdp/'+mname+'.rdp', 'w')
        new.write(mdate)
        new.write(uname+"admin")
        new.write("\n")
        new.write(pwd)
        new.close()
#程序目录下有两个文件夹,一个是model,一个rdp,model里存放的是我保存的所有机器的rdp文件,删除了最后两行的用户名密码,rdp文件夹下是我讲model文件读过来,然后再最后两行加上了用户名和密码,因为每个人生产的加密密码都不一样,直接使用我的rdp文件无法连接


class Mytime(wx.Panel): #这个画布是放了一个时钟效果
    #时钟方法,然后添加到boxsizer中
    def __init__(self,parent):
        wx.Panel.__init__(self,parent)
        self.SetBackgroundColour("blue")
        
        #时钟效果
        led = gizmos.LEDNumberCtrl(self,-1,(0,0),(300,50),gizmos.LED_ALIGN_CENTER)
        self.clock = led
        self.timer = wx.Timer(self)
        self.timer.Start(1000)
        self.Bind(wx.EVT_TIMER,self.OnTimer)
        
    def OnTimer(self,evt):
        t = time.localtime(time.time())
        st = time.strftime("%I-%M-%S",t)
        self.clock.SetValue(st)

class MyButton(wx.Panel):
    #-------------远程链接按钮---------------------------------------------------------
    def __init__(self,parent):
        """"""
        wx.Panel.__init__(self,parent,-1)
        self.SetBackgroundColour(wx.Colour(0,255,255))

        box = wx.BoxSizer(wx.VERTICAL) #设置上下方式的布局
        font = wx.Font(18, wx.DECORATIVE, wx.ITALIC, wx.NORMAL)
        #按钮数据
        self.date={"IE6":"./rdp/IE6.rdp",
                   "IE7":"./rdp/IE7.rdp",
                   "IE8":"./rdp/IE8.rdp",
                   "IE9":"./rdp/IE9.rdp",
                   "IE10":"./rdp/IE10.rdp",
                   "32IE11":"./rdp/win32IE11.rdp",
                   "64IE11":"./rdp/win64IE11.rdp"}
        #循环输出按钮
        self.buttonid={}
        for buttonname in self.date: #循环输出按钮,颜色随机
            
            r = random.randint(0, 255)
            g = random.randint(0, 255)
            b = random.randint(0, 255) 
            
            btn = AB.AquaButton(self,-1,None,buttonname)
            box.Add(btn,1,wx.EXPAND |wx.EAST| wx.WEST,5)
            btn.SetBackgroundColor(wx.Colour(r,g,b))
            btn.SetHoverColor(wx.Colour(g,r,b))
            btn.SetForegroundColour("black")
            btn.SetFont(font)
            self.Bind(wx.EVT_BUTTON, self.OnClick, btn) #绑定连接远程机器的事件
            self.buttonid[btn.GetId()]= buttonname
        self.SetSizer(box)
        
    def OnClick(self,evt):   #点击按钮的事件
        ip = self.date[self.buttonid[evt.GetId()]]
        os.system("mstsc %s /console " % ip)
        
        
class MyFrame(wx.Frame): #主窗口
    def __init__(self):
        wx.Frame.__init__(self,None,- 1, u"远程链接", size=(300,450),style=wx.DEFAULT_FRAME_STYLE)
        #self.SetBackgroundColour('black')
        #设置程序图标
        self.SetMaxSize((300,500))
        self.ICON = wx.Icon("2.ico",wx.BITMAP_TYPE_ICO)
        self.SetIcon(self.ICON)
        
        mytime = Mytime(self)
        mybutton = MyButton(self)
        
        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(mytime,-1,wx.EXPAND|wx.ALL)
        box.Add(mybutton,2,wx.EXPAND|wx.ALL)
        self.SetSizer(box)
        
        self.taskBarIcon = TaskBarIcon(self)
        self.Bind(wx.EVT_CLOSE,self.OnClose)
        self.Bind(wx.EVT_ICONIZE,self.OnIconfiy)
        
        

    
    #点击最小化时,隐藏界面,到托盘    
    def OnIconfiy(self,event):
        self.Hide()
    
    #点击关闭时,隐藏界面,到托盘 
    def OnClose(self,event):
        self.Hide()
        
########################################################################
class TaskBarIcon(wx.TaskBarIcon):
    #最小化托盘部分

    #--------------ID----------------------------------------------
    ID_Abuout = wx.NewId()
    ID_MainFrame = wx.NewId()
    ID_Exit = wx.NewId()
    ID_IE6 = wx.NewId()
    ID_IE7 = wx.NewId()
    ID_IE8 = wx.NewId()
    ID_IE9 = wx.NewId()
    ID_IE10 = wx.NewId()
    ID_IE3211 = wx.NewId()
    ID_IE6411 = wx.NewId()
    
    #---------------不同机器对应的IP,和菜单栏的ID----------------------
    date={"IE6":ID_IE6,
                       "IE7":ID_IE7,
                       "IE8":ID_IE8,
                       "IE9":ID_IE9,
                       "IE10":ID_IE10,
                       "32IE11":ID_IE3211,
                       "64IE11":ID_IE6411} 
    date1={"IE6":"./rdp/IE6.rdp",
                   "IE7":"./rdp/IE7.rdp",
                   "IE8":"./rdp/IE8.rdp",
                   "IE9":"./rdp/IE9.rdp",
                   "IE10":"./rdp/IE10.rdp",
                   "32IE11":"./rdp/win32IE11.rdp",
                   "64IE11":"./rdp/win64IE11.rdp"}    
    
    def __init__(self,frame):
        wx.TaskBarIcon.__init__(self)
        
        self.SetMainFrame(frame)        
        self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK,self.OnTaskBarLeftDClick)
        self.Bind(wx.EVT_MENU, self.OnMainFrame, id=self.ID_MainFrame)
        self.Bind(wx.EVT_MENU, self.OnExit, id=self.ID_Exit)
        
        
    def SetMainFrame(self, frame):
        self.frame = frame
        self.SetIcon(wx.Icon("2.ico",type=wx.BITMAP_TYPE_ICO),u"远程链接")
    def OnClose(self,event):
        self.taskBarIcon.Destroy()
        self.Destroy()
        
    def OnTaskBarLeftDClick(self,event):
        if self.frame.IsIconized():
            self.frame.Iconize(False)
        if not self.frame.IsShown():
            self.frame.Show(True)
        self.frame.Raise()
        
    def OnMainFrame(self,event):    
        #显示主面板
        if not self.frame.IsShown():
            self.frame.Show(True)
        self.frame.Raise()
    
    #-------------------------------------   
    def OnExit(self,event):
        #关闭程序
        wx.Exit()
           
    def CreatePopupMenu(self):
        #添加最小化菜单
        self.menu = wx.Menu()
        self.menu.Append(self.ID_MainFrame, u"主面板")
        self.menu.AppendSeparator()
        
        self.taskbar_id={}
        tmp_id = wx.NewId()
        
        for key in self.date:
            if key:
                self.menu.Append(self.date[key],key)
                self.Bind(wx.EVT_MENU,self.ConnectIE, id=self.date[key])
                self.taskbar_id[self.menu.FindItemById] = key
        
        self.menu.AppendSeparator()
        self.menu.Append(self.ID_Exit, u"退出")
        return self.menu
    
    def ConnectIE(self, event):
        #托盘处链接远程机
        ip = self.date1[self.taskbar_id[self.menu.FindItemById]]
        os.system("mstsc %s /console" % ip)

        
     
        
if __name__ == '__main__':
    app = wx.App()
    fram = MyFrame()
    fram.Show()
    app.MainLoop()
 


代码有很多罗列的地方,但是基本的功能都实现了