koluschkib
Goto Top

1. Zeile einer csv datei überspringen mit VBS

hallo Admin-Freunde face-smile

ich bin auf der suche nach dem syntax wie man die 1. zeiler einer .csv datei überspringt.
hab schon alle hilfen die ich habe ich anspruch genommen, doch ohne erfolg.

das einlesen der csv in das vbscript ist kein problem.
nur stehen in der 1. Zeile Vorname, Nachname usw. was eben ignoriert werden muss.

Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile ("c:\user.csv",1,0)  

Do while not f.AtEndOfLine
Zeile = f.readLine
Feld = split(Zeile,";")  
Vorname = Feld(0)
Nachname = Feld(1)
Abteilung = Feld(2)
Gruppe1 = Feld(3)
Gruppe2 = Feld(4)
Gruppe3 = Feld(5)
Gruppe4 = Feld(6)
Gruppe5 = Feld(7)

ist es nur ein wert der geändert werden muss damit es klappt?
ein lösungsansatz wäre sehr hilfreich

danke

koluschki

Content-Key: 143565

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

Ausgedruckt am: 29.03.2024 um 14:03 Uhr

Mitglied: Edi.Pfisterer
Edi.Pfisterer 26.05.2010 um 14:08:35 Uhr
Goto Top
Hallo!
So klein ist die Welt ....
Ich schon wieder

versuch doch mal folgende Idee:
definiere eine variable Zeilenzaehler und setze sie auf 0
dann zaehlst Du beim durchlaufen zur variable zeilenzaehler jeweils 1 dazu
und um die 1. Zeile zu überspringen sagst Du einfach:
if zeilenzaehler > 0 then
blablalba

fertig schaut das dann ungefähr so aus:

Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile ("c:\user.csv",1,0)  
zeilenzaehler = 0
Do while not f.AtEndOfLine
Zeile = f.readLine
if zeilenzaehler > 0 then
Feld = split(Zeile,";")  
Vorname = Feld(0)
Nachname = Feld(1)
Abteilung = Feld(2)
Gruppe1 = Feld(3)
Gruppe2 = Feld(4)
Gruppe3 = Feld(5)
Gruppe4 = Feld(6)
Gruppe5 = Feld(7)
end if
zeilenzaehler = zeilenzaehler+1
loop
Mitglied: 77559
77559 26.05.2010 um 14:08:39 Uhr
Goto Top
Wie wärs mit Zeile 03:
If Not f.AtEndOfLine Then Header = f.Readline

Gruß
LotPings
Mitglied: koluschkiB
koluschkiB 26.05.2010 um 14:26:20 Uhr
Goto Top
hey bastla,

wenn ich ne variable namens zeilenzaehler definiere
DIm zeilenzaehler
und mein script mitz deinem ansatz kombiniere, kriege ich denn fehler das bei

end if

eine anweisung erwartet, wieso auch immer.

lasse ich die variable Dim... weg und führe das script aus, so liest er nur die letzte zeile der .csv datei ein
komisch komisch
Mitglied: koluschkiB
koluschkiB 26.05.2010 um 14:29:21 Uhr
Goto Top
hey lot,

wenn ich dein script fragment in die 3. Zeile einfüge, bringt es leider nichts.
er erstellt einen user namens "Vorname Nachname" und erstellt dementsprechend gruppen mit dem namen "Gruppe1 usw..."
so wirklich klappen will es irgendwie nicht...

danke

koluschki
Mitglied: koluschkiB
koluschkiB 26.05.2010 um 14:38:50 Uhr
Goto Top
hab grad getestet, wie es ist wenn ich das loop am ende des scripts setze.
so wie es ursprünglich von mir geschrieben war.

kriege dann aber die fehler meldung

das ein verzeichnispfad ungültig ist.

komisch alles, da wenn ich diesen zeilezaehler komplett weg lasse und das script ausführe, alles immer noch wunderbar geht
Mitglied: Edi.Pfisterer
Edi.Pfisterer 26.05.2010 um 14:50:06 Uhr
Goto Top
Hallo koluschki!
Nur damit wir hier keine Unklarheiten bekommen oder ich gar schizophren werde:
BASTLA ist bastla und edi.pfisterer ist Edi Pfisterer
(und btw: ist der Mann, der hinter dem alias Bastla steht um einiges firmer im Umgang mit VBS als ich...
insofern wäre es eine Zumutung für ihn, uns hier zu verwechseln face-wink )

nun zu Deinem Problem:
Das mit dem Zeilenzaehler war eine Quatschidee...
Sorry!
hier nun eine andere Idee, die hoffentlich mehr Sinn gibt...

Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile ("c:\user.csv",1,0)  

Do while not f.AtEndOfLine
if len(zeile) = 0 then 
Header = true
else
Header = false
end if

Zeile = f.readLine
if Header = false then

Feld = split(Zeile,";")  
Vorname = Feld(0)
Nachname = Feld(1)
Abteilung = Feld(2)
Gruppe1 = Feld(3)
Gruppe2 = Feld(4)
Gruppe3 = Feld(5)
Gruppe4 = Feld(6)
Gruppe5 = Feld(7)

end if

' nun kommt der Eintrag ins AD  

loop
Mitglied: 77559
77559 26.05.2010 um 15:22:45 Uhr
Goto Top
Hallo Edi,

ich glaub ich bin im falschen Film face-sad

Nach koluschkis Eingangsbeschreibung funktioniert sowohl dein erster Ansatz als auch mein 4 sekunden später geposteter Versuch.

Entweder testet er falsch, oder er hat irreführende/unvollständige Angaben gemacht.

Dein 2.ter Versuch kann so nicht funktionieren weil Zeile erst initialisiert werden sollte.

Gruß
LotPings

PS: @Edi Einrückungen bei IF, Schleifen, Loops machen den Code deutlich besser lesbar face-wink
Mitglied: koluschkiB
koluschkiB 26.05.2010 um 15:44:31 Uhr
Goto Top
hey Edi,

also, ich hab dein scriptfragment da eingebaut aber ich kriege dennoch ne fehlermeldung, die ich nichts o ganz verstehen

hier ist der auszug aus dem script:
...
Gruppe5 = Feld(7)

end if

Passwort = left(Vorname,3)&left(Nachname,2)&"1234%"  
Passwort = LCase(passwort)

Set objOU = GetObject("LDAP://cn=users,dc=testad,dc=int")  
Set objUser = objOU.Create("user", "CN=" & Vorname & " " & Nachname)  
objUser.Put "sAMAccountName", Nachname  
objUser.Put "displayName", Vorname & " " & Nachname  
...

ich krieg ne fehlermeldung, dass in der zeile 10 ein übermitteleter verzeichnispfad falsch ist (????)
kann es nicht so ganz nachvollziehen wieso das so ist
vielleichtr hast du ne erklärung dafür

gruß
Mitglied: koluschkiB
koluschkiB 26.05.2010 um 15:45:41 Uhr
Goto Top
Nach koluschkis Eingangsbeschreibung funktioniert sowohl dein erster Ansatz als auch mein 4 sekunden später geposteter versuch


weder das fragment von dir noch von Edi haben funktioniert´, kriege bei beiden fehlermeldung.
habs aber auch hin geschrieben face-wink

gruß
Mitglied: Edi.Pfisterer
Edi.Pfisterer 26.05.2010 um 15:49:32 Uhr
Goto Top
Hallo LotPings!
Da kann ich Dir heute ausnahmsweise mal nicht recht geben...
mein 2. Ansatz funktionert - ich hab ihn auch getestet...

Das ist ja gerade der Gag an diesem Ansatz, dass die Variable zeile beim ersten Durchlauf der Schleife leer ist, in allen nachfolgenden Durchläufen allerdings nicht.

Was die Einrückungen betrifft gebe ich Dir natürlich recht, aber ich hab den code hier kurzerhand direkt ohne Umschweife eingetippt und da funktionieren TABs leider nicht... sorry!

was anderes:
ich durchblicke Deinen Code nicht...
wie ginge es nach
If Not f.AtEndOfLine Then Header = f.Readline
weiter?
oder gezielter gefragt:
Wird AtEndOfLine nicht erst erreicht, wenn die letzte Zeile erreicht ist? Falls dem so ist - hm... - ich blick einfach nicht durch....
Montagsproblem? face-wink
Danke für Deine Erläuterungen!
Mitglied: Edi.Pfisterer
Edi.Pfisterer 26.05.2010 um 16:00:19 Uhr
Goto Top
Hallo!
Wieder sinds die Anführungszeichen....

hm...

Vielleicht ginge hier Studieren doch über Probieren face-wink)

Set objUser = objOU.Create("user", "CN=" & Vorname & " " & Nachname)  
ergibt für die Variablen
Vorname = hans
nachname = huber

