前端测试组需要经常连接远程机器测试兼容性(我们不用虚拟机或是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()
代码有很多罗列的地方,但是基本的功能都实现了