hagbardceline
Goto Top

VBScript createKontakt mit CSV Import Problem

Kontakte per script in der AD anlegen ohne im GAB zu erscheinen (evtl sofort in einen verteiler kommen), möglich für alle Mitarbeiter.

Nach meiner kleinen erfolgreichen Suche für Script welches Kontakte in der AD anlegt impotiert aus einer Datei fand ich hier ein passendes da. Habe die Pfade angepasst und es erfolgreich getestet. Jedoch gefällt mir nicht das der Anzeigename extra erstellt wird und ich habe versucht die Variablen strLast und StrName stattdessen zu benutzen. Desweiteren habe ich ein Feld für die beschreibung mit Eingebaut. Oder es zumindest versucht, denn das script läuft zwar durch, erstellt aber keine Kontakte. Der LDAP Pfad stimmt, denn das "alte" script funktioniert mit denen. Ich denke es hapert an meinem Versuch den Anzeigenamen auf "Nachnamen, Vornamen" zu scripten?! Zusätzlich möchte ich noch das die Kontakte nicht im GAB angezeigt werden (ginge im Notfall aber wohl auch mit ADModify) und die Adressen am besten direkt in einem Verteiler Landen. Erstmal sollte es aber überhaupt funktionieren face-smile
Jemand eine Ahnung woran es liegen könnte?


' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '  
' Kontakt  
' Beschreibung  
'  
' Version: 1.1  
' Datum:   08.06.2005  
' Autor:   Jon-Claude Hick  
' Letzte Änderungen: 12.05.2006  
'  
' Jon-Claude Hick stellt dieses Skript ohne jede  
' Gewährleistung zur Verfügung.  
' Die Verwendung geschieht auf eigene Gefahr.  
'  
' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '  

Option Explicit
Dim objRootLDAP, objContainer, objContact, strOU, strdomainname
Dim strContainer, strDNSDomain, FSO, file, User, line, strTargetAddress
Dim strContactName, strEmail, strFirst, strLast, strMapirecip, strDesc
Const ForReading = 1
Const filename="G:\X-Sonstiges\Kontakte.csv"  

on error resume next

' ------------------------------  
'please enter full LDAP path here  

strOU = "Xerver/ou=Kontakttest,ou=MyBusiness,dc=X,dc=de"  
' ------------------------------  

strMapirecip = "FALSE"  

Set objRootLDAP = GetObject("LDAP://rootDSE")  
strdomainname = objRootLDAP.Get("DefaultNamingContext")  
Set objContainer = GetObject("LDAP://" & strOU)  

set FSO=CreateObject("Scripting.Filesystemobject")  
Set File=FSO.OpenTextFile(filename, ForReading, false)

while not file.AtEndOfStream
	line=file.Readline
	User=Split(line,";")  
	strContactName = strLast & ", " & strFirst  
   	strLast = User(0)
   	strFirst = User(1)
   	strEmail = User(2)
	strDesc = User(3)
	Set objContact = objContainer.Create("Contact",_  
   	"cn=" & strContactName)  
   	objContact.Put "Mail", strEmail  
   	objContact.Put "targetaddress", strEmail  
   	objContact.Put "givenName", strFirst  
   	objContact.Put "sn", strLast  
	objContact.Put "description", strDesc  
   	objContact.Put "mailnickname", strContactName  
   	objContact.Put "mapirecipient", strMapirecip  
	strTargetAddress = "SMTP:" & strEmail  
	objContact.Put "TargetAddress", strTargetAddress  
	objContact.Put "InternetEncoding", 1310720  
	objContact.SetInfo 
Wend
WScript.Quit

Und die Passende CSV Datei:
Muster;Max;Max@muster.de;Beschreibung

Vielen Dank schon malface-smile

gruß h.c.

Content-Key: 88737

Url: https://administrator.de/contentid/88737

Printed on: April 26, 2024 at 00:04 o'clock

