Autor Thema: Prüfen ob der Benutzer im Directory existiert  (Gelesen 1205 mal)

Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Prüfen ob der Benutzer im Directory existiert
« am: 23.02.05 - 13:57:39 »
Entweder bin ich blöd oder das sind die Nachwirkungen des Entwicklercamps.

Ich habe ein Feld in dem ein Benutzername eingetragen werden kann. Rein theoretisch ;D ist es jetzt möglich, das dort kein gültiger Name oder nur Teile eines gültigen Namens eingetragen wird (werden) (über das Web z.B.).

Ein Script Agent soll jetzt die neuen und geänderten Dokumente zusammenstellen und den jeweils in diesem Feld eingetragenen Personen gesammelt als so eine Art Newsletter zur Verfügung stellen. Das Ganze natürlich nur wenn die Person im Directory existiert. Wenn Sie nicht existiert muss das ausgeleitet und einem Anwendugnsadministrator zur Verfügung gestellt werden. Also muss ich irgendwie rauskriegen ob ein Benutzer mit diesem Namen im Adressbuch existiert.

Frage: Gibt es außer der Methode über die Names.nsf und verschiedene getdocumentsbykey mit den Bestandteilen des Namens noch eine Möglichkeit das direkt rauszufinden (LDAP Abfrage?). Ich hab ja erst gedacht über NotesName aber das erzeugt ganz einfach einen Notes Namen, vollkommen wurscht was da jetzt reingeschrieben wird.
« Letzte Änderung: 23.02.05 - 17:44:52 von Thomas Schulte »
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: Prüfen ob der Benutzer im Directory existiert
« Antwort #1 am: 23.02.05 - 14:19:17 »
habe das hier gefunden ( und nicht getestet )

        Description: *
                          How test a name in an input field without searching into the adress database ....

                          Code: *
                          Sub Querysave(Source As Notesuidocument, Continue As Variant)

                          ' Déclaration
                          Dim session As New NotesSession
                          Dim workspace As New NotesUIWorkspace
                          Dim uidoc As NotesUIDocument
                          Dim texte As String

                          ' Initialisation
                          Set db = session.CurrentDatabase
                          Set uidoc = workspace.CurrentDocument
                          MB_ICONSTOP = 16

                          ' search to know if the name exist
                          texte = uidoc.FieldGetText( "Field_name" )
                          If Not(Trim(texte)="") Then
                          Set tName = New NotesName(texte)
                          If (tName.CANONICAL = tName.COMMON) Then
                          Msgbox "unable to find the name",MB_ICONSTOP,"Erreur"
                          Call uidoc.GotoField( "Field_name" )
                          Continue = False
                          Exit Sub
                          End If
                          Else
                          Msgbox "Please, give a real name",MB_ICONSTOP,"Error"
                          Call uidoc.GotoField( "Field_name" )
                          Continue = False
                          End If
                          End Sub
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: Prüfen ob der Benutzer im Directory existiert
« Antwort #2 am: 23.02.05 - 17:44:34 »
Erst einmal Danke Ullrich für das Teil. Das war genau der Stups in die richtige Richtung.  ;D ;D ;D

Und für alle die es interessiert, hier der fertige Code. Der geht allerdings von ein paar Prämissen aus:
1. da wo der Agent läuft sind Adressbücher verfügbar
2. überprüft wird gegen den FullName und den ShortName, nicht gegen den Lastname (wobei das einfach zu ergänzen wäre aber keinen Sinn macht solange Punkt 3 nicht realisiert ist)
3. doppelte Einträge werden noch nicht unterstützt  (da muss noch ein wenig Logik rein)
4. bei GROSSEN Addressbüchern könnte das etwas Performance kosten, da alle verfügbaren Adressbücher abgeklappert werden.
Code
Option Public
Option Declare


' dims
Dim formnames List As String
Dim userdclist List As String
Dim alluserslist List As String
Sub Initialize
%REM
This agent Gathers all new and modified documents. 
It sends a summary mail to that user that is declared as responsible in the document
%END REM
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim view As NotesView
	Dim chdoccol As notesdocumentcollection
	Dim founddoc As NotesDocument
	
	Set db = session.CurrentDatabase
	
	' fetch all valid users from all addressbooks
	Call fetchvalidusers(Session)
	' build List of Forms not to be added to the newsletter
	Call buildformnameslist
	' use unprocessed as document collection
	Set chdoccol = db.UnprocessedDocuments
	' build a list of the documents that are related to each user	
	Call builduserdocumentlist(chdoccol)
	' send on doucment with all items to each user in the list
	Call sendusermail
	
End Sub
Sub buildformnameslist
	' forms not to be watched
	Formnames("frmConfigExternalDatabase") = "frmConfigExternalDatabase"
	Formnames("frmConfigDatatransfer") = "frmConfigDatatransfer"
	Formnames("frmConfigFieldGovernance") = "frmConfigFieldGovernance"
	Formnames("frmConfigKeywords") = "frmConfigKeywords"
	Formnames("frmConfigKeywordCouples") = "frmConfigKeywordCouples"
	Formnames("frmprofileSequentialNumber") = "frmProfileSequentialNumber"
	Formnames("frmConfigTeams") = "frmConfigTeams"
	Formnames("frmConfigUserAccess") = "frmConfigUserAccess"
	Formnames("frmConfigUserConfiguration") = "frmConfigUserConfiguration"
