IndexError: list index out of range for Entries

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
SK0RPI0NHD
User
Beiträge: 1
Registriert: Mittwoch 12. Juni 2019, 11:04

My Code:

import wx
import wx.xrc
from ldap3 import Server, Connection, SUBTREE, ALL_ATTRIBUTES, AUTO_BIND_NO_TLS
import getpass

class MyApp(wx.App):

def OnInit(self):
self.frame = MyFrame(None)
self.SetTopWindow(self.frame)
self.frame.Show()
return True


class MyFrame (wx.Frame):

def __init__(self, parent):
wx.Frame.__init__(self, parent, id=wx.ID_ANY, title="ActiveDirectory", pos=wx.DefaultPosition, size=wx.Size(500, 300), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL)

self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT))

myGridSizer = wx.GridSizer(0, 2, 0, 0)

self.nameLabel = wx.StaticText(self, wx.ID_ANY, "Name", wx.DefaultPosition, wx.DefaultSize, 0)
self.nameLabel.Wrap(-1)
myGridSizer.Add(self.nameLabel, 0, wx.ALL, 5)

self.nameText = wx.TextCtrl(self, wx.ID_ANY, "", wx.DefaultPosition, wx.DefaultSize, 0)
myGridSizer.Add(self.nameText, 0, wx.ALL, 5)

self.getBtn = wx.Button(self, wx.ID_ANY, "Get", wx.Point (-1, -1), wx.DefaultSize, 0)
myGridSizer.Add(self.getBtn, 0, wx.ALL, 5)

self.textbox = wx.TextCtrl(self, wx.ID_ANY, size=(225, 125), style=wx.TE_MULTILINE | wx.TE_READONLY)
myGridSizer.Add(self.textbox, 0, wx.ALL, 5)

self.SetSizer(myGridSizer)
self.Layout()

self.Centre(wx.BOTH)

self.getBtn.Bind(wx.EVT_BUTTON, self.getValues)

def __del__(self):
pass

def getValues(self, event):

server = Server("server", port=389, use_ssl=False)
print("1111 vor serverconnect")
c = Connection(server, user="testuser", password="password",
auto_bind=AUTO_BIND_NO_TLS)
print("2222 nach servconnect")



c.search(search_base="search_base", search_scope=SUBTREE,
search_filter='(mail=' + self.nameText.Value + ')' or '(sAMAccountName=' + self.nameText.Value + ')',
attributes=ALL_ATTRIBUTES)

entry = c.entries[0]

name = entry.displayName.value
mail = entry.mail.value
givenname = entry.givenname.value
sn = entry.sn.value
number = entry.telephonenumber.value
department = entry.department.value
company = entry.company.value
street = entry.streetAddress.value
print(getpass.getuser())
print(c.entries)

self.textbox.SetValue(name + ("\n" + mail) + ("\n" + givenname) + ("\n" + sn) + ("\n" + number) + ("\n" + department) + ("\n" + company) + ("\n" + street))

if __name__=="__main__":
app = MyApp(False)
app.MainLoop()


Errormessage:

Traceback (most recent call last):
File "C:/Users/orlikle/PycharmProjects/Test/ActiveDirectory.py", line 69, in getValues
entry = c.entries[0]
IndexError: list index out of range
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es sind eben keine Ergebnisse vorhanden. Das liegt an der LDAP query. Die liefert nichts zurueck. Entweder ist das ein Fehler, dann musst du deine Query aendern/reparieren. Oder das kann vorkommen, dann muss dein Programm diesen Fall beruecksichtigen.

Und bitte schau dir mal dringend string-Formatierung an. Sowas hier

Code: Alles auswählen

name + ("\n" + mail) + ("\n" + givenname) + ("\n" + sn) + ("\n" + number) + ("\n" + department) + ("\n" + company) + ("\n" + street))
macht man nicht. Weder braucht es die klammern, noch stoppelt man Strings mit + zusammen (nirgendwo).

Sondern zb

Code: Alles auswählen

self.textbox.SetValue("\n".join((name , mail, givenname, sn, number, department, company, street)))
und

Code: Alles auswählen

search_filter='(mail={}) or (sAMAccountName={})'.format(mail, name)
Mir fehlen da ja Anfuehrungszeichen fuer die Argumente, und auch das or das du da eingestreut hast ist ein Fehler. Das steht nicht IM Text, sondern verodert ziemlich sinnlos zwei Strings (da kommt dann nur der linke bei rum).

Last but not least: in Zukunft code in code-tags setzen.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SK0RPI0NHD: Nun dann ist `c.entries` wohl offensichtlich leer. Was an dem `search_filter`-Argument liegen könnte was ziemlich sicher nicht das ist, was Du denkst was es ist, denn:

Code: Alles auswählen

'(mail=' + self.nameText.Value + ')' or '(sAMAccountName='  + self.nameText.Value + ')'
ist das gleiche wie:

Code: Alles auswählen

'(mail=' + self.nameText.Value + ')'
``or`` ist in Python ein binärer Operator der entweder den ersten oder den zweiten Operanden als Ergebnis hat, je nach dem ob der erste Ausdruck im boole'schen Kontext “wahr” oder “unwahr” ist. Nicht-leere Zeichenketten sind immer “wahr”, also liefert der Ausdruck immer den Wert vor dem ``or`` denn der ist niemals die leere Zeichenkette.

Zeichenketten und Werte mit ``+`` zusammenbasteln ist auch eher BASIC als Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode auf Zeichenketten und ab Python 3.6 die praktischen f-Zeichenkettenliterale.

Die `__del__()`-Methode solltest Du sofort löschen und gleich vergessen, dass es die gibt. Die wird nicht garantiert aufgerufen und kann unter bestimmten Umständen durch ihre blosse Existenz zu Speicherlecks führen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten