VBA Anpassung für Laufwerkmapping mit User und Passwort
Hilfe bei VBA Anpassung für Laufwerkmapping mit User und Passwort
Hallo,
bin grade dabei mir ein Script anzupassen womit ich zu Hause mich mit meinem NAS verbinden kann ohne das jemand mein User bzw Password weiß.
Folgende Lösung funktioniert soweit bis auf die Ausgabe der Errorcodes falls welche auftreten. Ich find einfach nicht herraus was ich noch verändern muss damit diese richtig ausgegeben werden.
Dann würd ich auch gern noch statt das ich den User eingeben muss das ich ein Auswahlfeld habe wo ich den User auswählen kann. Könnte mir da auch jemand helfen?
Grüße Sky
Hallo,
bin grade dabei mir ein Script anzupassen womit ich zu Hause mich mit meinem NAS verbinden kann ohne das jemand mein User bzw Password weiß.
Folgende Lösung funktioniert soweit bis auf die Ausgabe der Errorcodes falls welche auftreten. Ich find einfach nicht herraus was ich noch verändern muss damit diese richtig ausgegeben werden.
Dann würd ich auch gern noch statt das ich den User eingeben muss das ich ein Auswahlfeld habe wo ich den User auswählen kann. Könnte mir da auch jemand helfen?
Grüße Sky
' Bei Fehlern Script weiterlaufen lassen
On Error Resume Next
'--------------------------------------------------------------------
' Netzlaufwerke f: bis z: trennen Asc(f)=102 ...Asc(z)=122
' ACHTUNG: auf Kleinschreibung bei Netzlaufwerken achten
'-----------------------------------------------------------------
Dim DelNetDrive
Set WshNet = CreateObject("WScript.Network")
For DriveAsc = 105 To 122
On Error Resume Next
DelNetDrive = Chr(DriveAsc) & ":"
WshNet.RemoveNetworkDrive DelNetDrive, True, True
next
On Error Goto 0
' Diese Funktion nutzt den IE zum erstellen eines Dialogfensters für Username und Password
Dim objIE
' Erstellen einen IE Objektes
Set objIE = CreateObject( "InternetExplorer.Application" )
' Setzen der IE Einstellungen
objIE.Navigate "about:blank"
objIE.Document.Title = "Login Netzlaufwerke"
objIE.ToolBar = False
objIE.StatusBar = False
objIE.Resizable = False
objIE.Width = 400
objIE.Height = 300
' Zentrieren des Dialogfensters auf dem Desktop
With objIE.Document.ParentWindow.Screen
objIE.Left = (.AvailWidth - objIE.Width ) \ 2
objIE.Top = (.Availheight - objIE.Height) \ 2
End With
' Erstellen des HTML-Codes für das Dialogfenster
objIE.Document.Body.InnerHTML = "<DIV align='center'><P>" & myPrompt _
& "</P>" & vbCrLf _
& "<div align='center'><P>" & myMessage _
& "</P>" & vbCrLf _
& "<P>User: <INPUT TYPE='input' SIZE= '20'" _
& "ID='Username'/></P>" & vbCrLf _
& "<P>Password: <INPUT TYPE='password' SIZE= '20'" _
& "ID='Password'></P>" & vbCrLf _
& "<P><INPUT TYPE='hidden' ID='OK'" _
& "NAME='OK' VALUE='0'/></p>" _
& "<INPUT TYPE='submit' VALUE='OK'" _
& "OnClick='VBScript:OK.Value=1'/></P></DIV>"
' Sichbarkeit des IE Fensters
objIE.Visible = True
' Warten bis der OK Button gedrückt wurde
Do While 0 = objIE.Document.All.OK.Value
Wscript.Sleep 250
Loop
' Lesen des Username und Password vom Dialogfenster
getUsername = objIE.Document.All.Username.Value
getPassword = objIE.Document.All.Password.Value
' Schließen des IE Scriptes
objIE.Quit
Set objIE = Nothing
if getUsername = "user1" then
' Verbinden der Netzlaufwerke für user1
Set WshNetwork = WScript.CreateObject("WScript.Network")
WshNetwork.MapNetworkDrive "w:", "\\homenas\verzeichnis 1", False, getUsername, getPassword
end if
if getUsername = "user2" then
' Verbinden der Netzlaufwerke für user2
Set WshNetwork = WScript.CreateObject("WScript.Network")
WshNetwork.MapNetworkDrive "t:", "\\homenas\verzeichnis 2", False, getUsername, getPassword
end if
' Fehlerbehandlung
' Netzlaufwerke wurden verbunden
if Err = 0 then
msgbox "Netzlaufwerke wurden verbunden."
else
select case Err.Number
case -2147024843
' Netzlaufwerke konnte nicht verbunden werden
msgbox "Netzlaufwerke wurden nicht verbunden. Vielleicht ist das Ziel offline. Versuchen Sie es später nochmal"
' Anmeldung fehlgeschlagen: Username oder Password falsch
case -2147023570
msgbox "Netzlaufwerke wurden nicht verbunden: Username und/oder Password falsch."
' Anmeldung fehlgeschlagen: Password falsch
case -2147024810
msgbox "Netzlaufwerke wurden nicht verbunden: Password falsch."
' Netzlaufwerk konnte nicht verbunden werden: Netzlaufwerke schon verbunden
case -2147023677
msgbox "Netzlaufwerke sind schon verbunden."
' anderer Fehler
case else
msgbox "Teilen Sie den aufgetretenen Fehler dem Administrator mit: "& vbCrLf & vbCrLf & err.Number & vbCrLf & Err.Description
end select
end if
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 184821
Url: https://administrator.de/contentid/184821
Ausgedruckt am: 22.11.2024 um 02:11 Uhr
14 Kommentare
Neuester Kommentar
Moin Moin,
bei der Anweisung "On Error Resume Next" ist dir klar, was du dem Script sagst?
Ich übersetzte mal: Wenn ein Fehler auftritt mache einfach weiter, ohne den Fehler zu melden!
Auch die Anweisung läuft ins Leere: On Error Goto 0
Eine Sprungmarke mit 0 zu benennen ist nicht sinnvoll. Schlimmer noch, diese Sprungmarke gibt es gar nicht.
Alle Netzlaufwerke trennt man z.B. mit net use * /delete /yes (warum du das auch immer brauchst??)
Sorry, mir erschließt sich noch nicht der Sinn und Zweck des Scriptes. In Windows bist du mit Benutzername / Passwort angemeldet. Wenn du nun auf der NAS für diesen Benutzer entsprechende Rechte vergibst, kannst auch nur du an die entsprechenden Ordner.
Grüße aus Rostock
Wolfgang
(Netwolf)
bei der Anweisung "On Error Resume Next" ist dir klar, was du dem Script sagst?
Ich übersetzte mal: Wenn ein Fehler auftritt mache einfach weiter, ohne den Fehler zu melden!
Auch die Anweisung läuft ins Leere: On Error Goto 0
Eine Sprungmarke mit 0 zu benennen ist nicht sinnvoll. Schlimmer noch, diese Sprungmarke gibt es gar nicht.
Alle Netzlaufwerke trennt man z.B. mit net use * /delete /yes (warum du das auch immer brauchst??)
Sorry, mir erschließt sich noch nicht der Sinn und Zweck des Scriptes. In Windows bist du mit Benutzername / Passwort angemeldet. Wenn du nun auf der NAS für diesen Benutzer entsprechende Rechte vergibst, kannst auch nur du an die entsprechenden Ordner.
Grüße aus Rostock
Wolfgang
(Netwolf)
@NetWolf
Grüße
bastla
Auch die Anweisung läuft ins Leere: On Error Goto 0
Das hat den Sinn, nach dem angesprochenen "On Error Resume Next
" wieder auf Standardfehlerhandling (also Abbruch mit Ausgabe des Fehlers) umzuschalten: On Error-Anweisung (Visual Basic)Alle Netzlaufwerke trennt man z.B. mit net use * /delete /yes
Grundsätzlich ja - aber deswegen eine Shell aufrufen? Die Zeilen ab 9 tun's ja auch ...Grüße
bastla
Moin skyacer,
bis auf die oben besprochenen
Alternativen sind:
Letzteres ist auch gleichzeitig ein Paradebeispiel für wiederverwendbaren Code ...
Viel Erfolg und freundliche Grüße von der Insel - Mario
bis auf die oben besprochenen
'On Error ...'
gibt es im WSH keine weiteren Sprungmarken. Der Aufbau des Scriptes lässt vermuten, dass Dir so etwas wie 'Goto Fehlerbehandlung'
vorschwebte (der Block am Ende) - ist aber leider nicht möglich.Alternativen sind:
'While'
- oder'Do Loop'
-Schleifen mit Eingabeüberprüfung solange, bis korrekter Wert eingegeben wurde zur Verhinderung von Fehlern im weiteren Ablauf;- vor der vermutlich fehlererzeugenden Zeile die Fehlerausgabe ausschalten (
'... Resume Next'
), danach eine komplette Fehlerbehandlung einbauen und Fehlerausgabe wieder einschalten ('... Goto 0'
); - Fehlerausgabe generell ausschalten und ein extra Sub (oder Function, falls Rückgabewerte gewünscht) erstellen, in dem eine komplette Fehlerbehandlung erfolgt. Diese(s) nach all den Zeilen rufen (
'Call Fehlerbehandlung'
), die einen Fehler verursachen [könnten].
Letzteres ist auch gleichzeitig ein Paradebeispiel für wiederverwendbaren Code ...
Viel Erfolg und freundliche Grüße von der Insel - Mario
Moin skyacer,
um zu überprüfen, dass hier nicht das gespeicherte Passwort vom IE weitergereicht wird, solltest Du selbiges testweise einmal löschen - ist es an dem, müsstest Du evtl. von dieser Eingabemaske abrücken oder
Als 1. Tipp sei noch vermerkt, eigene Funktionen/Subs nicht so zu benennen wie reservierte Wörter der Programmierumgebung (i.e.
Der 2. Tipp betrifft das Rufen der Fehlerbehandlung (i.e. in Zeile 30):
- wenn die Zeile 28 einen Fehler verursacht, weil z.B. der verwendete Laufwerksbuchstabe nicht frei ist und
- wenn danach Zeile 29 einen Fehler verursacht, weil z.B. die verwendete Freigabe nicht erreichbar ist
wird, wenn mit Zeile 30 die Auswertung des Fehlers erfolgen soll, nur der letzte Fehler (i.e. Err.Number) behandelt werden, der vorhergehende wurde 'überschrieben'.
Ergo: Hinter jeder Zeile, die potentiell Fehler verursachen kann, wird die Fehlebehandlungsroutine gerufen! Damit aber nicht jedesmal die komplette Prüfung erfolgt, wird das nur getan, wenn ein Fehler aufgetreten ist, etwa so:
Freundliche Grüße von der Insel - Mario
um zu überprüfen, dass hier nicht das gespeicherte Passwort vom IE weitergereicht wird, solltest Du selbiges testweise einmal löschen - ist es an dem, müsstest Du evtl. von dieser Eingabemaske abrücken oder
getPassword
bei Neuaufruf entladen (leeren). Als dauerhafte Lösung wäre eine Speicherung der ersten Ausführung des Scriptes in der aktuellen Sitzung in einer Umgebungsvariablen möglich, die, jedesmal abgefragt vom Script, zu der Entscheidung herangezogen werden kann, das Passwort erneut abzufragen oder neu zu verbinden oder die Verbindungen zu prüfen oder was auch immer.Als 1. Tipp sei noch vermerkt, eigene Funktionen/Subs nicht so zu benennen wie reservierte Wörter der Programmierumgebung (i.e.
'error'
).Der 2. Tipp betrifft das Rufen der Fehlerbehandlung (i.e. in Zeile 30):
- wenn die Zeile 28 einen Fehler verursacht, weil z.B. der verwendete Laufwerksbuchstabe nicht frei ist und
- wenn danach Zeile 29 einen Fehler verursacht, weil z.B. die verwendete Freigabe nicht erreichbar ist
wird, wenn mit Zeile 30 die Auswertung des Fehlers erfolgen soll, nur der letzte Fehler (i.e. Err.Number) behandelt werden, der vorhergehende wurde 'überschrieben'.
Ergo: Hinter jeder Zeile, die potentiell Fehler verursachen kann, wird die Fehlebehandlungsroutine gerufen! Damit aber nicht jedesmal die komplette Prüfung erfolgt, wird das nur getan, wenn ein Fehler aufgetreten ist, etwa so:
If Err.Number <> 0 Then Call ErrorHandler
Freundliche Grüße von der Insel - Mario
Moin skyacer,
Zum Beispiel, in dem Du Zeile 108 nicht ausführst oder einen leeren Wert übergibst:
Freundliche Grüße von der Insel - Mario
Zum Beispiel, in dem Du Zeile 108 nicht ausführst oder einen leeren Wert übergibst:
getPassword = ""
getPassword = Empty
' getPassword = ...
Freundliche Grüße von der Insel - Mario
Moin skyacer,
Was das Wort 'testweise' bedeutet ist aber klar? Ich dachte schon, Du wolltest eine Ursache finden ...
Wenn sich die Frage nach der Sinnfälligkeit solchen Tuns nicht stellt, kannst Du ein Array mit Fehlernummern (und dann aber auch Beschreibungen der verursachenden Zeile) erzeugen und je Zeile mit evtl. aufgetretenen Fehlern beladen lassen - das Ganze wertest Du zum Schluss aus.
Freundliche Grüße von der Insel - Mario
Zitat von @skyacer:
Okay das Klingt einleuchtend. Aber das Problem ist ja dann das ich ja keine Übergabe des Passwortes mehr habe, ergo
würde er auch keine Laufwerke verbinden. Also ist das nicht die optimalste Lösung.
Okay das Klingt einleuchtend. Aber das Problem ist ja dann das ich ja keine Übergabe des Passwortes mehr habe, ergo
würde er auch keine Laufwerke verbinden. Also ist das nicht die optimalste Lösung.
Was das Wort 'testweise' bedeutet ist aber klar? Ich dachte schon, Du wolltest eine Ursache finden ...
Wenn ich den Fehlerhändler hinter jede Zeile Beim Laufwerksverbinden einsetze würde ich ja bei jedem Fehler jeweils ein
Fenster bekommen. Gibt es die Möglichkeit das der/die Fehler dann nur zum Schluss gebündelt in einem Fenster angezeigt werden?
Fenster bekommen. Gibt es die Möglichkeit das der/die Fehler dann nur zum Schluss gebündelt in einem Fenster angezeigt werden?
Wenn sich die Frage nach der Sinnfälligkeit solchen Tuns nicht stellt, kannst Du ein Array mit Fehlernummern (und dann aber auch Beschreibungen der verursachenden Zeile) erzeugen und je Zeile mit evtl. aufgetretenen Fehlern beladen lassen - das Ganze wertest Du zum Schluss aus.
Freundliche Grüße von der Insel - Mario
Moin skyacer,
bis jetzt hast Du mehrmals nach einer Detailänderung und Vorschlägen zur Abhilfe eines Fehlers gefragt - und genau das hast Du jedesmal bekommen.
Eine Lösung, die das Sammeln von Fehlern vornimmt, ist nicht besonders sinnvoll, da der Anwender dann auch nichts mehr ändern kann - besser ist hier, den ganzen Scriptablauf so anzupassen, dass potentielle Fehler abgefangen werden. Beispiele wären die Prüfung auf Erreichbarkeit einer Freigabe oder die Prüfung auf Verfügbarkeit eines Laufwerksbuchstabens etc.
Wenn die Fehler gesammelt werden sollen, dann etwa so:
Nach jeder potentiell fehlererzeugenden Zeile folgenden Code einfügen:
An das Ende des Main-Blocks (Zeile 45/46) folgenden Block setzen:
Zeile 118 ändern in
Zeile 119 ändern in
Zeile 122 ändern in
Zeile 127 (
Freundliche Grüße von der Insel - Mario
bis jetzt hast Du mehrmals nach einer Detailänderung und Vorschlägen zur Abhilfe eines Fehlers gefragt - und genau das hast Du jedesmal bekommen.
Eine Lösung, die das Sammeln von Fehlern vornimmt, ist nicht besonders sinnvoll, da der Anwender dann auch nichts mehr ändern kann - besser ist hier, den ganzen Scriptablauf so anzupassen, dass potentielle Fehler abgefangen werden. Beispiele wären die Prüfung auf Erreichbarkeit einer Freigabe oder die Prüfung auf Verfügbarkeit eines Laufwerksbuchstabens etc.
Wenn die Fehler gesammelt werden sollen, dann etwa so:
Dim ErrArr(), i
Redim ErrArr(0) ' beides an den Anfang des Scriptes
Nach jeder potentiell fehlererzeugenden Zeile folgenden Code einfügen:
If Err.Number <> 0 Then
ErrArr(Ubound(ErrArr, 1)) = Err.Number ' Err.Number speichern
Redim Preserve ErrArr(Ubound(ErrArr, 1) + 1) ' neuen Platz im Array schaffen
End If
An das Ende des Main-Blocks (Zeile 45/46) folgenden Block setzen:
For i = 0 to Ubound(ErrArr, 1) - 1 ' -1 wg. letztem (unnötigen) Redim)
Call ErrorHandler(ErrArr(i))
Next
Zeile 118 ändern in
Function ErrorHandler(ByRef FehlerNummer) ' Fkt. bekommt bei Aufruf Wert übergeben
Zeile 119 ändern in
If FehlerNummer = 0 Then
Zeile 122 ändern in
Select Case FehlerNummer
Zeile 127 (
Err.Description
) wird nur die letzte Fehlerbeschreibung auswerfen (sie obigen Post), um das zu korrigieren, müsstest Du mehrere Arrays dimensionieren (da Preserve
nur die höchste Dimension ändern kann) und diese entsprechend füllen und übergeben - diesen (absurden) Aufwand hast Du aber nicht, wenn Du nach jedem Fehler die Fehlerbehandlung aufrufst (siehe weiter oben gemachte Aussagen).Freundliche Grüße von der Insel - Mario