Autor Thema: LDAP Abfrage gegen Active Directory  (Gelesen 12574 mal)

Offline Lloyd

  • Aktives Mitglied
  • ***
  • Beiträge: 211
LDAP Abfrage gegen Active Directory
« am: 03.05.12 - 17:03:33 »
Hallo,
ich frage unser Active Directory nach dessen Benutzerkonten ab, bzw. versuche ich das. Ich erhalte aber immer alle möglichen Objekte zurück wie z.B. GPOs, WMI-Filter, Verzeichnisfreigaben, Benutzerkonten. Seltsamerweise aber nicht alle GPOs und nicht alle WMI-Filter, bzw. Verzeichnisfreigabe, sondern nur einige. In der folgenden Zeile wird das doch normalerweise über den "objectCategory = User" entsprechend eingegrenzt. Das funktioniert aber irgendwie nicht richtig.

objCommand.CommandText = "Select Name, mail, title, samAccountName, description, homeDirectory, profilePath, badPwdCount, logonCount, lastLogonTimestamp, objectCategory FROM 'LDAP://" & Cstr(askme) & "' WHERE objectCategory='User'"   

Der Rückgabewert aus objectCategory sieht so aus: CN=Person,CN=Schema,CN=Configuration,DC=X1234,DC=ADC,DC=Test,DC=DE

Hat jemand einen Tipp für mich ?


Anbei noch mein komplettes Script:
-------------------------------------------------------------

   On Error Resume Next
   
   Dim ws As New NotesUIWorkspace
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim askme As Variant
   Dim ldap_name As String, ldap_mail As String, ldap_title As String, ldap_samAccountName As String, ldap_description As Variant, ldap_descriptionb As String
   Dim ldap_homedir As String, ldap_profildir As String, ldap_badpwd As Variant, ldap_logoncount As Variant, ldap_lastLogon As Variant, ldap_objectCategory As Variant
   
   askme = ws.Prompt (PROMPT_OKCANCELEDIT, "Wie heißt Ihr Domain Controller", "IP-Adresse oder WSID Ihres Domain-Controller. z.B. FS001234 oder 10.130.45.678")
   If Not Isempty (askme) Then
      
      Set db = s.CurrentDatabase
      
      Const ADS_SCOPE_SUBTREE = 2
      
      Set objConnection = CreateObject("ADODB.Connection")
      Set objCommand =   CreateObject("ADODB.Command")
      objConnection.Provider = "ADsDSOObject"
      objConnection.Open "Active Directory Provider"
      Set objCommand.ActiveConnection = objConnection
      
      objCommand.Properties("Page Size") = 1000
      objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
      
      objCommand.CommandText = "Select Name, mail, title, samAccountName, description, homeDirectory, profilePath, badPwdCount, logonCount, lastLogonTimestamp, objectCategory FROM 'LDAP://" & Cstr(askme) & "' WHERE objectCategory='User'"      
      
      Set objRecordSet = objCommand.Execute
      
      objRecordSet.MoveFirst
      
      Do Until objRecordSet.EOF
         ldap_name = ""
         ldap_mail = ""
         ldap_title = ""
         ldap_samAccountName = ""
         ldap_description = ""      
         ldap_descriptionb = ""
         ldap_homedir = ""
         ldap_profildir = ""
         ldap_badpwd = ""
         ldap_logoncount = ""
         ldap_lastlogon = ""
         ldap_objectCategory = ""
         
         ldap_name = objRecordSet.Fields("name").Value
         ldap_mail = objRecordSet.Fields("mail").Value
         ldap_title = objRecordSet.Fields("title").Value
         ldap_samAccountName = objRecordSet.Fields("samAccountName").Value
         ldap_description = objRecordSet.Fields("description").Value
         ldap_descriptionb = ldap_description(0)
         ldap_homedir = objRecordSet.Fields("homeDirectory").Value
         ldap_profildir = objRecordSet.Fields("profilePath").Value
         ldap_badpwd = objRecordSet.Fields("badPwdCount").Value
         ldap_logoncount = objRecordSet.Fields("logonCount").Value
         ldap_lastlogon = objRecordSet.Fields("lastLogonTimestamp").Value
         ldap_objectCategory = objRecordSet.Fields("objectCategory").Value
         
         Call NeuerBenutzer(ldap_name, ldap_mail, ldap_title, ldap_samAccountName, ldap_descriptionb, ldap_homedir, ldap_profildir, ldap_badpwd, ldap_logoncount, ldap_lastlogon, ldap_objectCategory, db)
         
         objRecordSet.MoveNext
      Loop
      
      Call ws.ViewRefresh
   End If
