Jump to content

Suche VBScript Profi


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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"

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar
'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"

Link zu diesem Kommentar
'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"

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...