Home > Computer & Technik, Skripte > Skript zum Verbinden eines Netzlaufwerks mit Benutzerabfrage

Skript zum Verbinden eines Netzlaufwerks mit Benutzerabfrage

Bei Firmenrechnern ist man es gewohnt, dass nach dem Einloggen automatisch alle Netzlaufwerke verbunden werden und man sofort loslegen kann. Nutzt man aber beispielsweise den eigenen Laptop oder klinkt sich via VPN ins Firmennetzwerk ein muss man ggf. händisch die Netzlaufwerke verbinden. Für Computer-Profis ist das kein Problem, für weniger technikbegeisterte Menschen kann das zu einem Problem werden.

Folgender Code-Schnippsel eigenet sich daher für Administratoren, die ihren Benutzern ein komfortables Interface zum Einhängen/Mount von Netzlaufwerken geben wollen.

Bei PCs, die bereits in der Domäne sind ist ein Skript nicht (normalerweise) notwendig. Via Kerberos-Authentifizierungsmechanismus wird der entsprechende Computer und Benutzer (der sich zuvor erfolgreich angemeldet hat) geprüft und kann ohne Probleme auf die Ressourcen zugreifen.

Sitzt man aber nun an einem PC, der nicht in der Domäne ist (oder es gibt keine Domäne), muss man per Hand die Verbindung zu den Netzlaufwerken herstellen (im Explorer „Netzlaufwerk verbinden“). In der Regel hat nun auch der lokale Benutzername nichts mit dem Benutzernamen zu tun, der auf dem Server für die Verbindung der Laufwerke benötigt wird. Also muss beim „Netzlaufwerk“-Dialog ein anderer Benutzername ausgewählt werden. Für „IT-affinere“ Personen natürlich kein Problem, für weniger geübte Benutzer wird da in der Regel schon ein kleines HowTo nötig und man wird sich anhören müssen, dass das zu umständlich sei.

Die Idee war also ein Skript dafür zu schreiben, dass Benutzername und Passwort abfrägt und anschließend die Verbindung zu den Laufwerken herstellt. Wer sich jetzt fragt, wo hier die Schwierigkeit liegt: Unter Windows (ohne installierte Powershell) gibt es keine Möglichkeit ein Passwort verdeckt (also z.B. mit Sternchen oder Leerzeichen) abzufragen, die Windows-Commandline hat keine derartige Abfrage vorgesehen. Nach ein bißchen Google-Recherchen habe ich herausgefunden, dass es exakt zwei Möglichkeiten (nennen wir es bessere Workarounds) gibt, ein Passwort abzufragen wovon ein Workaround bei näherer Betrachtung ungeeigenet war (funktioniert nur noch mit XP). Damit fiel die Wahl auf die andere Möglichkeit. Hier die algorithmische Kurzfassung:

Baue eine HTML-Seite mit dem Formular für Benutzername und Passwort und einem bißchen VBScript-Code. Zusätzlich wird ein VBScript notwendig, dass eben diese HTML-Seite im Internet Explorer (nur da funktioniert es) startet, die Formular-Eingaben übernimmt und dann zum Verbinden des Laufwerks/der Laufwerke nutzt.

Die Idee (und ein Teil des Quellcodes) zur Abfrage der Daten via HTML-Formular entstammt dem Microsoft Technet Script Center. Realisiert sieht das Ganze dann so aus:

Das HTML-Formular, dass die Abfrage der Benutzerdaten übernimmt, nennen wir es beispielsweise Abfrage.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<html>
    <head>
        <script LANGUAGE="VBScript">
 
        Sub RunScript
            OKClicked.Value = "OK"
        End Sub
 
        Sub CancelScript
            OKClicked.Value = "Cancelled"
        End Sub
 
        </script>
 
    </head>
 
<body style="font-family:Arial">
 
<h3>Einh&auml;ngen des Benutzerlaufwerks</h3>
<table border=0>
    <tr><td>Benutzername</td>
          <td><input type="text" name="UserName" size="40"></td>
    </tr>
    <tr><td>Passwort</td>
          <td><input type="password" name="UserPassword" size="40"></td>
  </tr>
</table>
 
<input type="hidden" name="OKClicked" size = "20">
 
<input id=runbutton class="button" type="button" value=" OK " name="ok_button" onClick="RunScript">
&nbsp;&nbsp;&nbsp;
<input id=runbutton class="button" type="button" value="Cancel" name="cancel_button" onClick="CancelScript">
 
</body>
 
</html>

Viel „Magic“ steckt da nicht hinter dem Formular. Beim Klick auf den OK oder Cancel-Button wird eine Variable gesetzt, die wir später in der VBS-Datei nutzen um herauszufinden welchen Button der Benutzer gedrückt hat.

abfrage

Abfrage-Dialog für Benutzername und Passwort

Die VBS-Datei (Abfrage.vbs), von der alles abhängt, sieht wie folgt aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
'************************************************
' Datei:    Abfrage.Vbs
' Autor:  (c) Markus Gillmeister
'
' Einhängen des Home-Netzlaufwerks fuer einen
' speziellen Benutzer
'
' Konfigurationsparameter
' NETBASE  = UNC-Pfad zu den Home-Laufwerken
' MAPDRIVE = Laufwerksbuchstabe der eingehängt wird
' HTMLPAGE = Pfad zur HTML-Datei, die die Daten abfrägt
'
'************************************************
 
NETBASE = "\\server\homes\"
MAPDRIVE = "H:"
HTMLPAGE = "<a class="linkification-ext" title="Linkification: http://server/Abfrage.html" href="http://server/Abfrage.html">http://server/Abfrage.html</a>"  ' falls lokal z.B. "<a class="linkification-ext" title="Linkification: file://C" href="file://C">file://C</a>:\Apps\Abfrage.html" 
 
On Error Resume Next
 
Set objNetwork = CreateObject("WScript.Network")
Set AllDrives = objNetwork.EnumNetworkDrives()
Set objExplorer = WScript.CreateObject("InternetExplorer.Application", "IE_")
 
' Internet Explorer starten
objExplorer.Navigate HTMLPAGE
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width = 450
objExplorer.Height = 350
objExplorer.Left = 300
objExplorer.Top = 200
objExplorer.Visible = 1
Do While (objExplorer.Document.Body.All.OKClicked.Value = "")
    Wscript.Sleep 250
Loop 
 
' Daten abfragen
strUsername = objExplorer.Document.Body.All.UserName.Value
strPassword = objExplorer.Document.Body.All.UserPassword.Value
strButton = objExplorer.Document.Body.All.OKClicked.Value
objExplorer.Quit
Wscript.Sleep 250
 
MOUNTPATH = NETBASE &amp; strUsername
 
If strButton = "Cancelled" Then
    Wscript.Quit
Else
		'Zunächst alle Netzlaufwerke trennen
		For j = 0 To AllDrives.Count - 1 Step 2
		     objNetwork.RemoveNetworkDrive MAPDRIVE, True, True
		Next
		'Netzlaufwerk mounten (keine Benachrichtung bei Fehler!)
		objNetwork.MapNetworkDrive MAPDRIVE, MOUNTPATH, False, strUsername,strPassword
 
		'ggf. weitere Laufwerke einhaengen
		'objNetwork.MapNetworkDrive "X:","\\server\share",false,strUsername,strPassword
 
End If

Ein paar Anmerkungen zu der VBS-Datei:

  • der Speicherort von der HTML-Datei (steht in der Variable HTMLPAGE) sollte wenn möglich auf einem Webserver liegen. Liegt die Datei nämlich auf dem lokalen Dateisystem erscheint eine Sicherheitswarnung (ActiveX) und der Benutzer muss explizit die Ausführung des Script-Codes erlauben. Eine Änderung der Sicherheitseinstellungen ist nicht sinnvoll, zumal der Internet Explorer dann eine jedesmal eine Warnung präsentiert, dass die Sicherheitseinstellungen ungenügend sind und auch diese Meldung muss weggeklickt werden.
  • Bevor das Laufwerk verbunden wird, werden zunächst alle Netzlaufwerke getrennt. Der Grund: Sollte bereits ein Laufwerk auf dem \\server unter einem anderen Benutzeraccount verbunden sein, schlägt das Einhängen fehl (Windows kann nicht verschiedene Benutzeraccounts gleichzeitig auf dem Server anmelden). Wer weiß was er tut und ein anderes Verhalten benötigt kann das Skript in Zeile 52 entsprechend modifizieren.
  • in der vorliegenden Ausführung versucht das Skript das Serververzeichnis NETBASE + strUsername einzuhängen (also beispielsweise \\server\homes\benutzername\). Wer was anderes braucht muss entsprechend die NETBASE-Variable ändern und ggf. Zeile 45 ändern.
  • selbstverständlich kann man auch weitere Laufwerke gleich miteinhängen, der Code hierzu steht als Kommentar in Zeile 58
  • ach ja, das Skript muss mit „on error resume next“-laufen, da es beim Start des Internet-Explorers zu einer Race Condition kommt und das Skript evtl. einen Fehler produziert. Durch „resume next“ wird sichergestellt, dass das Skript dann trotzdem weiterläuft. Somit erscheint auch keine Fehlermeldung falls das Einhängen des Laufwerks nicht geklappt hat (beispielsweise weil der Benutzer sich vertippt hat) – das muss ggf. noch separat geprüft werden.

Falls es noch Verbesserungsvorschläge / Anmerkungen gibt oder das Skript jemand so einsetzt, würde ich mich über einen kurzen Kommentar/Feedback freuen!

  1. Bisher keine Kommentare
  1. Bisher keine Trackbacks