Gruss
Lloyd

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: LDAP Abfrage gegen Active Directory
« Antwort #1 am: 03.05.12 - 17:25:47 »
Versuch mal mit objectClass = 'Person'... das ist eventuell sicherer als die Category abzufragen
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Lloyd

  • Aktives Mitglied
  • ***
  • Beiträge: 211
Re: LDAP Abfrage gegen Active Directory
« Antwort #2 am: 08.05.12 - 17:38:19 »
Hi Tode,
sorry dass ich mich jetzt erst wieder melde.

Jetzt krieg ich zwar keine GPOs und WMI-Filter mehr, dafür aber neben den Personen alle Computerkonten mitgeliefert.

Ich könnte zwar jetzt die objectCategorie noch zusätzlich auslesen, und abfangen ob am Anfang CN=Person oder CN=Computer enthält, aber es müßte doch auch möglich sein wirklich nur die entsprechenden Objekte auszulesen, oder?
Gruss
Lloyd

Offline Lloyd

  • Aktives Mitglied
  • ***
  • Beiträge: 211
Re: LDAP Abfrage gegen Active Directory
« Antwort #3 am: 08.05.12 - 17:59:55 »
Ergänzung:
Wenn ich mir den Inhalt von objectClass als Variant zurückgeben lasse, erhalte ich folgenden Inhalt:

  • top
  • [1] person
    [2] organizationalPerson
    [3] user
    [4] computer

    Bei Personen fehlt der Eintrag [4], bei Computerkonten ist er da.
    Bei Gruppen heißt der Eintrag [3] contact
Gruss
Lloyd

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: LDAP Abfrage gegen Active Directory
« Antwort #4 am: 09.05.12 - 19:31:33 »
Offensichtlich ist das ein Ad- LDAP- Problem und Du solltest bei denen nachfragen, die das LDAP- schema im ad kennen... Hat ja nix mehr mit Notes selbst zu tun, weil der nur verarbeitet, was das ad aufgrund der ldapsearch liefert....
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline NDB

  • Frischling
  • *
  • Beiträge: 36
  • Geschlecht: Männlich
Re: LDAP Abfrage gegen Active Directory
« Antwort #5 am: 15.05.12 - 11:56:22 »
Hallo,
so sollte es gehen:

nur Personen:
*** WHERE objectCategory='Person' AND objectClass='user'"

nur Gruppen:
*** WHERE objectClass='group'"

nur Computer:
*** WHERE objectClass='computer'

Offline Lloyd

  • Aktives Mitglied
  • ***
  • Beiträge: 211
Re: LDAP Abfrage gegen Active Directory
« Antwort #6 am: 15.05.12 - 14:15:44 »
Hi,
so geht es.

Vielen Dank.
Gruss
Lloyd

Offline pimpfling

  • Senior Mitglied
  • ****
  • Beiträge: 367
  • Geschlecht: Männlich
Re: LDAP Abfrage gegen Active Directory
« Antwort #7 am: 15.05.12 - 15:03:39 »
Hallo,

das ganze hat mich neugierig gemacht und ich wollte das mal gegen unser Domino LDAP probieren.
leider klappt das nicht so ganz. Evtl kann mir jemand sagen warum.

Code:
Code
	Sub Initialize
	Dim ws As New NotesUIWorkspace
	Dim s As New NotesSession
	Dim db As NotesDatabase
	Dim objConnection As Variant
	Dim objCommand As Variant
	Dim objRecordSet As Variant
	Dim test As string
		
	Set db = s.CurrentDatabase
	Const ADS_SCOPE_SUBTREE = 2
	Set objConnection = CreateObject("ADODB.Connection")
	Set objCommand = CreateObject("ADODB.Command")
	objConnection.Provider = "ADsDSOObject"
	objConnection.Open "Active Directory Provider"
	Set objCommand.ActiveConnection = objConnection
	objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
	objCommand.CommandText = "Select cn, uid, sn, mail, mailaddress, location, objectclass FROM 'LDAP://dominoserver.domain.de' WHERE objectClass='person'"
	Set objRecordSet = objCommand.Execute
	objRecordSet.MoveFirst
	
	Print "Command Status: " + CStr(objCommand.state)
	Print "RecordSet PageCount: " + CStr(objRecordSet.PageCount)	
	
	MsgBox CStr(objRecordSet.RecordCount) + ":" + CStr(objRecordSet.Fields.Count) 

	Do Until objRecordSet.EOF

		Print CStr(objRecordset.AbsolutePage) + ":" + CStr(objRecordset.AbsolutePosition) 
		test = CStr(objRecordSet.Fields("uid").Value)
		Print test
		objRecordSet.MoveNext
	Loop	
End Sub	