Member: tacker
tacker May 29, 2008 at 14:30:08 (UTC)
Goto Top
salü

probier ma folgende änderung, welche mir bei kurzem durchschauen sofort aufgefallen ist!

anstatt

strContactName = strLast & ", " & strFirst  
strLast = User(0) 
strFirst = User(1) 

stelle um auf..

strLast = User(0) 
strFirst = User(1) 
strContactName = strLast & ", " & strFirst  

bei deiner methode weiss er ja noch gar nicht wie die strings strlast und strfirst gesetzt sind, respektive nimmt leere...

somit sollte das script zumindest wieder durchrennen

gruss
Member: hagbardceline
hagbardceline May 29, 2008 at 14:56:34 (UTC)
Goto Top
Danke, das hatte ich nicht mehr bedacht, es funktioniert aber immer noch nicht, sprich es läuft durch aber er legt die Kontakte nicht an. Komisch, habe gedacht daran könnte es liegen.
Member: bastla
bastla May 29, 2008 at 15:02:13 (UTC)
Goto Top
Hallo hagbardceline!

Die Angabe der OU (des LDAP-Pfades) sieht wirklich so aus?
strOU = "Xerver/ou=Kontakttest,ou=MyBusiness,dc=X,dc=de"   
Zum Testen wäre es übrigens generell sinnvoll, die Zeile 23 auszukommentieren, damit das Script bei einem Fehler abbricht und Du aus der Fehlermeldung Rückschlüsse ziehen kannst.

Grüße
bastla
Member: hagbardceline
hagbardceline May 29, 2008 at 15:33:56 (UTC)
Goto Top
Xserver stimmt nicht und dc=X auch nicht, hab die Namen nur rausgenommen.

Jetz hab ich Zeile 23 auskommentiert und er sagt mir:

http://666kb.com/i/az2fy54psdom1fqw2.jpg

was wohl diese zeile wäre
	objContact.SetInfo 

(btw, kann ich im Kommentar kein Bild direkt einbinden? Alles neu!)
Member: Biber
Biber May 29, 2008 at 16:03:06 (UTC)
Goto Top
Moin hagbardceline,

ob es alle Probleme löst, weiß ich nicht, aber...
 ...
    ' #CHG# objContact.Put "givenName", strFirst   
    ' #CHG# objContact.Put "sn", strLast   
    ' wäre nur bei Kontakten richtig,   
    ' die den gleichen Vor- und Nachnamen haben  
    objContact.Put "givenName", strLast   
    objContact.Put "sn", strFirst  
    objContact.Put "description", strDesc  
    objContact.Put "mailnickname", strContactName  
  '#CHG# objContact.Put "mapirecipient", strMapirecip  
    objContact.Put "mapirecipient", FALSE  
  ' oder NICHTS setzen - false ist ja DEFAULT  
....
...

Grüße
Biber
[Edit] 30.5.2008
Sorry, hab mich missverständlich ausgedrückt mit dem verdrehten Vor- und Nachnamen.
..wäre nur bei Kontakten richtig, die den gleichen Vor- und Nachnamen haben stimmt natürlich schon gar nicht... es wäre auch bei Millionen von Asiaten in der Speicherungsform oben im Beitrag vollkommen korrekt.
Aber bei dem geposteten Beispiel "Mustermann;Max" würde ich schon den Vornamen/Rufnamen "Max" in das Feld "givenName" speichern.
[/Êdit]
Member: bastla
bastla May 29, 2008 at 21:26:28 (UTC)
Goto Top
Hallo hagbardceline!

