marin 10 Geschrieben 24. Oktober 2006 Melden Teilen Geschrieben 24. Oktober 2006 Hallo Zusammen Nachdem ich aufgefordert wurde, mein von Frank erhaltenes Script zu publizieren hier das Script. Habe es erhalten und sollte es jetzt eine Lehrer erklären können, was leider ohne VB Wissen sehr schwierig ist:mad: Suche jemand der mir das Script Zeile für Zeile kommentiert (Kaffekassenbeitrag) Option Explicit Dim objRootDSE, strDNSDomain, objCommand, objConnection Dim strBase, strFilter, strAttributes, strQuery, objRecordSet Dim strDN, strAltRecipient Set objRootDSE = GetObject("LDAP://RootDSE") strDNSDomain = objRootDSE.Get("defaultNamingContext") Set objCommand = CreateObject("ADODB.Command") Set objConnection = CreateObject("ADODB.Connection") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" objCommand.ActiveConnection = objConnection strBase = "<LDAP://" & strDNSDomain & ">" strFilter = "(& (objectCategory=person)(objectClass=user ))" strAttributes = "distinguishedName,profilePath" strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree" objCommand.CommandText = strQuery objCommand.Properties("Page Size") = 100 objCommand.Properties("Timeout") = 30 objCommand.Properties("Cache Results") = False Set objRecordSet = objCommand.Execute 'so jetzt wird das recordset durchlaufen und der Pfad geändert 'eventuell hier jetzt was anpassen strSrvneu="\\W2K3-05" strSrvalt="\\W2K-05" Do Until objRecordSet.EOF strProfalt = objRecordSet.Fields("profilePath") If InStr(1,strProfalt,strSrvalt,1) Then strUser = objRecordSet.Fields("distinguishedName") Set objUser = GetObject("LDAP://" & strUser) objUser.Put "profilePath", strSrvneu & Right(strProfalt,Len(strProfalt)-Len(strSrvalt)) objUser.SetInfo intZaehler = intZaehler+1 End If objRecordSet.MoveNext Loop ' Clean up. objConnection.Close Set objRootDSE = Nothing Set objCommand = Nothing Set objConnection = Nothing Set objRecordSet = Nothing MSGBOX "Es wurden" & intZaehler & "Benutzer geändert" Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 24. Oktober 2006 Melden Teilen Geschrieben 24. Oktober 2006 echt eine doofe Situation! Ich glaub, ohne dich selbst auf den Hosenboden zu setzen, wirst du da auch nicht mehr rauskommen. Zitieren Link zu diesem Kommentar
woiza 10 Geschrieben 24. Oktober 2006 Melden Teilen Geschrieben 24. Oktober 2006 Hi, das Skript ist ja eher simpel. Ich kann dir das gerne kommentieren, allerdings sollte ich wissen, wofür du das ganze brauchst, bzw. was du damit bezweckst. Willst du das Skript verstehen oder sollst du es jmd. anderem erklären. Bin nicht neugierig, aber ich sollte ja schon wissen, ob der Adressat ne Ahnung von Skripting hat oder eher nicht. Gruß woiza Zitieren Link zu diesem Kommentar
Squire 260 Geschrieben 24. Oktober 2006 Melden Teilen Geschrieben 24. Oktober 2006 Habe es erhalten und sollte es jetzt eine Lehrer erklären können Hey Woiza ... willst Du seine Hausaufgaben machen :D Zitieren Link zu diesem Kommentar
woiza 10 Geschrieben 24. Oktober 2006 Melden Teilen Geschrieben 24. Oktober 2006 Vielleicht ist spät, aber wieso Hausaufgaben? :confused: Edit: ist wirklich spät, hab jetzt das Zitat gesehen. Naja, wenn's ne Hausaufgabe ist, wid er mit der Erklärung allein etwas im Regen stehen, weil er ja bei der ersten Nachfrage farbe bekennen müsste... Zitieren Link zu diesem Kommentar
marin 10 Geschrieben 24. Oktober 2006 Autor Melden Teilen Geschrieben 24. Oktober 2006 Hallo Wioza Besten Dank für dein Angebot. Das Script bekam ich mal von Frank (Boardmitglied, er wollte mir das auch kommentieren, aber ich erreiche ihn seit einiger Zeit nicht) für eine Umstellung von diversen Profilpfaden bei einem Serverwechsel mit Namenswechsel. Nun mache ich eine Projektarbeit zum Thema Desasterecovery, wobei auch die Thematik von nicht gesichertem Systemstate und Systempartition ein Thema ist. Demnach (wenn zumidest ein Datenbackup besteht) könnte nun auch das Script wieder zum Einsatz kommen. Ich sollte jedoch eine kurze Funktionserklärung haben und die ausführliche Kommentierung des Codes. Meine VB Kenntnisse sind bei DIM = Variabel definieren zu ende. @Squire, Man kann nicht alles wissen und beherrschen zum Thema EDV. SW-Entwicklung ist nicht mein Thema. Zudem ist es nicht Kernbestandteil meiner Doku. Zitieren Link zu diesem Kommentar
woiza 10 Geschrieben 24. Oktober 2006 Melden Teilen Geschrieben 24. Oktober 2006 Naja, mit SW-Entwicklung hat das auch wenig zu tun. Ich kanns dir aber gerne morgen kommentieren. Für dein eigenes berufliches Fortkommen würde ich dir aber dringend die Beschäftigung zumindest mit einer Skriptsprache empfehlen. Zitieren Link zu diesem Kommentar
marin 10 Geschrieben 24. Oktober 2006 Autor Melden Teilen Geschrieben 24. Oktober 2006 Danke schon mal! Ich bekomme das nicht das erste Mal gesagt. Bisher arbeite ich fast nur in 5-15 User Netzen da konnte ich gut auf Scripting verzichten. Aber ich sehe schon was mit Longhorn und Ex2007 (Stichwort PowerShell) auf einem zukommt, da wirds sich mittelfristig wohl nicht verhindern lassen:cry: Hier noch mein Mail für Fragen und Bankverbindungen für die Kaffekasse:) marin@gmx.ch (Oder wiederspricht das den Boardregeln?) Gruss Martin Zitieren Link zu diesem Kommentar
Lian 2.415 Geschrieben 25. Oktober 2006 Melden Teilen Geschrieben 25. Oktober 2006 Off-Topic:Kannst Deine Mailadresse gerne posten, ich möchte Dich nur davor warnen, daß Du in Zukunft seeeehr viel Spam erhalten wirst, da Robots (in dem Fall Email Harvester) unsere Website lieben ;) Zitieren Link zu diesem Kommentar
marin 10 Geschrieben 25. Oktober 2006 Autor Melden Teilen Geschrieben 25. Oktober 2006 @Lian Danke für den Hinweis, dann wird GMX ja was zu tun bekommen:-) Na ja, meine nun angegebene Mail ist eh schon Spamgeflutet:mad: Gruss Martin Zitieren Link zu diesem Kommentar
woiza 10 Geschrieben 25. Oktober 2006 Melden Teilen Geschrieben 25. Oktober 2006 Hi Marin, hab das Skript jetzt mal kommentiert. Darf ich fragen, in welchem Kontext die Projektarbeit steht? Achso und noch ein paar Links, die ich mir auf alle Fälle ansehen würde, sonst kommst du mit den Comments nicht weit: Hier kannst du die aktuelle Windows Script Doku herunterladen. Die ist wirklich gut verständlich und Klasse geeignet, um die VBS-Funktionen, wie Right, Instr usw. nachzuschlagen. Auch die Funktionsweise von DO LOOP und If Then findest du dort. Hier gibts die Doku zu ADSI, wobei ich mir lieber das gesamte Microsoft Platform SDK runterladen würde. Darin findest du auch viel Zeugs zu AD, LDAP usw. Und vor Allem hast du dann auch die Infos zu ADO, das ist das Zeugs, mit dem du die DB-Abfragen definierst. LDAP ist dir hoffentlich geläufig, ADSIEdit auch bekannt. Damit kannst du die Feldnamen im AD herausfinden. Außerdem hilft es, wenn dir Begriffe, wie Subtree, Onelevel usw. schon mal begegnet sind. Wenn nicht, dann schau dir mal DSQuery oder ldp.exe an. Da wird in der Hilfe einiges erklärt. Alternativ wieder Platform SDK. Zu den LDAP-Queries, oder LDAP Search Filter, wie sie ganz korrekt heissen: rfc 2254 Du kannst auch zum besseren Verständnis des Skripts an allen Stellen, wo eine Variable befüllt wird, diese in der nächsten Zeile mal mit msgbox variablenname ausgeben. Das trägt auch zum besseren Verständnis bei. Also z.B.: strDNSDomain = objRootDSE.Get("defaultNamingContext") msgbox strDNSDomain Ach und du solltest den Code bei Schleifen oder Ifs immer einrücken, das erhöht die Lesbarkeit. Gut, das sollte dann mal genügen. Ist letztendlich deine Sache, ob du dir das ansiehst, aber besser wäre es wahrscheinlich. Noch ein letzter Tipp Hier gibts zig fertige Scripts, Erklärungen, Beispiele, Tutorials usw. Gruß woiza Zitieren Link zu diesem Kommentar
woiza 10 Geschrieben 25. Oktober 2006 Melden Teilen Geschrieben 25. Oktober 2006 'Heißt soviel, wie du darfst keine Variable verwenden, die du nicht mit dim definiert hast Option Explicit 'Variablendefinitionen Dim objRootDSE, strDNSDomain, objCommand, objConnection Dim strBase, strFilter, strAttributes, strQuery, objRecordSet Dim strDN, strAltRecipient 'Liefert den RootDomänenKontext zurück Set objRootDSE = GetObject("LDAP://RootDSE") 'Liefert den Namen der Root, also DC=Test,DC=local strDNSDomain = objRootDSE.Get("defaultNamingContext") '## Die Suche wird mit ADO ausgeführt ## 'Das Command-Object wird hier initialisiert, die Suchoptionen werden danach an das Commandobjekt angehängt Set objCommand = CreateObject("ADODB.Command") 'Connection wird initialsiert Set objConnection = CreateObject("ADODB.Connection") 'Der Provider der Connection wird auf ADSI gesetzt; hier könnte die Connection z.B. auch auf Access/SQL Server... gesetzt werden objConnection.Provider = "ADsDSOObject" 'Connection wird geöffnet objConnection.Open "Active Directory Provider" 'Dem ADO-Command wird die soeben geöffnete Verbindung zugeordnet objCommand.ActiveConnection = objConnection '## Der Suchstring wird zusammengebaut siehe auch RFC 2254 ## 'Die Searchbase wird auf die Domäne eingestellt, alternativ könnte die Suche z.B. erst in einer OU beginnen strBase = "<LDAP://" & strDNSDomain & ">" 'Der Suchfilter wird definiert, in etwa der WHERE-Teil von SQL strFilter = "(& (objectCategory=person)(objectClass=user))" 'Welche Attribute soll die Suche zurückliefern, etwa der Teil hinter dem SELECT bei SQL strAttributes = "distinguishedName,profilePath" 'Die gerade definierten Werte werden zu einer LDAP-Query zusammengesetzt; 'das zusätzliche Subtree ist der Scope, in dem Fall wird der LDAP-Tree also nach unten durchsucht strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree" 'Auch der LDAP-Query qird jetzt an den ADO-Command angehängt objCommand.CommandText = strQuery '## Es werden noch ein paar Abfrageoptionen definiert ## 'PageSize: es werden immer 100 Werte am Stück zurückgeliefert; ist der Wert zu hoch, scheitert die Suche -> LDAP Policy im AD 'Standardlimit ist 1000 -> ntdsutil objCommand.Properties("Page Size") = 100 'Timeout erklärt sich von selbst, der Wert sind Sekunden objCommand.Properties("Timeout") = 30 'Die Abfrage wird nicht gecacht objCommand.Properties("Cache Results") = False 'Das ADO_Command hat jetzt alles, was es braucht und wird ausgeführt; das Ergebnis wird an ein Recordset übergeben Set objRecordSet = objCommand.Execute 'zwei Variablen werden befüllt, ich hätte dies aus "ästhetischen Gründen" schon oben gemacht strSrvneu="\\W2K3-05" strSrvalt="\\W2K-05" Zitieren Link zu diesem Kommentar
woiza 10 Geschrieben 25. Oktober 2006 Melden Teilen Geschrieben 25. Oktober 2006 'eine Schleife startet hier und wird bis zum Ende des RecordSet durchlaufen Do Until objRecordSet.EOF 'Für den aktuellen Datensatz wird die Variable Profalt mit dem aktuellen Wert des Feldes profilePath befüllt strProfalt = objRecordSet.Fields("profilePath") 'InStr siehe Windows Script Doku; grob wird in strProfalt geschaut, ob darin strSrvalt vorkommt 'if then ist ja hoffentlich aus der Ausbildung bekannt, ansonsten Doku If InStr(1,strProfalt,strSrvalt,1) Then 'ist der Server gefunden, wird der distinguishedName des aktuellen Datensatzes in strUser geschrieben strUser = objRecordSet.Fields("distinguishedName") 'Sucht das Userobjekt mit dem entsprechenden Namen Set objUser = GetObject("LDAP://" & strUser) 'Put schreibt in das Feld profilePath das Zeug hinter dem Komma ' dort wird strSrvneu mit dem alten Profilpfad abzügl. dem alten Server verbunden 'dies geschieht durch das Right, auch hier Doku objUser.Put "profilePath", strSrvneu & Right(strProfalt,Len(strProfalt)-Len(strSrvalt)) 'Put hat nur das gecachte Objekt angefasst, mit SetInfo wird die Änderung ins AD geschrieben objUser.SetInfo 'Ein Zähler, der sich bei jeder Änderung um eins erhöht intZaehler = intZaehler+1 'Ende des If-Blocks End If 'Der Zeiger des RecordSet rutscht in die nächste Zeile objRecordSet.MoveNext 'hier endet die Schleife, wenn EOF erreicht ist Loop ' Clean up. 'Die Verbindung wird geschlossen objConnection.Close 'Die Objekte werden aus dem Speicher geworfen Set objRootDSE = Nothing Set objCommand = Nothing Set objConnection = Nothing Set objRecordSet = Nothing 'Die Messagebox meldet die Anzahl der Benutzer, die geändert wurden, siehe Zähler weiter oben MSGBOX "Es wurden" & intZaehler & "Benutzer geändert" Zitieren Link zu diesem Kommentar
woiza 10 Geschrieben 26. Oktober 2006 Melden Teilen Geschrieben 26. Oktober 2006 Hallo Marin, wäre nett zu erfahren, ob du mit der Doku was anfangen kannst. Gruß woiza Zitieren Link zu diesem Kommentar
marin 10 Geschrieben 26. Oktober 2006 Autor Melden Teilen Geschrieben 26. Oktober 2006 Hallo wioza Sorry dass du nichts gehört hst von mir, war gerade ziemlich im Stress. Danke für deine Kommentierung, ich werde sobald als möglich mich der Sache widmen. Danke für die Links! Gruss Martin Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.