Поиск людей на компьютерах в Active Directory и подключение к ним по Radmin'у +GUI

Как человек привыкший к кнопочкам, пимпочкам, эдитам и другим комбобоксам я не долго радовался первому опыту программирования на python'е под Linux. Погуглив я обнаружил массу вариантов приделывания GUI к уже рабочему скрипту, но решил оставноться на wx, он мне показался наиболее простым или может просто информации о нем я нашел больше. Снова выложу просто весь скрипт.





#!/usr/bin/env python2.5
# -*- coding: utf-8 -*-
 
import ldap
import subprocess
import os
import wx
from wxPython._core import wxTAB_TRAVERSAL
 
class MyPanel(wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self,parent,wxTAB_TRAVERSAL)
        self.parent=parent
#Делаем эдиты для имени сервера, имени пользователя и пароля и т.д
        self.stBase = wx.StaticText(self, -1, pos=(8,126),label="Место поиска")
        sz=self.stBase.GetSize()
        self.eBase = wx.TextCtrl(self, 1, style=wx.TE_LEFT,pos=(sz[0]+10,124),size=(190,27))
        self.eBase.SetToolTipString("Место поиска\nOU=UNIT,DC=domain,DC=local")
        self.eBase.SetValue("OU=Компьютеры,DC=local,DC=lan")
 
        self.stServerName = wx.StaticText(self, -1,pos=(8,10), label="Сервер" )
        self.eServerName = wx.TextCtrl(self, 2, style=wx.TE_LEFT, pos=(sz[0]+10,8), size=(190,27))
        self.eServerName.SetToolTipString("Введите адрес сервера:\nhost_name:port")
        self.eServerName.SetValue("dc.local.lan:389")
 
        self.stUserName = wx.StaticText(self, -1 ,pos=(8,39),label="Имя")
        self.eUserName = wx.TextCtrl(self, 3, style=wx.TE_LEFT, pos=(sz[0]+10,37), size=(190,27))
        self.eUserName.SetToolTipString("Введите имя пользователя:\nusername@domain")
        self.eUserName.SetValue("admin@local.lan")
 
        self.stPasswd = wx.StaticText(self, -1, pos=(8,68),label="Пароль")
        self.ePasswd = wx.TextCtrl(self, 4, style=wx.TE_PASSWORD,pos=(sz[0]+10,65),size=(190,27))
        self.ePasswd.SetToolTipString("Введите пароль")
        self.ePasswd.SetValue("password")
 
        self.stFilter = wx.StaticText(self, -1, pos=(8,98),label="Фильтр")
        self.eFilter = wx.TextCtrl(self, 5, style=wx.TE_LEFT,pos=(sz[0]+10,95),size=(190,27))
        self.eFilter.SetToolTipString("Фильр для поиска")
        self.eFilter.SetFocus()
 
#Делаем кнопки подключение к серверу выход и так далее    
        self.button1 = wx.Button(self,6,label='Подключиться',pos=(100,180),size=(150,27))
        self.button1.Bind(wx.EVT_LEFT_UP, self.OnButton1Click)
        self.button1.Bind(wx.EVT_BUTTON, self.OnButton1Click)
        self.button2 = wx.Button(self,9,label='Закрыть',pos=(570,270),size=(75,27))
        self.button2.Bind(wx.EVT_LEFT_UP, self.OnButton2Click)
 
#Делаем комбобокс для списка пользователей        
        self.cbUsers= wx.ComboBox(self, 7,choices=usrlst,pos=(330,8),size=(300,27), style=wx.CB_READONLY)
        self.cbUsers.SetToolTip(wx.ToolTip("Выбирите из списка пользователя"))
        self.cbUsers.Bind(wx.EVT_COMBOBOX, self.OncbUsersCB)
 
 
 
#Делаем список компютеров
        self.lbComps = wx.ListBox(self, 8, pos=(330,37), size=(300,200))
        self.lbComps.SetToolTipString("Выбирите из списка компьютер")
        self.lbComps.Bind(wx.EVT_LISTBOX_DCLICK, self.lbCompsChoise)
 
#Глобпльные переменные
        self.ldp = -1
 
#Выходим из программы
    def OnButton2Click(self,event):
        self.Destroy()
 
#Событие при котором подключаемся к домен контроллеру и заполняем комбобокс юзерами
    def OnButton1Click(self,event):
        server = self.eServerName.GetValue()
        username= self.eUserName.GetValue()
        passwd = self.ePasswd.GetValue()
        self.ldp = connect(server, username, passwd, "*")
        base=self.eBase.GetValue()
        sfilter=self.eFilter.GetValue()
        if len(sfilter) == 0:
            sfilter="*"
        else:
            sfilter="*"+sfilter+"*"
        usrlst = mysearch(self.ldp, sfilter, 1,base.encode('utf-8'))
        if len(usrlst) == 0:
            sfilter = sfilter.replace("*","")
            wx.MessageBox('По запросу "'+sfilter+'" ничего не найдено')
        else:
            self.cbUsers.Clear()
            usrlst.sort(cmp=None, key=None, reverse=False)
            self.cbUsers.AppendItems(usrlst)
            self.cbUsers.SetValue(self.cbUsers.GetString(0))
 
 
#Собыите при закрытии списка заполняем листобкс компами
    def OncbUsersCB(self, event):
        if self.ldp != -1:
            sUser=self.cbUsers.GetValue()
            self.lbComps.Clear()
            lComps=[]
            lComps=mysearch(self.ldp, sUser.encode('utf-8'), 2,self.eBase.GetValue().encode('utf-8'))
            if len(lComps) == 0:
                lComps.append("Пользователь не залогинен ни на одном компе")
            self.lbComps.AppendItems(lComps)
#Событие при выборе компа
    def lbCompsChoise(self,event):
        subprocess.Popen("/usr/bin/wine ~/.wine/drive_c/Program\ Files/Radmin/radmin.exe /connect:"+\
                         self.lbComps.GetStringSelection(), shell=True)
class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)
        self.Panel=MyPanel(self)
        self.Bind(wx.EVT_WINDOW_DESTROY, self.OnQuit,self.Panel)
 
    def OnQuit(self,event):
        self.Close()
 
def connect(server, who, cred, keyword):
    try:
        l = ldap.initialize("ldap://"+server)
        l.bind_s(who,cred,ldap.AUTH_SIMPLE)
        return l
    except ldap.LDAPError, error_message:
        wx.MessageBox("Не могу соединиться %s " %error_message)
        l = -1
        return l
 
 
 
def mysearch(l,keyword,objsearch, base):
    scope = ldap.SCOPE_SUBTREE
    search_result=[]
    if int(objsearch) == 1:
        searchfilter = "(&(objectClass=user)(cn=".encode('utf-8')+keyword.encode('utf8')+")(mail=*))".encode('utf-8')
    else:
        if int(objsearch) == 2:
            searchfilter = "(&(objectClass=computer)(description=*on:*"+keyword+"*))" 
        else: 
            wx.MessageBox("Неверно указан объект поиска.")
            return result_search
    retrieve_attributes = None
    result_set = []
    timeout = 0
    try:
        result_id = l.search(base, scope, searchfilter, retrieve_attributes)
        while l:
            result_type, result_data = l.result(result_id, timeout)
            if (result_data == []):
                break
            else:
                if result_type == ldap.RES_SEARCH_ENTRY:
                    result_set.append(result_data)
        if len(result_set) == 0:
            return search_result
        for i in range(len(result_set)):
            for entry in result_set[i]:
                try:
                    search_result.append(entry[1]['cn'][0])
                except:
                    pass
        return search_result
    except ldap.LDAPError, error_message:
        wx.MessageBox(error_message)
        return search_result
 
 
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, "Подключатель")
        frame.SetSize(size=(650,300))
        frame.Show(True)
        self.SetTopWindow(frame)
        return True
 
def main():
    app = MyApp(0)
    app.MainLoop()
 
if __name__ == "__main__":
    main()
Прикрепленный файлРазмер
Screenshot-Подключатель.png20.39 кб