Könnte, wie schon angenommen, am Komma liegen (siehe http://support.microsoft.com/?scid=kb%3Ben-us%3B883419&x=11&y=1 ... ) ...

Grüße
bastla
Member: hagbardceline
hagbardceline May 30, 2008 at 07:30:45 (UTC)
Goto Top
Danke Leute, lag am Komma (trotz SP2), habe jetz noch den Anzeigenamen mit Komma hinzugefügt. Hier das Fertige und funktionierende script. Jetz wüsst ich nur noch gern wie ich die Kontakte direkt in einen Verteiler einfüge?


Gruß, h.c.

EDIT: Habe noch
objContact.MSExchHideFromAddressLists = TRUE
hinzugeügt, so werden die Kontakte nicht ins GAB übernommen.

EDIT2:Danke Biber, habe die Reihenfolge in der CSV nach vorname;nachname;email;beschreibung; geändert. Und die Felder Vo und Nachname im script vertauscht.

' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '  
' Kontakt  
' Beschreibung  
'  
' Version: 1.1  
' Datum:   08.06.2005  
' Autor:   Jon-Claude Hick  
' Letzte Änderungen: 12.05.2006  
'  
' Jon-Claude Hick stellt dieses Skript ohne jede  
' Gewährleistung zur Verfügung.  
' Die Verwendung geschieht auf eigene Gefahr.  
'  
' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '  

Option Explicit
Dim objRootLDAP, objContainer, objContact, strOU, strdomainname
Dim strContainer, strDNSDomain, FSO, file, User, line, strTargetAddress
Dim strContactName, strEmail, strFirst, strLast, strMapirecip, strDesc
Const ForReading = 1
Const filename="G:\X-Sonstiges\Kontakte.csv"  

on error resume next

' ------------------------------  
'please enter full LDAP path here  

strOU = "Xerver/ou=Kontakttest,ou=MyBusiness,dc=X,dc=de"  
' ------------------------------  

strMapirecip = "FALSE"  

Set objRootLDAP = GetObject("LDAP://rootDSE")  
strdomainname = objRootLDAP.Get("DefaultNamingContext")  
Set objContainer = GetObject("LDAP://" & strOU)  

set FSO=CreateObject("Scripting.Filesystemobject")  
Set File=FSO.OpenTextFile(filename, ForReading, false)

while not file.AtEndOfStream
	line=file.Readline
	User=Split(line,";")  
   	strFirst = User(0)
   	strLast = User(1)
   	strEmail = User(2)
	strDesc = User(3)
	strContactName = strLast & " " & strFirst  
	Set objContact = objContainer.Create("Contact",_  
   	"cn=" & strContactName)  
   	objContact.Put "Mail", strEmail  
   	objContact.Put "targetaddress", strEmail  
   	objContact.Put "givenName", strFirst  
   	objContact.Put "sn", strLast  
	objContact.Put "description", strDesc  
	objContact.Put "displayname", strLast & ", " & strFirst  
   	objContact.Put "mailnickname", strFirst & strLast  
   	objContact.Put "mapirecipient", strMapirecip  
	strTargetAddress = "SMTP:" & strEmail  
	objContact.Put "TargetAddress", strTargetAddress  
	objContact.Put "InternetEncoding", 1310720  
        objContact.MSExchHideFromAddressLists = TRUE
	objContact.SetInfo
Wend
WScript.Quit
Member: hagbardceline
hagbardceline Jun 10, 2008 at 14:10:53 (UTC)
Goto Top
Ich komme einfach nicht dahinter wie ich einen Kontakt in eine Distribution List einfüge (diese ist in einer anderen/Standard OU)
Mehrere Versuche sind ins leere gelaufen, jemand einen Tipp? (Wie man die erste Zeile überspringt hab ich auch noch nicht rausgefunden :hmm: )

Hier das es eigentlich nur zum lesen gedacht aber ich frag mich woher die Variable member kommt..

http://windowsitpro.com/article/articleid/93884/how-can-i-use-a-script- ...

Und das verstehe ich nicht..

http://www.tech-geeks.org/geeklog/article.php?story=20040308171332896

gruß h.c.
Member: Biber
Biber Jun 10, 2008 at 14:56:04 (UTC)
Goto Top
Moin hagbardceline,

vorab: im jetzigen Status der Forumssoftware werden wahrscheinlich nur die drei, die schon mal in diesem Beitrag gepostet haben, mitbekommen, dass Du eine neue Frage gestellt hast.
Mach lieber einen neuen Thread auf.

Zu Deiner Frage 1)
"member" ist in diesem Fall keine Variable, sondern ein Textparameter.
Damit gibst Du an, welches Detail-Info des Attributs "objGroup" Du haben willst.
Die Funktion GetEx() sollte immer für ein so genanntes Multivalued Attribute gerufen werden , also um z.B. ein Array abzuholen.
Dann kannst Du entweder den Index (0, 1, ..) bei mehrdimensionalen Objekten wie Resultsets oder den "Spaltennamen" mitgeben. Und eine "Spalte", eine Eigenschaft des Attributs "Group" ist "Member", eine andere ist "MemberOf".