folgenden Wert für die Variable
objUser = objOU.Create("user", "CN=hans huber)

erkennst Du das fehlende Hochkomma am Ende? Vor allem in Kombination mit dem Leerzeichen ein Fehlerquell...

was hälst du von folgender Idee:
Username = Vorname & "_" & Nachname  
Set objUser = objOU.Create("user", "CN=" & Username)   

Gutes gelingen noch
ich geh jetzt heim face-wink
lg
Edi
Mitglied: 77559
77559 26.05.2010 um 16:18:00 Uhr
Goto Top
Zitat von @Edi.Pfisterer:
Hallo LotPings!
Da kann ich Dir heute ausnahmsweise mal nicht recht geben...
mein 2. Ansatz funktionert - ich hab ihn auch getestet...
Das ist ja gerade der Gag an diesem Ansatz, dass die Variable zeile beim ersten Durchlauf der Schleife leer ist, in allen
nachfolgenden Durchläufen allerdings nicht.
Bei mir klappte es nicht, wenn Zeile = "" gesetzt wird, ist die Länge auch null, aber die Variable ist initialisiert.

was anderes:
ich durchblicke Deinen Code nicht...
wie ginge es nach
> If Not f.AtEndOfLine Then Header = f.Readline
weiter?
Das ist doch nur dir Abprüfung ob die Datei ganz leer ist.
oder gezielter gefragt:
Wird AtEndOfLine nicht erst erreicht, wenn die letzte Zeile erreicht ist? Falls dem so ist - hm... - ich blick einfach nicht
f hat einen Lesepointer der mit jeder gelesenen Zeile fortbewegt wird, ist der Pointer mit dem Ende identisch,
ergibt die Abrage f.AtEndOfLine TRUE wenn nicht FALSE. Not kehrt das um.
AtEndOfLine kann beliebig oft abgefragt werden, die Do While.Loop macht das ja auch immer wieder face-wink

AtEndOfLine sollte hier IMO auch AtEndOfFile heissen.

Gruß
LotPings
Mitglied: Edi.Pfisterer
Edi.Pfisterer 27.05.2010 um 08:54:56 Uhr
Goto Top
Hallo LotPings!
Danke für die Erklärung...

lg
Mitglied: koluschkiB
koluschkiB 27.05.2010 um 10:34:27 Uhr
Goto Top
Moin Edi,

versteh nicht soganz was mir das ganze bringen soll?
wenn ich deine idee machen, habe ich im AD bei allen benutzern diesen unterstricht zwischen vor- und nachnamen. sind nicht so schön aus.
eigentlich ging es mir hier in diesem thread doch darum, wie man in einer .csv datei die erste zeile überspringt?!
wenn ich deine zweite idee, was das überspringen derzeile einsetze und anpasse kriege ich plötzlich nen syntaxfehler in einer function, die ansich nichts damit zu tun hat. ist für mich nicht ganz nachvollziehbar

hier der gesamte code, mit dem zeilesprung der leide rnicht klappt. das mit dem "Username" habe ich weggelassen

Option Explicit

Dim OU, objDomain, objOU, objUser, objGroup
Dim fso, f, Zeile, Feld, Vorname, Nachname, Abteilung, i, Passwort
Dim objFolder, strComputer, objWMIService, objNewShare, errReturn

OU = "cn=users,dc=testad,dc=int"  
Set objOU = GetObject("LDAP://" & OU)  

Dim File_Share
File_Share = 0
Dim MAXIMUM_CONNECTIONS
MAXIMUM_CONNECTIONS = 25

strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set objNewShare = objWMIService.Get("Win32_Share")  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile("c:\user.csv",1,0)  

Do while not f.AtEndOfLine 
if len(zeile) = 0 then  
Header = true 
else 
Header = false 
end if
Zeile = f.readLine 
if Header = false then 
end if

Zeile = f.readLine
Feld = split(Zeile,";")  
Vorname = Feld(0)
Nachname = Feld(1)
Abteilung = Feld(2)
'        Gruppen werden in Schleife direkt angesprochen  
'        Gruppe1 = Feld(3)  
'        Gruppe2 = Feld(4)  
'        Gruppe3 = Feld(5)  
'        Gruppe4 = Feld(6)  
'        Gruppe5 = Feld(7)  


Passwort = left(Vorname,3)&left(Nachname,2)&"1234%"  
Passwort = LCase(passwort)

Set objUser = objOU.Create("user", "CN=" & Vorname & " " & Nachname)  
objUser.Put "sAMAccountName", Nachname  
objUser.Put "displayName", Vorname & " " & Nachname  
objUser.Put "givenName", Vorname  
objUser.Put "sn", Nachname  
objUser.Put "description", Abteilung  
objUser.Put "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"  
objUser.SetInfo
objUser.SetPassword Passwort
objUser.Put "userAccountControl", 544  
objUser.Put "pwdLastSet", 0  
objUser.SetInfo

For i = 3 To 7 'alle Gruppen bearbeiten  
If Feld(i) <> "" Then  
If GroupExists(Feld(i), objOU) Then
Set objGroup = GetObject("LDAP://cn=" & Feld(i) & "," & OU)  
Else
Set objGroup = objOU.Create("Group", "cn=" & Feld(i))  
objGroup.Put "sAMAccountName", Feld(i)  
objGroup.SetInfo
End If
objGroup.Add objUser.ADSPath
End If
Next

'Ordner werden für denn Benutzer angelegt, dabei wird der Nachname als Ordnername verwendet  
Set objFolder = fso.CreateFolder("C:\Freigaben\" & Nachname)  
errReturn = objNewShare.Create _
    ("C:\Freigaben\" & Nachname, ""&Nachname, File_Share, _  
    MAXIMUM_CONNECTIONS, "Benutzerordner")  
Loop

Function GroupExists(Group, OU)
'OU wird als Objekt übergeben; es interessieren nur die enthaltenen Gruppen  
OU.Filter = Array("group")  
'Default: Gruppe noch nicht vorhanden  
GroupExists = False
'Alle in der OU enthaltenen Gruppen durchgehen  
For Each objGroup in OU
    'klein geschriebenen Gruppennamen der betrachteten Gruppe  
    'mit klein geschriebenem übergebenen Gruppennamen vergleichen  
    If LCase(objGroup.sAMAccountName) = LCase(Group) Then
        'bei Übereinstimmung gibt es die Gruppe bereits ...  
        GroupExists = True
        '... und es müssen die weiteren Gruppen nicht mehr geprüft werden  
        Exit For
    End If
Next
End Function

und ich weiss nicht, warum er mir nen syntaxfehler raushaut an einer stelle in der function
vielleicht hast du ne eklärung dafür

Edit:
Die variable Header hab ich bereist hinzugefügt. dafür kommt in der zeile 33 ein fehler "EINGABE HINTER DATEIENDE" (?)

gruß und danke

koluschkiB
Mitglied: Edi.Pfisterer
Edi.Pfisterer 27.05.2010 um 11:11:50 Uhr
Goto Top
Hallo!
füg mal in deinem Code in Zeile 22 folgendes ein
zeile = ""  

was die Variable Username (gestriger Beitrag 16:00:19 Uhr ) betrifft:
das ist wieder eine andere Baustelle und hat mit der 1. Zeile aus Deiner csv nichts zu tun!

eine Leerstelle beim login ist halt einfach upraktisch bis unbrauchbar... (ist so eine Meinung von mir).
daher also mein Ansatz mit dem Unterstrich... Alternativ geht auch ein "."
hm...

probier - falls Du auf dem leerzeichen bestehst folgendes (ohne Garantie, das es funktioniert)

Set objUser = objOU.Create("user", "CN=" & Vorname & " " & Nachname"")  

oder alternativ
MeinUsername = Vorname & " " & Nachname  
Set objUser = objOU.Create("user", "CN=" & MeinUsername)  

btw: ich bin mir nicht sicher, ob ein Leerzeichen im Username überhaupt von Windows akzeptiert wird...

lg
muss in den Unterricht
Mitglied: koluschkiB
koluschkiB 27.05.2010 um 11:12:24 Uhr
Goto Top
moin Edi,

ich hab denn fehler erkannt.
das script macht nur jede zweite zeile aus der .csv datei. quasi 2 - 4 - 6 - 8
1 soll er überspringen, aber 3 - 5 - 7 - 9 tut er auch überspringen
dann haut er ne fehler meldung raus "EINGABE HINTER DATEIENDE" = Zeile 33 des unten aufgeführten codes

ich hab die .csv datei mir angeschaut, hab gesehen dass ein ";" zu viel waren. aber selbst nach der korrektur, kommt die fehler meldung

gruß

koluschkiB
Mitglied: 77559
77559 27.05.2010 um 11:38:45 Uhr
Goto Top
Hallo koluschki,

wenn du deinen Code vernünftig einrücken würdest,
hättst du wahrscheinlich schon längst erkannt das du innerhalb der do While .. Loop zweimal einen readline machst :
Zeilen 29+33
Das Ergebnis ist also zu erwarten.
Und wenn du meine Kommentare gelesen hättest, wärst du vielleicht selber darauf gekommen.
Wenn du sie doch gelesen hast, solltest du überlegen das Programmieren besser Anderen zu überlassen.

Gruß
LotPings
Mitglied: koluschkiB
koluschkiB 27.05.2010 um 12:52:25 Uhr
Goto Top
Wenn du sie doch gelesen hast, solltest du überlegen das Programmieren besser Anderen zu überlassen.

Meine worte face-smile
ich hasse programmieren, hab aber keine anderen wahl gehabt als es mri 3monaten an zu tun. du verstehst? freiwllig befohlen sozusagen

Das Ergebnis ist also zu erwarten.
ich hab die beiden readline gesehen, wenn ich die erste innerhalb der while do raus machen. wird die erste zeile in der .csv nicht übersprungen, genau so ist es auch wenn ich die erste wieder reinsetze udn die zweite readline raus mache. also so oder so, es bringt kein ergebnis. die erste zeile wird einfach mitberücksichtigt.
sind beide drine kommt die fehlermeldung EINGABE HINTER DATEIENDUNG

ich hab deine kommentare gelsen, findet es aber selbst nicht übersichtlich wenn man diese da einrückt. im gegenteil. gut ich bin kein programmiere und es ist sicherlich auch sinnvoll wenn man unzählige functionen usw hat. aber so weit wird es nie kommen (gott sei dank auch)

gruß

koluschki
Mitglied: koluschkiB
koluschkiB 27.05.2010 um 13:09:26 Uhr
Goto Top
eine Leerstelle beim login ist halt einfach upraktisch bis unbrauchbar... (ist so eine Meinung von mir).
daher also mein Ansatz mit dem Unterstrich... Alternativ geht auch ein "."

wieso login??

der loginname ist

objUser.Put "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"   

der name mit dem leerzeichen ist nur der anzeigename im AD zb "Hans Maulwurf" --> login "HanMa"
man kann beides problemlos in denn eigenschaften des users im AD nach schauen
Mitglied: koluschkiB
koluschkiB 27.05.2010 um 13:34:19 Uhr
Goto Top
füg mal in deinem Code in Zeile 22 folgendes ein
> zeile = ""  
> 

also statt des f.readline einfach "" setzen?

geht nicht, erste zeile wird mit erstellt, somit hab eich nen user namens Vorname Nachname
Mitglied: Edi.Pfisterer
Edi.Pfisterer 27.05.2010 um 13:38:22 Uhr
Goto Top
Hallo!
kurze Pause hier bei mir face-wink

versuch mal folgendes:
zeile = ""  
Do while not f.AtEndOfStream
if len(zeile) = 0 then  
       Header = true 
else 
       Header = false 
end if

Zeile = f.readLine

if Header = false then 
' hier kommt nun dein teil...  

btw: die Einrückungen bei IF wären ein massiver Vorteil in Deinem Code...
Dann hättest Du gesehen, dass Zeile 30 und 31 nur Platzfüller sind, aber in dieser Form keinen Nutzen bringen
(da es ja keine Anweisung gibt, falls die Bedingung erfüllt ist...)

Falls Du es hinbekommst:
Bessere bitte deinen Code aus, damit jemand, der in Zukunft Dein unfreiwilliges Schicksal erlebt, mit googeln etwas Glück hat...
und nicht vergessen als gelöst makieren und vielleicht noch ein Hinweis, dass der Code so nun funktioniert...

btw: In der Praxis würde ich aus der csv die erste Zeile löschen und gut isses face-wink
Mitglied: 77559
77559 27.05.2010 um 13:47:10 Uhr
Goto Top
Zitat von @koluschkiB:
ich hasse programmieren, hab aber keine anderen wahl gehabt als es mri 3monaten an zu tun. du verstehst?
freiwllig befohlen sozusagen
Du hast also eigentlich nur 2 Möglichkeiten, ablehnen oder akzeptieren und reinknien.
Eine Dritte "rumjammern und Leute nerven", steht nicht zur Debatte.

ich hab die beiden readline gesehen, wenn ich die erste innerhalb der while do raus machen. wird die erste zeile in der .csv nicht
übersprungen, genau so ist es auch wenn ich die erste wieder reinsetze udn die zweite readline raus mache. also so oder so,
es bringt kein ergebnis. die erste zeile wird einfach mitberücksichtigt.
sind beide drine kommt die fehlermeldung EINGABE HINTER DATEIENDUNG
#§$"%&$§%$"§!
IN MEINER ERSTEN ANTWORT STAND ZEILE3, DAS IST AUSSERHALB DER DO WHILE..LOOP UND DA GEHÖRT EINE READLINE HIN, UM NUR DIE ERSTE ZEILE ZU ÜBERSPRINGEN!!!!

ich hab deine kommentare gelsen, findet es aber selbst nicht übersichtlich wenn man diese da einrückt. im gegenteil. gut
ich bin kein programmiere und es ist sicherlich auch sinnvoll wenn man unzählige functionen usw hat. aber so weit wird es nie
kommen (gott sei dank auch)
Du bist aber nicht alleine auf der Welt, und wenn du Hilfe erwartest, solltest du dich auch an einige Gepflogenheiten halten die lange erprobt sind.

Ich habe mich ja bisher für einen einigermassen geduldigen Menschen gehalten;
aber da du scheinbar vor hast, deine Lernresistenz weiter zu pflegen, sag ich nur

Tschüss.
Mitglied: koluschkiB
koluschkiB 27.05.2010 um 13:50:51 Uhr
Goto Top
meinst es so?

Set f = fso.OpenTextFile("c:\user.csv",1,0)  

zeile = ""  
Do while not f.AtEndOfLine 
if len(zeile) = 0 then  
Header = true 
else 
Header = false 
end if
Zeile = f.readline
if Header = false then 
end if

'Zeile = f.readLine   
Feld = split(Zeile,";")  
Vorname = Feld(0)
Nachname = Feld(1)
...

geht nicht. 1. zeile wird mitgenommen

und auch

Set f = fso.OpenTextFile("c:\user.csv",1,0)  

zeile = ""  
Do while not f.AtEndOfLine 
if len(zeile) = 0 then  
Header = true 
else 
Header = false 
end if
Zeile = f.readline
if Header = false then 
end if

Zeile = f.readLine 
Feld = split(Zeile,";")  
Vorname = Feld(0)
Nachname = Feld(1)

bringt nur denn bekannten fehler mit sich blabla DATEIENDUNG

gruß

koluschkiB
Mitglied: koluschkiB
koluschkiB 27.05.2010 um 15:18:53 Uhr
Goto Top
ich aktzeptiere es natürlich und versuche auch selbst dahinter zu kommen, wieso und weshalb irgendwas so ist wie es ist. aber auch ich stoße an meine grenzen, was für dich selbstständig ist, ist es für mich ein absolutes "WOW", dass ist alles neuland für mich. jeder hat seine stärken und schwächen. meine schwäche ist eineutig das programmieren.

irgendwie komme ich mir vor als würde ich hier vor meiner freundin sitzen und für jedes gesagte wort rechenschafft ablegen, aber egal...

ich bin euch natürlich für jede hilfe dankbar die ihr mir gibt und will euch keines wegs auf die nerven gehen. aber manchmal checke ich es absolut nicht was ihr mit irgendwas meint und dementsprechend kommt bei mir nur mist bei raus, w s euch wieder nervt.
vielleicht erwartet ihr einfach zu viel von mir?! ich hab komplexe aufgaben, dass bedeutet aber wieder rum nicht das ich es voll drauf habe. im gegenteil, ich muss mir jede bedenkliche info irgendwo her holen. angefangen beim ersten zeichen was ich in die .vbs datei reinschreibe... gut so krass ist es nicht, aber annäherend

gruß und danke für alle hilfen die ihr mir bis jetzt gegeben habt

koluschkiB
Mitglied: Edi.Pfisterer
Edi.Pfisterer 27.05.2010 um 15:39:00 Uhr
Goto Top
@77559:
Danke für deinen letzten Beitrag, jetzt hab ichs erst gecheckt, was der Zweck von
If Not f.AtEndOfLine Then Header = f.Readline
leichter hätt ich mir getan, wenn du noch ein paar weitere Zeilen angefügt hättest; unglaublich trotzdem, wie blind man sein kann...

@ koluschki
Merkst du was? Da, wo LotPings heute ist (mit seinen Nerven) war ich schon letzte Woche... Dürft also wohl eindeutig an Dir liege - wobei ich meine zu bemerken, dass sich Dein Ton schon sehr gebessert hat! Noch ein paar Wochen und wir haben Dich soweit, dass Du im Code Einrückungen berücksichtigst, im Text Groß- und Kleinschreibung bzw. die deutsche Rechtschreibung berücksichtigst und - das wird wohl das Entscheidende werden - die Antworten wirklich durchliest und nicht nur den Code kopierst und dich ärgerst, wenn er nicht funktionert...

Da Du aber ähnlich ticken dürftest wie ich (cholerisch, ungeduldig aber ausdauernd... face-wink ), habe ich aber jede Menge Verständnis für Dein Verhalten...

also, zum Problem zurück:
Was LotPings meinte, ist folgendes (in seiner 1. Antwort):
er liest vor der Do While Schleife die 1. Zeile aus und wirft sie weg....
(zu meiner Schande hab ich das auch erst jetzt durchschaut...)

Der entsprechende Code sieht dann so aus:
Set f = fso.OpenTextFile("c:\user.csv",1,0)  

Abfall = f.Readline   ' also die 1. Zeile  

Do while not f.AtEndOfStream       'statt AtEndOfLine  

Zeile = f.readLine 
Feld = split(Zeile,";")  
Vorname = Feld(0)
Nachname = Feld(1)
...

gutes gelingen weiterhin
lg
Edi
Mitglied: koluschkiB
koluschkiB 27.05.2010 um 15:56:21 Uhr
Goto Top
Hey Edi,

Da Du aber ähnlich ticken dürftest wie ich (cholerisch, ungeduldig aber ausdauernd... face-wink ), habe ich aber jede Menge
Verständnis für Dein Verhalten...


Es ist ja nicht so, dass ich mir zum Hobby gemacht habe, euch auf den Keks zu gehen face-smile
Aber du hast schon recht mit dem (siehe Zitat)
Ich gebe nicht so schnell auf, aber könnte bei jedem Fehlschlag in die Kiste unter den Tisch treten face-smile, Geduld ist das was ich nicht besitze...

und ich frue mich euch mitzuteilen, es hat geklappt... JUHUUUUUUU
Der Befehl überspringt die 1. Zeile und macht alles so wie es sein soll.

Für die Nachwelt, hier der komplette Code

Option Explicit

Dim OU, objDomain, objOU, objUser, objGroup
Dim fso, f, Zeile, Feld, Vorname, Nachname, Abteilung, i, Passwort, Abfall
Dim objFolder, strComputer, objWMIService, objNewShare, errReturn

OU = "cn=users,dc=testad,dc=int"  
Set objOU = GetObject("LDAP://" & OU)  

Dim File_Share
File_Share = 0
Dim MAXIMUM_CONNECTIONS
MAXIMUM_CONNECTIONS = 25

strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
Set objNewShare = objWMIService.Get("Win32_Share")  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set f = fso.OpenTextFile("c:\user.csv",1,0)  

Abfall = f.Readline 
Do while not f.AtEndOfStream 

Zeile = f.readLine 
Feld = split(Zeile,";")  
Vorname = Feld(0)
Nachname = Feld(1)
Abteilung = Feld(2)
'        Gruppen werden in Schleife direkt angesprochen  
'        Gruppe1 = Feld(3)  
'        Gruppe2 = Feld(4)  
'        Gruppe3 = Feld(5)  
'        Gruppe4 = Feld(6)  
'        Gruppe5 = Feld(7)  


Passwort = left(Vorname,3)&left(Nachname,2)&"1234%"  
Passwort = LCase(passwort)

Set objUser = objOU.Create("user", "CN=" & Vorname & " " & Nachname)  
objUser.Put "sAMAccountName", Nachname  
objUser.Put "displayName", Vorname & " " & Nachname  
objUser.Put "givenName", Vorname  
objUser.Put "sn", Nachname  
objUser.Put "description", Abteilung  
objUser.Put "userPrincipalName", left(Vorname,3) & left(nachname,2) & "@testAD.int"  
objUser.SetInfo
objUser.SetPassword Passwort
objUser.Put "userAccountControl", 544  
objUser.Put "pwdLastSet", 0  
objUser.SetInfo

For i = 3 To 7 'alle Gruppen bearbeiten  
If Feld(i) <> "" Then  
If GroupExists(Feld(i), objOU) Then
Set objGroup = GetObject("LDAP://cn=" & Feld(i) & "," & OU)  
Else
Set objGroup = objOU.Create("Group", "cn=" & Feld(i))  
objGroup.Put "sAMAccountName", Feld(i)  
objGroup.SetInfo
End If
objGroup.Add objUser.ADSPath
End If
Next

'Ordner werden für denn Benutzer angelegt, dabei wird der Nachname als Ordnername verwendet  
Set objFolder = fso.CreateFolder("C:\Freigaben\" & Nachname)  
errReturn = objNewShare.Create _
    ("C:\Freigaben\" & Nachname, ""&Nachname, File_Share, _  
    MAXIMUM_CONNECTIONS, "Benutzerordner")  
Loop

Function GroupExists(Group, OU)
'OU wird als Objekt übergeben; es interessieren nur die enthaltenen Gruppen  
OU.Filter = Array("group")  
'Default: Gruppe noch nicht vorhanden  
GroupExists = False
'Alle in der OU enthaltenen Gruppen durchgehen  
For Each objGroup in OU
    'klein geschriebenen Gruppennamen der betrachteten Gruppe  
    'mit klein geschriebenem übergebenen Gruppennamen vergleichen  
    If LCase(objGroup.sAMAccountName) = LCase(Group) Then
        'bei Übereinstimmung gibt es die Gruppe bereits ...  
        GroupExists = True
        '... und es müssen die weiteren Gruppen nicht mehr geprüft werden  
        Exit For
    End If
Next
End Function

danke euch allen die dabei mitgewirkt haben

grüße und wir hören, voneinander
...spätestens morgen, wenn ich wieder irgendwo hänge ^^

koluschkiB
Mitglied: Edi.Pfisterer
Edi.Pfisterer 27.05.2010 um 16:19:18 Uhr
Goto Top
Ja, freut mich, dass es jetzt funktioniert...

aber könnte bei jedem Fehlschlag in die Kiste unter den Tisch treten
Kenn ich, hab mir schon mal den Zehen gebrochen... (hab vergessen, den Monitorstromstecker einzustecken; der schwarze Bildschirm hat mich dann zu härteren Maßnahmen greifen lassen... face-wink ), allerdings war ich da noch um einiges jünger...

btw:
Gratuliere zu Deinem Ergebnis..
Was mich noch interessieren würde: wie schauts mit den NTFS-Berechtigugen auf den erzeugten Ordnern für die User aus?
Ich will Dir nicht den Mut rauben, aber da gäbe es imho noch Verbesserungspotential face-wink

lg
Mitglied: koluschkiB
koluschkiB 27.05.2010 um 16:38:35 Uhr
Goto Top
Hey Edi,

Was mich noch interessieren würde: wie schauts mit den NTFS-Berechtigugen auf den erzeugten Ordnern für die User aus?
Ich will Dir nicht den Mut rauben, aber da gäbe es imho noch Verbesserungspotential face-wink

Ja, also an denn Berechtigungen bin ich grad dran. Stelle es mir auch nicht all zu schwer vor, wobei die Sachen die ich bereits gefunden habe, nichts funktionieren.
In einigen Foren wird von XCacls.vbs gesprochen, was wiederum ein eigenes Script was petr CMD gestartet wird. Also doch recht kompliziert, hab hier auch n Buch liegen namens "Windows Scripting" aber so richtig hilft es mir nicht weiter.

hab folgendes gefunden:

Dim Dir

Const ADS_ACETYPE_ACCESS_ALLOWED = 0
Const ADS_ACEFLAG_INHERIT_ACE = 3

Set sec = CreateObject("ADsSecurity")  
Set sd = CreateObject("SecurityDescriptor")  
Set dacl = CreateObject("AccessControlList")  
Set ace = CreateObject("AccessControlEntry")  
Set newace = CreateObject("AccessControlEntry")  
Set FSO = CreateObject("Scripting.FileSystemObject")  


'====================== Hier Datei oder Ordner angeben =========================  

Dir = "C:\test"  

'================================================= ==============================  

If FSO.FolderExists(Dir) Then

Set sd = CreateObject("SecurityDescriptor")  
Set sd = sec.GetSecurityDescriptor("FILE://" & Dir)  
Set dacl = sd.DiscretionaryAcl



'====================== Hier die Rechte angeben ================================  

newAce.Trustee = "Administrator" 'Jeder  
newAce.AccessMask = -1 'Vollzugriff  
newAce.AceType = ADS_ACETYPE_ACCESS_ALLOWED 'Auf 'Zulassen'  
newAce.AceFlags = ADS_ACEFLAG_INHERIT_ACE 'Vererben auf Unterordner und Dateien  

'================================================= ==============================  

dacl.AddAce newAce
sd.DiscretionaryAcl = dacl
sec.SetSecurityDescriptor sd

End If

Bei dem Code mekert er aber, dass Active X elemente da nichts machen können (oder so ähnlich) er macht doof bei dem ADsSecurity, muss also schauen ob ich da was machen kann

selbst hier bei Admin.de habe ich Sachen dazu gefunden, aber irgendwie check ich es gar nicht... aber wird schon face-smile

Also ich dachte mir eigentlich, dass es so läuft. CreateFolder... und dann kommen eben dahinter der Name und eben die Berechtigung
Lesen/ Schreiben/ Lösche ... nur Gucken/ nicht Anfassen usw.
Aber so einfach scheint es nicht zu sein

gruß

KoluschkiB
Mitglied: koluschkiB
koluschkiB 27.05.2010 um 16:45:16 Uhr
Goto Top
Das Script teste, ich auf einem Ordner denn ich Extra dafür angelegt habe. Hab das User Gruppen usw anlegen erstmal weg gelassen. Wenn die berechtigungen erstmal stehen, kann ich sie ja in mein SuperScript einbasteln face-smile (irgendwie)

gruß

KoluschkiB
Mitglied: koluschkiB
koluschkiB 27.05.2010 um 16:47:05 Uhr
Goto Top
> aber könnte bei jedem Fehlschlag in die Kiste unter den Tisch treten
Kenn ich, hab mir schon mal den Zehen gebrochen... (hab vergessen, den Monitorstromstecker einzustecken; der schwarze Bildschirm
hat mich dann zu härteren Maßnahmen greifen lassen... face-wink ), allerdings war ich da noch um einiges jünger...

Ich bin 28 face-wink und selbst in diesem Alter schrecke ich nicht zurück zu härteren Maßnahmen zu greifen.
Mitglied: Edi.Pfisterer
Edi.Pfisterer 27.05.2010 um 17:25:48 Uhr
Goto Top
Ich bin 28 face-wink und selbst in diesem Alter schrecke ich nicht zurück zu härteren Maßnahmen zu greifen.
gemäß dem Motto:
"Und hilft nicht Gewalt, hilft viel Gewalt" face-wink

Vergiss den Ansatz mit deiner xcacls.vbs
Das geht wesentlich einfacher...

das Programm zum Setzen von Berechtigungen findet sich im Windwosordner und nennt sich cacls

dieses Programm kannst Du
a) direkt in über die MS-DOS - Konsole starten
start/ausführen/cmd --> cacls
(wundere Dich nicht über die karge optische Aufmachung des Programms)

oder
b) von Deinem SuperTool starten lassen

über die entsprechenden Paramter des Programms wirst Du informiert, wenn du
start/ausführen/cmd cacls/? eingibst

zu b)
hier ein Ansatz:
Set WshShell = WScript.CreateObject("WScript.Shell")    
    ' die Berechtigungen werden in den Verzeichnissen der User gesetzt   

    PermL1 = "Administratoren:F " & Lehrer & ":C " & MUsername & ":R "   

    PermL2 = MUsername & ":W "   

    PermA = "Administratoren:F " & Lehrer & ":C " & MUsername & ":R "   

    CMD = "cmd /c echo j|cacls \\" & ServerName & "\" & LoesungsShare & "\" & ZielOU & "\" & MUsername & " /G " & PermL1 & " && " & _   
                "echo j|cacls \\" & ServerName & "\" & LoesungsShare & "\" & ZielOU & "\" & MUsername & " /E /G " & PermL2 & " && " & _   
                 "echo j|cacls \\" & ServerName & "\" & AngabeShare & "\" & ZielOU & " /E /G " & PermA   

    WshShell.Run CMD, 0, 1	
Aber Achtung: so wird dieser code bei Dir nicht funktionieren...
Versuche mal mit cacls/? die Syntax von diesem Programm zu durchschaun...
Dann würde ich per Hand am entsprechenden Ordner unter Zuhilfenahme von cacls die Rechte zu verändern versuchen...
(Geduld ist hier gefragt, falls das Dein erster Einsatz von DOS ist...)

Wenn das gelungen ist: versuch diesen Code zu durchblicken...
Der Schwerpunt liegt natürlich in der Variable CMD
Tipp 1) echo j ---> ihat den Zweck, dass du nicht manuell auf J für JA drücken musst...
Tipp 2) (weil ich dich jetzt schon kenne): Achte auf die Hochkomma face-wink

gutes gelingen
lg
Edi
Mitglied: koluschkiB
koluschkiB 28.05.2010 um 08:52:59 Uhr
Goto Top
Moin Edi,

danke fürd ie vielen Tipps. Sieht einwenig kompliziert aus das ganze.
hab selbst das hier gefunden:

http://www.vbarchiv.net/tipps/tipp_1332-profilefolder-erstellen-verwalt ...

werde aber schauen, wie ich es nun zum laufen kriege.
ich muss es ja aus meinem, supertool starten. wenn ich das jetztr ichtig verstanden habe, kann ich also aus einem VBScript einen CMD befehl problemlos starten?!
Habs vorab schon mal getestet, ich nutze nen Win2008 server, und die cmd sagte mir gleich cacls ist alt junge, nimm icacls face-smile
werde damit bisschen rumexperimentieren face-smile
Denke, dass sollte kein Problem darstellen.
Werde einen neue Thread dann auf machen, wenn es so weit ist. Dieses Beitrag ist ja schon geschlossen, ging ja hauptsächlich um das überspringen der 1. Zeile in der .csv datei.

danke für die tipps

koluschkiB