Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Lloyd am 03.05.12 - 17:03:33

Titel: LDAP Abfrage gegen Active Directory
Beitrag von: Lloyd 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
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: Tode am 03.05.12 - 17:25:47
Versuch mal mit objectClass = 'Person'... das ist eventuell sicherer als die Category abzufragen
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: Lloyd 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?
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: Lloyd 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:

Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: Tode 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....
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: NDB 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'
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: Lloyd am 15.05.12 - 14:15:44
Hi,
so geht es.

Vielen Dank.
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: pimpfling 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.
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: m3 am 15.05.12 - 15:11:43
Du machst eine Anonyme Verbindung auf. In dem Fall liefert Domino per default keine Details zurueck.
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: pimpfling 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 :)
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: pimpfling 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.
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: pimpfling 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
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: Peter Klett am 15.05.12 - 16:07:22
MsgBox "Mail: " + objRecordSet.Fields("mail").Value (0)
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: pimpfling 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

Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: pram am 15.05.12 - 16:19:33
dim x
x = objRecordSet.Fields("mail").Value
msgbox x(0)
?
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: pimpfling 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.
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: koehlerbv am 15.05.12 - 17:02:19
Nö, das kommt von objRecordSet, was den Zugriff auf die Elemente des Arrays nicht bereitstellt.

Bernhard
Titel: Re: LDAP Abfrage gegen Active Directory
Beitrag von: pimpfling 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?