Laufwerksbuchstaben ständig ändern

sanni74

Lt. Junior Grade
Dabei seit
Aug. 2011
Beiträge
304
Hallo, liebe CB-Com,
ich hoffe ihr könnt mir bei einer "nervenden" Angelegenheit helfen.
Problemstellung ist folgende:
Ich muss, so einfach wie möglich, ggf. an mehreren Notebook´s ggf. mehrmals täglich den Laufwerksbuchstaben ändern.
Das ganze unter z.Zt. Win 7 (32 und 64bit) und Win XP(32bit).
Der Hintergrund ist der Zugriff installierter Programme auf Projektdadenbanken welche sowohl auf dem Server, als auch auf der Notebookpartition identisch abgelegt sind.
Nötig wird das Ganze immer, wenn ich das Notebook via LAN-Kabel an den Dateiserver anschließe und natürlich auch, wenn ich es davon trenne... .

Dateiserver: Laufwerk X
Partition auf einem Notebook, wenn´s via LAN am Server hängt: Laufwerk L
Partition auf einem Notebook, wenn´s nicht am Server hängt: Laufwerk X

Somit muss ich atm die Laufwerksbuchstaben in der Computerverwaltung jedes mal umstellen.
Auf Dauer ist das sehr umständlich und wenn ich das Notebook einem Kollegen in die Hand gebe, der da nicht so fit ist, sind Probleme vorprogramiert ... :(.
Gibt es eine schnellere Variante, als den Weg über die Computerverwaltung ?
Bspw. eine Befehlszeile die man in Win7 ausführen kann ? Oder kann man so etwas in eine ausführbare Datei schieben, welche unter Win 7 und XP läuft (32 und 64bit) ?
Hat jemand eine noch effinzientere Lösung parat ? Ich bin da natürlich offen für bessere Ansäze und für jeden Hilfe dankbar.

edit/Ergänzung: Geht das auch syncron/leichter mit Netzlaufwerken ?
Ich könnte ja auch Netzwerklaufwerke anlegen und freigeben, nur müsste ich deren Namen dann ja genau so am laufenden Band ändern ....
 
Zuletzt bearbeitet:

Jokeboy

Rear Admiral
Dabei seit
Okt. 2007
Beiträge
5.844

CBCrosser

Commander
Dabei seit
Nov. 2012
Beiträge
2.692
Kann dir da die Scriptsprache Autoit ans Herz legen. Damit kannst du dann die Laufwerke auf Knopfdruck trennen und mit einem anderen Buchstaben wieder einbinden. Das ganz kann man dann natürlich auch automatisch laufen lassen.
Sollte mit einer Batch Datei auch möglich sein.
 

ika2k

Lieutenant
Dabei seit
Juni 2010
Beiträge
626
wenn du mehr erzählst (Hintergründe) kann man das ganze vielleicht auch mit Offlinedateien (sync erwünscht?) oder mehren gleichzeitigen Laufwerksbuchstaben und Netzlaufwerken hinbiegen...
 

sanni74

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Aug. 2011
Beiträge
304
wenn du mehr erzählst (Hintergründe) kann man das ganze vielleicht auch mit Offlinedateien (sync erwünscht?) oder mehren gleichzeitigen Laufwerksbuchstaben und Netzlaufwerken hinbiegen...
Gerne.
Es geht um ein Berechnungsprogramm, bei welchem die Projektdaten an einem bestimmten Pfad abgelegt sind. Nur wenn es genau da die Daten findet, läufts, sonst gibts nen Crash. Die Projektdaten liegen natürlich auf dem Server, bspw. X:\Daten.
Ist das Notebook am Server angeschlossen, kann man somit normal arbeiten/rechnen.
Zieh ich jetzt aber den Stecker und nehmes mit nach Hause oder wo anderes hin, gibts definitiv keinen Serverzugriff. Ich kann mir das Projekt zwar 1:1 kopieren und mitnehmen, das Berechnungsprogramm verweigert aber natürlich seine Arbeit, da die Datenpfade nicht stimmen.
Mein Gedanke war somit
1. die gewünschten Projekte unter Pfadbeibehaltung auf eine lokale Partition (ev. auch ein lokales Netzlaufwerk?) zu kopieren eine automatische Syncronisation wäre vermutlich eher hinderlich, da nicht alles lokal was gerechnet wird auf den Server soll usw.
Die Projekte werden somit einfach wie gewünscht entsprechend händisch kopiert.
2. und das ist halt meine Baustelle, muss jedes Mal bei Netzwerkkabel rein/raus der Laufwerksbuchstabe geändert werden.
Die Buchstaben zwischen denen gewechselt wird sind ja immer die Gleichen, nur der Aufwand ist gerade dafür relativ hoch und für die Kollegen schwerlich umsetzbar.
 

Madman1209

Fleet Admiral
Dabei seit
Nov. 2010
Beiträge
24.772
Hi,

Ich kann mir das Projekt zwar 1:1 kopieren und mitnehmen, das Berechnungsprogramm verweigert aber natürlich seine Arbeit, da die Datenpfade nicht stimmen.
Ist die Software eine Eigenentwicklung? Falls ja wäre es doch ein leichtes zu prüfen ob eine Netzwerkverbindung besteht oder nicht und dann ggf. die Pfade anzupassen, ohne dass man jedesmal was am System verändern muss...

VG,
Mad
 

ika2k

Lieutenant
Dabei seit
Juni 2010
Beiträge
626
Wenn nur manchmal Änderungen synchronisiert werden sollen, dann ist ein script bzw. der Vorschlag von Madman1290 wohl das beste...
 

sanni74

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Aug. 2011
Beiträge
304
@Madman1209
Das/die Berechnungsprogramm/e ist/sind keine Eigenentwicklungen. In denen ist nichts anpassbar. Dazu kommt, dass in den Projektdatenbanken auch Pfadangaben zu weiteren im Projekt liegenden Daten vorhanden sind.
Daher mein Gedanke mit der Laufwerksbezeichnung.

@all
Mein Bearbeitungsstand:
Der erste Link von Jokeboy hilft mir schon mal einen Schritt weiter.

DISKPART
select volume=L
assign letter=X
Exit

und natürlich andersrum ...

Nur wie pack ich das in eine unter xp und Win7 (32 und 64 bit)ausführbare Datei ?
edit:
wenn ich das in eine bat schreibe, kommt er bis zum DISKPART Start. das macht ernoch, dann bleibt er in der Eingabebox hängen :(.
Dazu kommt, das ich bei ner bat dann in den Eigenschaften keinen Haken setzen kann, dass er die immer als Admin ausführen kann. Somit muss ich immer die Sicherheitsabfrage bestätigen, möchte aber die Systemeinstellungen diesbezüglich nicht verändern.
Ergänzung ()

Hm, so wirds scheinbar nichts ....

Habe mir also mal AutoIt gezogen und begonnen, mich damit auseinander zu setzen ...

Mein momentaner Stand:


MsgBox ( 1,"LW-Buchstabenänderung", "Lokal L zu X" )
RunWait (@ComSpec & " /c DISKPART")
Send("{Select}")
Send("{SPACE}")
Send("{volume=L}")
send("{Enter}")
Send("{Assign}")
Send("{SPACE}")
Send("{letter=Y}")
send("{Enter}")
send ("{Exit}")
send("{Enter}")

Geht aber (natürlich) noch nicht ... :( ....
Hängen bleibt er bei der Texteingabe in Diskpart. Ist Send der Haken ?
Vielen Dank erstmal für Eure bisherigen Antworten, ich hoffe Ihr könnt mir über den Rest noch rüberhelfen ...
 
Zuletzt bearbeitet:

CBCrosser

Commander
Dabei seit
Nov. 2012
Beiträge
2.692
Habe mir also mal AutoIt gezogen und begonnen, mich damit auseinander zu setzen ...

Mein momentaner Stand:


MsgBox ( 1,"LW-Buchstabenänderung", "Lokal L zu X" )
RunWait (@ComSpec & " /c DISKPART")
Send("{Select}")
Send("{SPACE}")
Send("{volume=L}")
send("{Enter}")
Send("{Assign}")
Send("{SPACE}")
Send("{letter=Y}")
send("{Enter}")
send ("{Exit}")
send("{Enter}")

Geht aber (natürlich) noch nicht ... :( ....
Hängen bleibt er bei der Texteingabe in Diskpart. Ist Send der Haken ?
Vielen Dank erstmal für Eure bisherigen Antworten, ich hoffe Ihr könnt mir über den Rest noch rüberhelfen ...
Sehr löblich aber lass das mit den Knöpfchen drücken bitte. Das ist viel zu Fehleranfällig und primitiv ;)
Guck dir mal die Funktionen DriveMapAdd und DriveMapDel und vielleicht auch DriveMapGet an.
 

sanni74

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Aug. 2011
Beiträge
304
Ui, liest sich gut, bin schon am basteln, Danke für den Tip !!!
Ich denke, ich krieg das über Netzlaufwerke geregelt.
 

CBCrosser

Commander
Dabei seit
Nov. 2012
Beiträge
2.692
Wenn du dabei noch Hilfe benötigst oder es schicker haben willst bitte hier posten damit es jeder lesen kann ;)
 

frogger9

Commodore
Dabei seit
Feb. 2008
Beiträge
4.194
wieso nimmst du nicht einfach Subst.
 

sanni74

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Aug. 2011
Beiträge
304
Generell hät ich wohl eine Angabe mehr machen müssen ... . Ich bin eher die User-Fraktion und kenn mich (von alten QB-Sachen mal abgesehen) mit der Programmiereri nicht aus. AutoIt war schon ein guter Tip, mit dem ich was anfangen konnte. Jetzt hab ich etwas zusammengeschustert, was läuft. Allerdings noch etwas umständlich.
Ich habe jetzt 3 AutoIt-Dateien (bzw. exe´n).
Die Erste trennt die Netzwerklaufwerke, die 2. stellt sie lokal auf dem Recher her, die 3. stellt sie im Netz her.
Ich trenne somit immer die Verbindungen und baue sie im Anschluß dahin auf, wo ich sie haben möchte.
Anfangs hatte ich versucht mit 2 Dateien zu arbeiten, in denen die Verbindungen erst getrennt, und dann entsprechend der exe lokal oder im Netz wieder aufgebaut werden. Das klappt aber leider nicht. Ich nehme an, dass das an den identischen Laufwerksbezeichnungen liegt. Somit ists atm ein Doppelklick und ein Icon auf dem Desktop mehr.
So "einfach" sieht dann die Einbindung der Netzlaufwerke an den lokalen Rechner aus.

; Disconnect
; DriveMapDel("R:")
; DriveMapDel("S:")
; Connect
DriveMapAdd("R:", "\\SANNI\_Server_Daten")
DriveMapAdd("S:", "\\SANNI\_Server_Daten\ACAD")

Funktioniert. Allerdings mit einer unschönen Einschränkung. Das ganze soll ja auch mehrere Notebooks. Damit ändert sich ja leider jedesmal der PC-Name, die Pfadangabe bleibt gleich. Gibt es da eine Möglichkeit, nicht den Namen anzugeben sondern etwas wie bspw. current pc, oder \\C: ? Wenn so etwas gehen sollte, hab ich wohl die richtige Namensgebung in der Befehlszeile noch nicht getroffen ... .

Fazit: Könnte noch verbessert werden, aber funktioniert. Vielen Dank für Eure Hilfe!
 
Zuletzt bearbeitet:

CBCrosser

Commander
Dabei seit
Nov. 2012
Beiträge
2.692
Du kannst alle Exen auch in eine stopfen und vorher eine Case-Abfrage machen.
Also das Programm am Anfang fragen lassen, was gemacht werden soll.
Ich habe deine Frage mit dem Computernamen nicht richtig verstanden, allerdings kann man alles der Funktionen auslesen und per Variablen wieder in andere Funktionen einfügen.
Schick mir mal eine Nachricht mit Programmcode aller und dein ganz genaues Vorhaben.
Dann schreib ich dir mal etwas mit grafischer Oberfläche.
 

sanni74

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Aug. 2011
Beiträge
304
@Vielen Gabbadome: Vielen Dank für Dein Angebot!
So primitiv, wie es jetzt gestalltet ist, läufts ganz gut. Da die Wahl der Laufwerke (ob lokal oder Server) ja immer eine willkürliche bleiben soll, und nicht nur abhängig davon, ob die Verbindung vorhanden ist, oder nicht, wird man da nicht viel mehr automatisieren können.

Die einzigen beiden (allerdings gut zu ertragenen) Dinge, die man überhaupt noch optimieren könnte (wo sich aber der Aufwand m.M.n. nicht mehr lohnt) , wären:

1. Ich muss die Exen für jeden PC einzeln erstellen, da ja der PC Name immer verschieden ist und in den Pfadangaben vorkommt (bei mir "SANNI", bei anderen andere Namen). Ich habe ein wenig rumprobiert, ob ich irgend etwas finde, das er halt an dieser Stelle generell auf die eigene Platte zugreift (so etwas wie "current PC" anstelle "SANNI") aber da bin ich nicht fündig geworden.

2. Ich habe eine Trennungsexe, welche alle Netzwerkverbindungen (R und S) trennt, und jeweils eine, welche die Laufwerke neu verbindet (lokal oder auf dem Server). Wenn ich beide Vorgänge (erst alle trennen dann verbinden) in eine exe schiebe, geht das oft in die Hose.
Als Noob nehme ich an, das das an den zwingend identischen Buchstabenzuweisungen liegt und das somit in einem Vorgang etwas problematisch bei der Abarbeitung ist.

Es sind somit immer 2 Doppelklicke zu machen anstelle eines und die Erstellung muss ich halt für jeden PC seperat machen.
Beides Dinge, mit denen ich leben kann!

Danke für eure Hilfe!
 

CBCrosser

Commander
Dabei seit
Nov. 2012
Beiträge
2.692
1. Ich muss die Exen für jeden PC einzeln erstellen, da ja der PC Name immer verschieden ist und in den Pfadangaben vorkommt (bei mir "SANNI", bei anderen andere Namen). Ich habe ein wenig rumprobiert, ob ich irgend etwas finde, das er halt an dieser Stelle generell auf die eigene Platte zugreift (so etwas wie "current PC" anstelle "SANNI") aber da bin ich nicht fündig geworden.
@ComputerName dürfte hier die Lösung sein. Gibts den Benutzernamen raus. Also einfach in den Pfad das hier anstelle des Benuternamens (die Anführungszeichen gehören dazu): C:\Users\" & @ComputerName & "\ ...

2. Ich habe eine Trennungsexe, welche alle Netzwerkverbindungen (R und S) trennt, und jeweils eine, welche die Laufwerke neu verbindet (lokal oder auf dem Server). Wenn ich beide Vorgänge (erst alle trennen dann verbinden) in eine exe schiebe, geht das oft in die Hose.
Als Noob nehme ich an, das das an den zwingend identischen Buchstabenzuweisungen liegt und das somit in einem Vorgang etwas problematisch bei der Abarbeitung ist.
Das Script arbeitet schlicht schneller, als Windows das verarbeiten kann ;)
Wenn du am Anfang ein sogenanntes GUI erstellst, kannst du mit 2 Knöpfen bestimmen was gemacht werden soll.


Willst du eine komplette Vorlage von mir haben oder dich weiterhin selbst damit beschäftigen? Ist ein sehr spannendes Thema ;)
 

sanni74

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Aug. 2011
Beiträge
304
Gabbadome, du bist spitze! :D

Beide "Randsorgen" gelöst.
Das Skript sieht jetzt so aus (Historie inbegriffen, 2. Skript identisch nur mit anderen Laufwerkspfaden):

; Disconnect
DriveMapDel("R:")
DriveMapDel("S:")
; Sleep(1000) ;1 seconds
MsgBox(0, "LW-Info", "Auf dem eigenen PC arbeiten (lokal)")
; Connect
DriveMapAdd("R:", "\\" & @ComputerName & "\_Server_Daten")
DriveMapAdd("S:", "\\" & @ComputerName & "\_Server_Daten\ACAD")

- Kleine Pause eingeführt zw. discon & connect, -> seperates Trennungs unnötig und zusätzlich gibts ne Sicherheitswarnung an den Bearbeiter
- die lokale Pfadzuweisung auf - so zu sagen - automatisiert

Nun läufts Super. Weniger Aufwand bei dem Vorhaben geht nicht !
Danke nochmal! (wird ja zur Routiene :) )

@gabbadome
gui:
So hab ich jetzt 2 Icons auf dem Desktop und treffe meine Einstellungen via Doppelklick.
Wenns klicktechnisch keinen Mehraufwand macht, und einfach (für mich verständlich^^) umsetzbar wäre
wieso nicht noch nett "einpacken" ?
Ich habs hier alles im Forum geschrieben (und nicht via PM) da ich hoffe, dass das auch für 3., die mal vor ähnlichen Sorgen stehen einen Lösungsansatz bietet.
 

CBCrosser

Commander
Dabei seit
Nov. 2012
Beiträge
2.692
Das Sleep zwischen den Operationen kannst du weg lassen. Das Programm fährt eh erst weiter wenn du "OK" in der MsgBox drückst ;)
Ich schuster mal eben ein kleines Scriptchen und erkläre das dann. GUIs sind doch schon ein wenig verzwickter.
Ergänzung ()

Hier mal dein Programm: (die Datei liegt auch im Anhang der Übersicht halber)

Code:
#NoTrayIcon			;~ Es wird kein Symbol in der Taskleiste unten Rechts angezeigt
#include <GUIConstantsEx.au3>			;~ Muss beigefügt werden, damit man ein GUI programmieren kann

GUICreate("Laufwerke ändern", 300, 150)			;~ Hier wird das Fesnter erstellt, Titel und Größe festgelegt

$trennen	= GUICtrlCreateButton("Trennen", 10, 105, 90, 35)			;~ Hier werden die Knöpfe samt Bezeichnungen und Positionen festgelegt
$verbinden  = GUICtrlCreateButton("Verbinden", 110, 105, 90, 35)
$ende 		= GUICtrlCreateButton("Ende", 220, 105, 70, 35)

GUICtrlCreateLabel ("Dieses Programm lässt dich die Pfade der Laufwerke ändern.", 10, 10)			;~ Der Text der nachher wo im Fesnter stehen soll
GUICtrlCreateLabel ("Drückst du auf ""Trennen"", so werden die Laufwerke ""R""", 10, 35)
GUICtrlCreateLabel ("und ""S"" getrennt. Drückst du auf ""Verbinden"" so werden", 10, 50)
GUICtrlCreateLabel ("diese neu verbunden mit den Inhalten der Server-Daten.", 10, 65)
GUICtrlCreateLabel ("Die Laufwerke müssen vor dem Verbinden leer sein!", 10, 80)

GUISetState()			;~ aktiviert das GUI (macht es sichtbar)

Do			;~ Anfang einer Schleife, Bedingung folgt weiter unten
	$msg = GUIGetMsg()			;~ merkt sich den gedrückten Knopf

		Select			;~ Lässt zwischen verschiedenen Ereignissen wählen

			Case $msg = $trennen			;~ Ereignis 1, der Knopf "Trennen" wird gedrückt

				$errorR = "erfolgreich"			;~ setzt Variablen für das spätere Feedback
				$errorS = "erfolgreich"

				$inhaltR = DriveMapGet ("R:")			;~ Merkt sich, was vorher auf dem LAufwerk verbunden war
				$inhaltS = DriveMapGet ("S:")

				If DriveMapDel("R:") = 0 Then $errorR = "nicht"			;~ prüft, ob das Laufwerk tatsächlich getrennt wurde und merkt sich das

				If DriveMapDel("S:") = 0 Then $errorS = "nicht"

				MsgBox (64, "LW-Info", "Laufwerk ""R:"" wurde " & $errorR & " getrennt (vorher: " & $inhaltR & ")." & @CRLF & "Laufwerk ""S:"" wurde " & $errorS & " getrennt (vorher: " & $inhaltS & ").")			;~ Feedback zur vorher durchgeführten Aktion

			Case $msg = $verbinden			;~ Ereignis 2, der Knopf "Verbinden" wird gedrückt

				$errorR = "nicht"			;~ s.O.
				$errorS = "nicht"

				DriveMapGet ("R:")			;~ prüft, ob der Laufwerksbuchstabe bereits vergeben ist
					If @error Then DriveMapAdd("R:", "\\" & @ComputerName & "\_Server_Daten")			;~ wenn nicht, verbinde es mit den gegebenen Daten
					If DriveMapGet ("R:") = "\\" & @ComputerName & "\_Server_Daten" Then $errorR = "erfolgreich"			;~ prüfe, ob das Laufwerk richtig verbunden wurde und merke dir dies

				DriveMapGet ("S:")			;~ gleiches wie das Laufwerk vorher
					If @error Then DriveMapAdd("S:", "\\" & @ComputerName & "\_Server_Daten\ACAD")
					If DriveMapGet ("S:") = "\\" & @ComputerName & "\_Server_Daten\ACAD" Then $errorS = "erfolgreich"

				MsgBox (64, "LW-Info", "Laufwerk ""R:"" wurde " & $errorR & " verbunden." & @CRLF & "Laufwerk ""S:"" wurde " & $errorS & " verbunden.")			;~ Feeback zur vorher durchgeführten Aktion

		EndSelect			;~ Beende das Auswahlverfahren und fange wieder von vorne an
Until $msg = -3 or $msg = $ende			;~ Führe diese Schleife solange aus, bis der Knopf "Ende" oder das "X" zum schließen gedrückt wird

Exit			;~schließt das Programm samt Prozess(en) (eigentlich unnötig da hier nur ein Prozess - nämlich das Programm selber - verwendet wurde)
 

Anhänge

sanni74

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Aug. 2011
Beiträge
304
So ein SCH........................................ade !!!!!!!!! :heul:

Daran hab ich "Unerfahrener " nicht gedacht, hoffe, es gibt eine einfache Lösung.

@gabbadom: ja, mit deiner Oberfläche siehts natürlich noch schicker aus :D.
Meine Lernaufgabe wird´s sein, da noch nen Button einzubauen, der die Laufwerke dann wieder mit dem Server verbindet (ander Pfadangaben). Mei deiner -super erklärten- Vorlage (denk ich) bekomme ich das hin.
Danke Dir, bist ne große Hilfe und ein echt guter "Erklärbär"!

@edit: Hab´s um einen 4. Button ergänzt, Rest entsprechend editiert, läuft!


Das SCH....., was mir oben entfleuchte ist allerdings (für mich) nicht so einfach ....
Das Problem ist folgendes:
Solange der PC / Notebook in einem Netzwerk ist (eine Netzwerkverbindung vorhanden) klappt das alles und läuft super, um bspw. trotz Serververbindung im Büro lokal arbeiten zu können ...

Wenn ich jetzt allerdings den Netzwerkstecker ziehe, und das Notebook bspw. mit ins Auto oder zu nem Kunden nehme, klappt das ganze nicht mehr, da Windows sich ohne Netzwerk strikt weigert, Netzwerklaufwerke zu verbinden.

Meine (primitiven) Schlußfolgerungen:
Es muss irgendwie einen Weg geben, Netzwerklaufwerke auch ohne Netzwerk (Hardware) zu verbinden. Ist das möglich ?
oder
Kann man ein Netzwerk (bspw. im AD) emulieren, sodas der Rechner bspw. immer in einem Netzwerk ist ?
oder
Ist mein Ansatz, bei obiger Aufgabenstellung über Netzwerklaufwerke zu gehen ganz falsch?

Vorausgesetzt, man bekommt den SCH......ade Punkt gelöst sehe ich bei der Netzlaufwerkvariante die optimale Lösung.
 
Zuletzt bearbeitet: (ergänzt)

CBCrosser

Commander
Dabei seit
Nov. 2012
Beiträge
2.692
Freut mich das zu hören und danke ;)

Ich verstehe dein letztes Probelm allerdings nicht so ganz. Natürlich kann ein Netzlaufwerk nur eingebunden werden, wenn du auch mit dem Netzwerk verbunden bist is dem die Laufwerke bereit gestellt werden.
Der Sinn ist ja, dass alle in diesem Netzwerk mit den nötigen Berechtigungen darauf zugreifen können. Bist du nicht in diesem Netzwerk kannst du auch keine Laufwerke verbinden.
Oder möchstest du über UMTS die LAufwerke verbinden? Soweit ich weiß lässt sich das nicht realisieren.
 
Top