zu 2) öhm... kannst Du die Frage etwas genauer formulieren?
Ist mir zu lang, um es auf Nachvollziehbarkeit zu prüfen.

Grüße
Biber
Member: hagbardceline
hagbardceline Jun 10, 2008 at 16:04:37 (UTC)
Goto Top
Jo danke für den Hinweis und die Tipps, ich mache morgen nochmal nen neuen Thread auf (aber ist das nicht etwas Spammig wenns jeder macht, sonne normale ansicht der neuesten Beiträge wäre doch Sinnvoller oder?)

Zu 1) Lese ich mir morgen durch, so grob hab ich es verstanden, vieleicht wirds mir morgen klare, ist schon spät..

Zu 2) Es geht mir darum:

'//--------------------------  
'// Add to Group subroutine  
'//--------------------------  

Sub Add2Group(Byval sDN)

Const ADS_PROPERTY_APPEND = 3

On Error Resume Next

'// Test if group is empty  
If IsEmpty(oGroup) Then
Set oGroup = GetObject _
("LDAP://cn=" & sGroup & ",ou=" & sOU1 & ",ou=" & sOU2 & ",ou=" & sOU3 & "," & sRoot)  
End If

'// Add user to group  
oGroup.PutEx ADS_PROPERTY_APPEND, _
"member", Array(sDN)  
oGroup.SetInfo
sDN = Nothing

'// Test if user is already member of group  
If err.number <> 0 Then
msgbox "User " & sLogon & _  
" is already a member of " & sGroup, _  
,vbExclamation, "Add Bulk Users"  
Exit Sub
End If 

Okay PutEx dürfe auch son Mutlivalue sein gell? Schau ich morgen noch mal..

Danke nochmal und Gruß,

h.c.
Member: Biber
Biber Jun 10, 2008 at 19:37:33 (UTC)
Goto Top
Moin hagbardceline,

aber ist das nicht etwas Spammig wenns jeder macht,
sonne normale ansicht der neuesten Beiträge wäre doch Sinnvoller oder?
Hmmja, und wie es der Zufall will, habe ich genau diesen Wunsch am Sonntag auch noch mal im AFABS als Issue #537 eingetragen.
Aber als allererster hat es rony-x2 schon am Test-Tag der neuen Forumsversion am 23.5. angemerkt in diesem beliebten "Wartungsarbeiten heute abend"-Thread..

Na ja, und gegen spammige Beiträge gehe ich ja (manchmal relativ gerne) manuell vor. Wenn wir eine (Teil-)Frage hier beantworten können und ein Grüner Haken an einen Beitrag mit einem passenden Titel kommt, dann sehe ich es nicht als Spamm an.

Und was den geposteten Schnipsel betrifft... wenn Du jetzt weißt, dass es um Multivalue-Attribute geht, dann ist auch klar, dass dort eben nicht einfach ein Username als Inhalt des Attributes objgroup eingetragen werden darf, sondern in die (Teil-)Struktur "Member der Gruppe" eine Liste (=ein Array) bestehend aus einem Usernamen.

können wir aber auch morgen noch mal in Ruhe anschauen.

Grüße
Biber