End Sub
Sub builduserdocumentlist(mydc As NotesDocumentCollection)
	Dim founddoc As NotesDocument
	Dim founditem As notesitem
	Dim username As NotesName
	Dim strusername As String
	Dim i As Integer
	
	Set founddoc = mydc.GetFirstDocument()
	
	Do While Not founddoc Is Nothing
		' check if document is not in the unwanted documents list
		If Iselement(formnames(founddoc.form(0))) = False Then
			If founddoc.HasItem("fldErledigenVerantwortlich") Then
				'get all the values of this item if it is a multivalue field
				Set founditem = founddoc.GetFirstItem("fldErledigenVerantwortlich")
				Forall v In founditem.Values
					' check if v is a valid UserName
					' search to know if the name exist
					If Not(Trim(v)="") Then
						strusername = v
						' reshape the users name if a matching name is found
						If Iselement(alluserslist(strusername)) = True Then
							strusername = alluserslist(strusername)
							' check if there is already an entry in the userdocumentlist
							If Iselement(userdclist(strusername)) = True Then
								userdclist(strusername) = userdclist(strusername) + "~" + founddoc.UniversalID
							Else
								userdclist(strusername) = founddoc.UniversalID
							End If
						Else
							If Iselement(userdclist("User not Found " + strusername)) = True Then
								userdclist("User not Found " + strusername) = userdclist("User not Found " + strusername) + "~" + founddoc.UniversalID
							Else
								userdclist("User not Found " + strusername) = founddoc.UniversalID
							End If
						End If
					End If
				End Forall
			End If
		End If
		Set founddoc = mydc.getnextdocument(founddoc)
	Loop
End Sub
Sub Sendusermail
	' sends the mail to the user. The mail is send as html and as NotesACL mail wich later on will be konfigurable for the type of user (notes or web)
	' each document found is one entry in the list
	Stop
End Sub
Sub fetchvalidusers(mysession As NotesSession)
	Dim mybooks As Variant
	Dim myview As NotesView
	Dim mydoc As NotesDocument
	Dim myitem As NotesItem
	Dim myqualifiedname As String
	Dim myfoundqualified As Integer
	Dim mypersonname As String
	Dim i As Integer
	
	mybooks = mysession.AddressBooks
	Forall b In mybooks
    ' check every Domino Directory,
    ' unless we're already done
		If ( b.IsPublicAddressBook ) Then
			Call b.Open( "", "" )
      ' look up person's last name
      ' in People view of address book
			Set myview = b.GetView( "People" )
			Set mydoc = myview.Getfirstdocument()
			Do While Not mydoc Is Nothing
				' fetch the persons fully qualified name and check if it is a full qualified name
				If mydoc.HasItem("Fullname") Then
					Set myitem = mydoc.GetFirstItem("FullName")
					Forall v In myitem.Values
						mypersonname = v
						If validateuser(mypersonname) = True Then
							myqualifiedname = mypersonname
							myfoundqualified = True
							Exit Forall
						End If
					End Forall
					If myfoundqualified = True Then
					' fetch the full name
						Call fetchnameandadd(mydoc,"FullName", myQualifiedname)
					' fetch the short name entry
						Call fetchnameandadd(mydoc,"ShortName", myQualifiedname)
					End If
				End If
				Set mydoc = myview.GetNextDocument(mydoc)
			Loop
		End If
	End Forall
	
End Sub
Function validateuser(myusername As String) As Integer
	Dim checkusername As NotesName
	Set checkuserName = New NotesName(myusername)
	If (checkuserName.CANONICAL = checkuserName.COMMON) Then
		validateuser = False
	Else
		validateuser = True
	End If
End Function
Sub fetchnameandadd(mydoc As NotesDocument, myitemname As String, myqualifiedname As String)
	Dim myitem As NotesItem
	If mydoc.HasItem(myitemname) Then
		Set myitem = mydoc.GetFirstItem(myitemname)
	' add all entries in this item to the list
		Forall v In myitem.Values
			If Iselement(alluserslist(v)) = False Then
				alluserslist(v) = myqualifiedname
			End If
		End Forall
	End If
End Sub


Und wenn jemand das bis hierhin gelesen und nicht verstanden hat dann kann ich ihm das gerne noch erklären.  :P
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Prüfen ob der Benutzer im Directory existiert
« Antwort #3 am: 23.02.05 - 18:04:51 »
Meine Erfahrung ist, dass (zumindest in bestimmten Versionen)
NotesSession.Addressbooks.IsPublicAddressBook
nicht zuverlässig funktioniert und auch PersNames als solches deklariert.
Ich prüfe daher sicherheitshalber noch auf das Vorhandensein der Ansicht  "($Networks)".
Weiterhin: Das Verfahren ist alles andere als performant. Aber eben besser als nix ...

Bernhard

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz