tomtetom
Goto Top

Funktion um Netzlaufwerke zu verbinden

Mein Ziel: einfach mehrere Netzlaufwerke mit einer Methode erstellen zu können

Hier was ich bisher habe....

' Zweck: mehrere Netzlaufwerk verbinden mit eigener Bezeichnung

' Konsolenbefehl zum trennen aller bisher gemappten Laufwerke starten
Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("net use * /d /y")
Set WshShell = Nothing


' Variablen deklarieren
Dim objNetwork, objShell
Dim strMyName, strMyDriveLetter, strMyRemotePath


Public Function mapMyDrives(strMyName As String, strMyDriveLetter As String, strMyRemotePath As String) As Boolean

Set objNetwork = CreateObject("WScript.Network")
objNetwork.MapNetworkDrive strMyDriveLetter, strMyRemotePath
Set objShell = CreateObject("Shell.Application")
objShell.NameSpace(strMyDriveLetter).Self.Name = strMyName

mapMyDrives = True

End Function

' hier dann der Funktionsaufruf mit dem ich schön die Laufwerke verbinden kann
mapMyDrives("Mein Tauschlaufwerk", "T:", "\\server1\tausch")
mapMyDrives("Mein Backuplaufwerk", "B:", "\\server1\backup")


Set objNetwork = Nothing
Set objShell = Nothing


Leider kommt ständig ein Fehler das eine Klammer fehlen würde...
Ich bin kein VBler, aber denke schon nahe an der Lösung zu sein.
Ist der Lösungsansatz von hinten durch die Brust oder soweit okay?

Ziel: Ich möchte einfach ein sauberes Skript haben mit dem ich beim Rechnerstart erstmal alle bisherigen Laufwerke trenne und dann die neuen mit Bezeichnung anlege.

Wenn jemandem einfällt wie man zB noch prüfen kann ob Laufwerke bzw. Buchstaben bereits belegt sind zB D: für ein CD-Rom oder so, wäre ich dankbar für eine Abfrage wie man das prüft. Es gibt nichts schlimmeres als ein Mapping das fehlschlägt weil ein USB Stick oder CD-Rom oder Wechseldatenträger einen Laufwerksbuchstaben blockiert...

Danke für jeden Hinweis.

Content-ID: 11041

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

Ausgedruckt am: 05.11.2024 um 11:11 Uhr

8644
8644 16.02.2006 um 14:52:20 Uhr
Goto Top
Hi,

muß es wirklich VB sein? Falls nicht, nutz doch einfach net use in einer Batch.
Das Forum ist voll mit Beisplielen dazu.

Psycho

Klug ist jeder - der eine vorher, der andere hinterher
tomtetom
tomtetom 16.02.2006 um 15:19:23 Uhr
Goto Top
ja, vb weil ich die bezeichnung der netzlaufwerke selbst bestimmen will.


jetzt gehts!

hier der code.

' Zweck: mehrere Netzlaufwerk verbinden mit eigener Bezeichnung

' Konsolenbefehl zum trennen aller bisher gemappten Laufwerke starten
Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("net use * /d /y")
Set WshShell = Nothing

' Variablen deklarieren
Dim objNetwork, objShell
Dim strMyName, strMyDriveLetter, strMyRemotePath
Set objNetwork = CreateObject("WScript.Network")
Set objShell = CreateObject("Shell.Application")

Public Function mapMyDrives(strMyName, strMyDriveLetter, strMyRemotePath)

objNetwork.MapNetworkDrive strMyDriveLetter, strMyRemotePath
objShell.NameSpace(strMyDriveLetter).Self.Name = strMyName
mapMyDrives = ""

End Function

' hier dann der Funktionsaufruf mit dem ich schön die Laufwerke verbinden kann
mapMyDrives "Mein Tauschlaufwerk", "T:", "\\server1\tausch"
mapMyDrives "Mein Backuplaufwerk", "B:", "\\server1\backup"


Set objNetwork = Nothing
Set objShell = Nothing
Baruse
Baruse 31.03.2006 um 00:32:34 Uhr
Goto Top
Hallo tomtetom,

super !
genau sowas suche ich !
Jetzt fehlt für meine Zwecke noch der Benutzername und Kennwort:
bis jetzt arbeite ich mit "net use /USER:username pw"
und suche für Dein Super-Script die Möglichkeit, dieses auch fest zu hinterlegen und zwar möglichst pro Laufwerk.

PS: gibt's für das Script eine elegantere Lösung um vorh. Netzlaufwerke zu trennen, außer "WshShell.Run("net use * /d /y") " - das finde ich nicht ganz so schön, weil halt die Dos-Box kurz hochkommt.

Viele Grüße
Jörg
Biber
Biber 31.03.2006 um 01:07:18 Uhr
Goto Top
Moin baruse,

Die entsprechende Methode heißt .RemoveNetworkDrive

Du findest auch hier im Forum dazu Beispiele.

Ein "net use * /d" , also Trennen aller Netzlaufwerke ist über eine For..Each..Schleife möglich, aber ich verstehe nicht, wo dieses pauschale Trennen nötig sein soll.

Ich komme bislang mit dem gezielten Trennen der Laufwerke aus, die ich auch verbunden habe (oder neu verbinden will).
Also
Option Explicit
Dim objNetwork, strDriveMapped
strDriveMapped = "T:"   

Set objNetwork = CreateObject("WScript.Network")   
objNetwork.RemoveNetworkDrive strDriveMapped, TRUE ' TRUE entspricht dem "/Y bei "net use t: /D /Y"  
set objNetwork=null
'Wscript.Quit   

Gruß
Biber
P.S. Hier noch ein besseres Beispiel (das von gemini):
Baruse
Baruse 31.03.2006 um 01:16:24 Uhr
Goto Top
Hallo Biber,

vielen Dank für die prompte Antwort (zu solch nächtlicher Stunde)
wenn Du jetzt noch einen Tip hättest bez. des Usernamens... (jedem Mapping soll ein Username & Passwort mitgegeben werden)

Um es ganz genau zu machen:
ich suche eigentlich einen Ersatz für folgende Zeile:
if not exist s:\nul @354 use s: \\192.168.100.80\software /USER:username pw /persistent:yes
if not exist t:\nul @354 use t: \\192.168.100.80\driver /USER:username pw /persistent:yes

Also Abfrage ob das LW schon existiert ist und nur wenn nicht dann verbinden

von net use will ich weg weil.
1. keine Möglichkeit besteht, dem Laufwerk einen Namen zu geben
2. die Dos-Box einfach unschön ist

Viele Grüße
Jörg
Biber
Biber 31.03.2006 um 01:29:25 Uhr
Goto Top
Na, baruse,
dafür reichen meine spärlichen VBS-Kenntnisse gerade noch (aber das hätte Dir auch jeder hergelaufene Google gebracht):


Syntax MapNetworkDrive:
MapNetworkDrive(strLocalName, strRemoteName, [bUpdateProfile],[strUser], [strPassword])

Also müsstest Du tomtetoms Schnipsel aufbohren zu
...
Public Function mapMyDrives(strMyName, strMyDriveLetter, strMyRemotePath, strUsername, strPassword)

objNetwork.MapNetworkDrive strMyDriveLetter, strMyRemotePath, FALSE, strUsername, strPassword 
objShell.NameSpace(strMyDriveLetter).Self.Name = strMyName 
mapMyDrives = ""  

End Function

' hier dann der Funktionsaufruf mit dem ich schön die Laufwerke verbinden kann  
mapMyDrives "Mein Tauschlaufwerk", "T:", "\\server1\tausch", "baruse", "ioT67f"  
mapMyDrives "Mein Backuplaufwerk", "B:", "\\server1\backup" ,"baruse" , "ioT67f"  
...

Gruß Biber
Baruse
Baruse 31.03.2006 um 10:10:12 Uhr
Goto Top
Hallo Biber,

mensch super !
Ich bin in Sachen VBA noch völlig blank - vielen Dank für die schnelle Hilfe !
Hat noch jemand 'ne Idee wie man abfragen kann, ob das Laufwerk bereits verbunden ist und nur dann die Schritte ausführt ?
M.W. kommt ja ne FM wenn man versucht ein LW zu verbinden welches bereits verbunden ist.
Das möchte ich halt abfangen.

Viele Grüße
Jörg
Biber
Biber 31.03.2006 um 21:27:33 Uhr
Goto Top
Moin Jörg,
ich hatte weiter oben doch einen Link zu einer gemini-Lösung gepostet.
Und an geminis VBS-Schnipseln lässt sich genausowenig etwas optimieren wie an an einem Elton-John-Song.

In dem Schnipsel wird einfach die Liste aller gemappten Laufwerke durchlaufen und removed.
Entspricht doch Deinem "net * /d /y" (und im nächsten Atemzug wieder "net use .../persistant") *gg
....
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), blnForce
  Next
End If
On Error GoTo 0

'...usw  

Und wenn Du bei Dir nur die Laufwerke "S:" und "T:" trennen willst und die sicherheitshalber neu mappen, dann prüfe doch innerhalb der "For i=0 To alleDrives"-Konstruktion, ob "uppercase(coldrives(i))="S" or "uppercase(coldrives(i))="T" ist.

Nur Mut..mit VBS kannst Du kaum was zerschroten...

Grüße
Biber
Baruse
Baruse 31.03.2006 um 21:59:12 Uhr
Goto Top
Hallo Biber,

ich glaub das ist alles nix für mich;
vor lauter Schnipsel werden jetzt nur noch Laufwerke getrennt, aber nicht mehr verbunden.
Problem ist auch daß ich überhaupt nicht verstehe was ich da zusammenschnipsle;
in einer Batchdatei kann ich wenigstens durch einfügen von "pause" sehen was er macht und warum was nicht funktioniert;
Kannst Du mir vielleicht den Code in einem Zug darstellen ?

Prüfen ob Netzlaufwerke vorhanden und wenn nicht dann (mehrere) verbinden, oder gleich alle trennen und neu verbinden...

Mit verzweifeltem Gruß
Jörg
Biber
Biber 01.04.2006 um 01:16:30 Uhr
Goto Top
Na, Jörg,

nun mal keine Panik. Auch in VBS gibt es Msgbox'en und wscript.echo's, mit denen Du Deinen Source-Code verfolgen kannst.
Und Du hast gleich zwei funktionierende Vorlagen (die von tomtetom und die von gemini), die Du nur noch zusammenkopieren musst.
Fang an, poste das Zwischenergebnis und dann bringen wir die Kuh zum Fliegen.

Wenn es überhaupt sein muss.
Denn ein bisschen unsinnig ist der Aufwand schon IMHO.
Du willst IMMER (persistent) diese zwei Netzlaufwerke haben ->einmal persistent brauchst Du nie wieder Username/Passwort oder ein Net use.
Bis es in fünf Jahren mal irgendeiner trennt.
Und ebenso unnötig ist das tägliche "Laufwerksbezeichnungen zuweisen". Mach ich ja auch nicht täglich.
Einmalig in die Registry (suche mal im Forum nach "Mountpoints") und gut ists.

Und die Notwendigkeit von VBS statt Batch, weil...
"WshShell.Run("net use * /d /y") " - das finde ich nicht ganz so schön, weil halt die Dos-Box kurz hochkommt.
*kopfschüttel*
Dann ändere das in "WshShell.Run("net use * /d /y", 0, True) " -- dann geht kein CMD-Fenster auf.

Egal, poste das, was Du hast, dann schreddern wir das im Forum zusammen.

Grüße
Biber
Baruse
Baruse 01.04.2006 um 01:47:19 Uhr
Goto Top
Hallo Biber,

hab jetzt irgendwie was hingekriegt und es scheint auch zu funktionieren;
ob das nun sinnig ist, weiß ich nicht weil ich den Code so nicht verstehe;
hab ich mir halt zusammengeklaut...

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), blnForce
Next
End If
On Error GoTo 0

Dim objNetwork, objShell
Dim strMyName, strMyDriveLetter, strMyRemotePath
Set objNetwork = CreateObject("WScript.Network")
Set objShell = CreateObject("Shell.Application")

Public Function mapMyDrives(strMyName, strMyDriveLetter, strMyRemotePath, strUsername, strPassword)

objNetwork.MapNetworkDrive strMyDriveLetter, strMyRemotePath, FALSE, strUsername, strPassword
objShell.NameSpace(strMyDriveLetter).Self.Name = strMyName
mapMyDrives = ""

End Function

On Error Resume Next
mapMyDrives "Bilder", "B:", "\\192.168.100.80\photo", "Username", "pw"
mapMyDrives "Musik", "M:", "\\192.168.100.80\music", "Username", "pw"
mapMyDrives "Eigene Dateien", "N:", "\\192.168.100.80\own", "Username", "pw"
mapMyDrives "Software", "S:", "\\192.168.100.80\software", "Username", "pw"
'mapMyDrives "Web-Baruse", "T:", "\\192.168.100.80\web", "Username", "pw"
'mapMyDrives "Test-Baruse", "U:", "\\192.168.100.80\test1", "Username", "pw"

Set objNetwork = Nothing
Set objShell = Nothing
Biber
Biber 01.04.2006 um 02:46:06 Uhr
Goto Top
Na, sieht doch sauberst aus, baruse,

ich glaube, dann können wir mal einen Moderator rufen, um den Thread zu schließen. face-wink
@tomtetom: Falls Du noch noch mitliest, könnstest Du bitte den Beitrag auf "Gelöst" setzen?

Schönes Wochenende allen
Biber
Baruse
Baruse 01.04.2006 um 11:35:08 Uhr
Goto Top
Hallo nochmal,

ich hatte es jetzt schon 2 mal, daß bei Neustart eines der Rechner das Laufwerk M zwar verbunden wurde, aber nicht mit dem Namen "Musik" sondern als "Netzlaufwerk".
An was kann das denn jetzt liegen ?

Wäre es nicht doch sinnvoller, erst abzufragen ob das Laufwerk bereits existiert und nur wenn nicht neu zu verbinden ?
Wie müßte so eine Abfrage aussehen ?

Gruß
Jörg