Die Verbindung klappt. Ich bekomme die Anzahl der Einträge zurück, Beim Print des uid Values (variable test) bekomme ich aber ne Fehlermeldung: Type Mismatch unknown found, unknown expected.
Gruß Stefan

----------------------------------
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus.

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: LDAP Abfrage gegen Active Directory
« Antwort #8 am: 15.05.12 - 15:11:43 »
Du machst eine Anonyme Verbindung auf. In dem Fall liefert Domino per default keine Details zurueck.
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline pimpfling

  • Senior Mitglied
  • ****
  • Beiträge: 367
  • Geschlecht: Männlich
Re: LDAP Abfrage gegen Active Directory
« Antwort #9 am: 15.05.12 - 15:15:50 »
Du machst eine Anonyme Verbindung auf. In dem Fall liefert Domino per default keine Details zurueck.

hui, super schnelle Antwort :)
Wie kann ich mich anmelden? also technisch gesehen :)
Gruß Stefan

----------------------------------
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus.

Offline pimpfling

  • Senior Mitglied
  • ****
  • Beiträge: 367
  • Geschlecht: Männlich
Re: LDAP Abfrage gegen Active Directory
« Antwort #10 am: 15.05.12 - 15:33:11 »
Ich habe die folgenden drei Parameter hinzugefügt:

   objConnection.Properties("User ID") = "Mein User"
   objConnection.Properties("Password") = "MeinPassword"
   objConnection.Properties("Encrypt Password") = False

die Parameter funktionieren, wenn ich den Namen verändere kriege ich eine Bind request failed Meldung auf der server console und im client.
Ansonsten ist das Verhalten wie beim anonymen Abfragen, keine Veränderung zu sehen.
« Letzte Änderung: 15.05.12 - 15:37:19 von pimpfling »
Gruß Stefan

----------------------------------
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus.

Offline pimpfling

  • Senior Mitglied
  • ****
  • Beiträge: 367
  • Geschlecht: Männlich
Re: LDAP Abfrage gegen Active Directory
« Antwort #11 am: 15.05.12 - 16:03:55 »
Weiter probiert:

Forall vals In objRecordSet.Fields("mail").Value
   MsgBox "Mail: " + vals
End ForAll
MsgBox "Mail: " + objRecordSet.Fields("mail").Value

Die erste MsgBox spuckt mir ordentlich die Maiadresse aus, die zweite nicht.
Wie komme ich denn ohne Forall an den FeldInhalt dran?
Stehe aufm Schlauch
Gruß Stefan

----------------------------------
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus.

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: LDAP Abfrage gegen Active Directory
« Antwort #12 am: 15.05.12 - 16:07:22 »
MsgBox "Mail: " + objRecordSet.Fields("mail").Value (0)

Offline pimpfling

  • Senior Mitglied
  • ****
  • Beiträge: 367
  • Geschlecht: Männlich
Re: LDAP Abfrage gegen Active Directory
« Antwort #13 am: 15.05.12 - 16:12:24 »
MsgBox "Mail: " + objRecordSet.Fields("mail").Value (0)

Hatte ich auch schon probiert :)

--> Wrong number of arguments for automation object

Gruß Stefan

----------------------------------
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus.

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: LDAP Abfrage gegen Active Directory
« Antwort #14 am: 15.05.12 - 16:19:33 »
dim x
x = objRecordSet.Fields("mail").Value
msgbox x(0)
?
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline pimpfling

  • Senior Mitglied
  • ****
  • Beiträge: 367
  • Geschlecht: Männlich
Re: LDAP Abfrage gegen Active Directory
« Antwort #15 am: 15.05.12 - 16:43:02 »
dim x
x = objRecordSet.Fields("mail").Value
msgbox x(0)
?

Danke, so klappts.
Ist dann wohl eine Eigenheit von Domino.
Gruß Stefan

----------------------------------
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: LDAP Abfrage gegen Active Directory
« Antwort #16 am: 15.05.12 - 17:02:19 »
Nö, das kommt von objRecordSet, was den Zugriff auf die Elemente des Arrays nicht bereitstellt.

Bernhard

Offline pimpfling

  • Senior Mitglied
  • ****
  • Beiträge: 367
  • Geschlecht: Männlich
Re: LDAP Abfrage gegen Active Directory
« Antwort #17 am: 15.05.12 - 17:19:15 »
Nö, das kommt von objRecordSet, was den Zugriff auf die Elemente des Arrays nicht bereitstellt.

Bernhard

hm, aber beim abfragen des ADs klappt das ganze ohne (0) hinten dran.

Zusatzfrage, wie kann ich eine BaseDN angeben?
Gruß Stefan

----------------------------------
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz