18228
Goto Top

VBSkript - Netzlaufwerk bei Anmeldung löschen und neu verbinden

Hallo zusammen,

ich habe ein kleines "Zeitproblem" mit einem VBSkript. Und dieses Skript ist auch mein erstes VBSkript.

Bei der Anmeldung soll überprüft werden, ob es ein bestimmter Laufwerksbuchstabe (z.B. "P:") schon vorhanden ist. Wenn dies zutrifft, dann soll dieses Netzlaufwerk ("P:") getrennt und im direkten Anschluss neu verbunden werden.

Ich frage also mit *DriveExists("P")* ab, ob der Laufwerksbuchstabe "P" schon vergeben ist und lösche ggf. mit *Set objNetwork = CreateObject("WScript.Network")* und *objNetwork.RemoveNetworkDrive "P:"* die Verbindung. Danach soll dann mit *Set objNetwork = CreateObject("WScript.Network")* und *objNetwork.MapNetworkDrive "P:", "\\Server\Freigabe"* das Laufwerk "P" neu verbunden werden.

Leider funktioniert das Ganze nicht, da bei der Skriptausführung nicht auf die Abarbeitung und die tatsächlichen Trennung gewartet wird. Dadurch bleibt alles so, wie vor dem Start des Skriptes, d.h. die alte Netzlaufwerksverbindung bleibt bestehen.

Wenn ich zwischen der Trennung und der neuen Verbindung eine Messagebox einblende und etwas warte, bis ich auf OK drücke, dann funktioniert alles wunderbar.

Wie kann ich dieses Problem automatisch und sicher lösen?

Besten Dank im Voraus für eure Hilfe.

Howi

Content-Key: 17222

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

Printed on: April 19, 2024 at 19:04 o'clock

Member: gemini
gemini Oct 05, 2005 at 10:44:26 (UTC)
Goto Top
Hallo Howi,
warum so kompliziert?
Es passiert nichts schlimmes, wenn du die Laufwerke trennst, auch wenn sie nicht existieren:
' ~~~~~~~~~~~~~~~~~~~~
' Mapping1.vbs
' Trennt, verbindet die angegebenen Laufwerke und benennt sie um
strFileSRV = "DerFileServer"
Set WshNetwork = Wscript.CreateObject("Wscript.Network")
Set objShell = CreateObject("Shell.Application")
WshNetwork.RemoveNetworkDrive "P:"
WshNetwork.MapNetworkDrive "P:", "\\" & strFileSRV & "\public"
objShell.NameSpace("P:").Self.Name = "Public auf """ & strFileSRV & """"
' ~~~~~~~~~~~~~~~~~~~~
' Mapping2.vbs
' Trennt _alle_ Netzlaufwerke, auch solche
' die vom User selbst erstellt wurden
strFileSRV = "DerFileServer"
Set WshNetwork = Wscript.CreateObject("Wscript.Network")
Set colDrives = WshNetwork.EnumNetworkDrives
On Error Resume Next
If colDrives.Count > 0 Then
For i = 0 To colDrives.Count - 1 Step 2
WshNetwork.RemoveNetworkDrive colDrives(i), TRUE
Next
End If
On Error GoTo 0
WshNetwork.MapNetworkDrive "P:", "\\" & strFileSRV & "\public"
objShell.NameSpace("P:").Self.Name = "Public auf """ & strFileSRV & """"
' ~~~~~~~~~~~~~~~~~~~~

Dadurch bleibt alles so, wie vor dem Start des Skriptes,
d.h. die alte Netzlaufwerksverbindung bleibt bestehen.
Bist du sicher? Könnte es sein, dass die alte Verbindung überschrieben wird?
Evtl. geht das schneller als du schauen kannst.
Zum testen, ERST alle Laufwerke trennen, PAUSE, Schauen was passiert ist, DANN wieder verbinden.

Gruß
gemini
Mitglied: 18228
18228 Oct 05, 2005 at 11:05:49 (UTC)
Goto Top
Hallo gemini,

Danke für die schnelle Antwort.


Leider funktioniert es immer noch nicht. Ich habe dein "Mapping1.vbs" einmal ausprobiert und der gleiche Effekt trat auf. Wenn das Laufwerk vorhanden ist, dann passiert nichts und wenn ich zwischen Remove und Map mit Hilfe einer MsgBox die Ausführung der Skriptes anhalte, dann trennt es erst das Netzlaufwerk und nach meinem "Klick" wird es neu verbunden.

Und wenn das Laufwerk nicht vorhanden ist, dann kommt eine Fehlermeldung, dass das Laufwerk nicht vorhanden ist. Eigentlich logisch. Deshalb habe ich auch erst eine Abfrage auf die Existenz des Laufwerks eingebaut.

Ich muss noch dazu sagen, dass ich ein Laufwerk von Server "A" trennen möchte und von Server "B" verbinden (u.a. wegen bevorstehendem Serverumzug).

Na gut, ich werde mal alle möglichen Dinge, die mir noch so einfallen, ausprobieren.

Über weiter Tipps würde ich mich natürlich freuen.

Howi
Mitglied: 16640
16640 Oct 05, 2005 at 11:17:28 (UTC)
Goto Top
warum verwendest Du statt eines Skriptes nicht einfach eine Batchdatei (.bat bzw. .btm)? Durch deren sequentielle Abarbeitung solltest Du dieses 'Timing'-Problem umgehen.

Erst die Trennungen (hier am Beispiel von Uface-smile

if exist u:\ net use u: /delete

und dann die neuen Mappings:

net use u: \\servername\freigabe

hand/dba
Mitglied: 18228
18228 Oct 05, 2005 at 11:36:17 (UTC)
Goto Top
Hallo dba,

daran habe ich auch schon gedacht und wenn es anders nicht ohne großen Aufwand klappt, dann werde ich auch diesen Weg gehen. Da nach der Verbindung das Netzlaufwerk auch noch umbenannt werden soll (da habe ich nur eine VBSkript-Lösung), habe ich gedacht, ich erledige alles in einem Skript. Dann hätte ich nicht die verschiedenen Funktionen aufgeteilt (VBSkript - Batch).

Howi
Mitglied: 16640
16640 Oct 05, 2005 at 11:41:51 (UTC)
Goto Top
Hi Howi,

umbenennen? Erklär' mal, mach mir ein Beispiel face-wink


hand/dba
Mitglied: 18228
18228 Oct 05, 2005 at 12:02:25 (UTC)
Goto Top
So, da bin ich wieder,

mit umbenennen meinte ich z.B. die Änderung von "Freigabename auf Servername (PC0815) (Pface-smile" in "Persönlich (Pface-smile.

Siehe auch Frage zu Anmeldeskript.

Howi
Member: gemini
gemini Oct 05, 2005 at 12:14:41 (UTC)
Goto Top
Leider funktioniert es immer noch nicht. Ich
habe dein "Mapping1.vbs" einmal ausprobiert und der gleiche Effekt trat auf.
Wenn das Laufwerk vorhanden ist, dann passiert nichts und wenn ich zwischen Remove
und Map mit Hilfe einer MsgBox die Ausführung der Skriptes anhalte, dann
trennt es erst das Netzlaufwerk und nach meinem "Klick" wird es neu verbunden.
Ich mache es so, dass erst alle Laufwerke mit der Schleife getrennt werden und danach anhand bestimmter Kriterien (RaumNR) wieder verbunden.
Wenn ich das Loginscript hier aufrufe kann ich das sogar im Explorer verfolgen

Und wenn das Laufwerk nicht vorhanden ist, dann kommt eine Fehlermeldung, dass das
Laufwerk nicht vorhanden ist. Eigentlich logisch. Deshalb habe ich auch erst eine
Abfrage auf die Existenz des Laufwerks eingebaut.
On Error Resume Next und On Error GoTo 0 bringen Abhilfe
Mitglied: 18228
18228 Oct 05, 2005 at 12:22:39 (UTC)
Goto Top
Hallo gemini,

ich habe auch den Arbeitsplatz geöffnet und sehe entweder nichts oder mit MsgBox-Pause wie das Laufwerk getrennt und anschließend neu verbunden wird.

Vielleicht sollte ich doch den Weg über Batchdatei (Trennen+Verbinden) plus VBSkript (Namensänderung) gehen.

Falls ihr doch noch Tipps habt, immer her damit.

Howi
Member: gemini
gemini Oct 05, 2005 at 13:39:08 (UTC)
Goto Top
Ich hab das jetzt nochmal ausprobiert.
Zuerst alle Laufwerke trennen lassen (mit der Schleife) und dann nur noch ein Laufwerk gemappt und das auf einen anderen Pfad (Mein Homelaufwerk auf ein Public-Verzeichnis) - Es funktioniert, wenn ich auf H:\ klicke bin ich im Public-Ordner, ohne MsgBox oder ähnliches
Member: Biber
Biber Oct 07, 2005, updated at Oct 17, 2012 at 14:01:40 (UTC)
Goto Top
Moin howi,

falls es mit dem VBSkript nicht so schnell klappt und Du doch auf Net-Use- und simple Batch-Befehle zurückfällst: wie das mit dem Netzlaufwerke umbenennen per Batch geht, hab ich auch schon ein- oder zweimal hier im Forum beschrieben.

Einen Beitrag hab ich wiedergefunden: net use I: \\archiv\ Name.

@gemini: Die Batch-Variante aber natürlich nur als Notlösung. Dein Script läuft schon prima *zwinker

HTH Frank / der Biber aus Bremen
Member: gemini
gemini Oct 07, 2005 at 14:38:20 (UTC)
Goto Top
@gemini: Die Batch-Variante aber natürlich nur als Notlösung. Dein Script läuft schon prima *zwinker
@Biber
Ich weiß dass das Script läuft und die Laufwerke richtig verbindet.
U.a. das tut es bei mir täglich und bis jetzt hat es noch keine Beschwerden gegeben.

Wenn er das Script nicht hinbekommt ist es allemal besser, ein Batch laufen zu lassen und danach ein VBS zum umbenennen bzw. den Weg über die Registry zu gehen.

Ach ja, ich habe die Batch-Variante, genausowenig wie Batch an sich, nie als Notlösung bezeichnet.
Member: Biber
Biber Oct 07, 2005 at 21:21:44 (UTC)
Goto Top
@gemini
face-wink
Ich meinte das auch durchaus ernst, dass Dein Skript prima läuft (auch bei mir).
Und ich denke auch nicht, dass sich ein Glaubenskrieg über Sinnhaftigkeit oder Existenzberechtigung von native Batch-Jobs oder VB/JScript oder KiX oder oder oder... lohnt.
Ich verwende viel Cmd-Krams aus den gleichen Gründen wie Du VBSkript - damit können wir beide jeweils stehend freihändig und ohne lang nachzudenken zum Ziel kommen - und das an einem beliebigen Rechner (solange eine Tastatur dranhängt).
Ansonsten weiß ich sehr wohl die Vorzüge von strukturierten Programmschnipseln zu schätzen und will ja nur hin und wieder zeigen, dass sich auch mit (Cmd-)Batchmitteln einige mittelkomplexe Aufgaben lösen lassen.
Wichtiger ist mir meist die Lösungsstrategie, der Algorithmus - das verwendete Werkzeug (also die Programmier- oder Skriptsprache) ist mir sowas von egal...

Da nun sicherlich bei den heutigen Rechnern auch die Performance-Unterschiede zwischen Skriptsprachen und kompilierten Anwendungen bei unseren kleinen Pillepalle-Anwendungen kaum ins Gewicht fallen, stehen für hoffentlich für die meisten Programmnutzer Kriterien wie Robustheit, Flexibilität, Les- und Wartbarkeit und natürlich Portabiltät im Vordergrund. Und nicht die Dateiendung *.vbs, *.js,*.kix oder *.bat. Ist mir alles lieber als eine unflexible oder nicht-portable Exe-Datei.
Was die Lesbarkeit und Nachvollziehbarkeit von Deinen geposteten Beispielen betrifft - da habe ich überhaupt keine Verbesserungsvorschläge zu machen.

Biber
Mitglied: 18228
18228 Oct 10, 2005 at 14:51:38 (UTC)
Goto Top
Hallo zusammen,

ich hatte leider keine Zeit, um auf eure Antworten früher zu reagieren.

Noch einmal vielen Dank für die Ratschläge. Und dann wollte ich die Batch-Dateien nicht runtermachen, sondern "Notlösung" bedeutete in diesem Fall nur, dass ich die Funktionen nicht mit zwei verschiedenen Dateien (Skript und Batch) lösen wollte. Da es ja wohl auch eine Möglichkeit gibt, die Bezeichnung des verbundenen Netzlaufwerkes mit Hilfe einer Batch-Datei zu verändern (sorry, ich hatte auch noch keine Gelegenheit, mir den oben gelisteten Link/Beitrag anzusehen), werde ich zusehen, dass ich ohne VBSkript die Geschichte löse.

Ich werde mich auf jeden Fall wieder melden, wenn es funktioniert.

Howi
Member: TuXHunt3R
TuXHunt3R Jul 26, 2007 at 09:20:20 (UTC)
Goto Top
Gibt es in VBScript nicht so etwas wie ein "sleep"?

Ansonsten hier eine einfache Batchlösung:

if exist p: (
net use P: /delete
)

net use P: \\server\share

Nicht getestet, müsste aber hinhauen