Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Bitte um Ideen für ein Script zum Bereinigen von Verknüpfungen

Frage Entwicklung

Mitglied: Caradh

Caradh (Level 1) - Jetzt verbinden

05.01.2010, aktualisiert 18.10.2012, 5404 Aufrufe, 17 Kommentare

Hintergrund:
In unserem Unternehmen wurden einige Fileserver umgezogen. Technisch gesehen, befinden sich nun alle Dateien auf einem anderen Server. Somit würden die Verknüpfungen die auf diese Dateien verweisen nicht mehr funktionieren. Da wir dies vermeiden wollen, haben wir das Problem vorläufig mit einer "Umleitung" behoben.

Diese Lösung soll aber nur für den Übergang sein. Deshalb habe ich ein Script geschrieben, welches alle Verknüpfungen in einem angegebenen Ordner und deren Unterordner bereinigen soll. Hierfür werden die zu ändernden Zielpfade und die neuen Pfade aus einer Textdatei ausgelesen. In der Textdatei sind alle Ordner der ersten Ebene enthalten. (Siehe Beispiel)

01.
\\altserver1\Ordner1 \\neuserver\data\Alt1\Ordner1  
02.
\\altserver1\Ordner2 \\neuserver\data\Alt1\Ordner2  
03.
\\altserver1\Ordner3 \\neuserver\data\Alt1\Ordner3  
04.
\\altserver2\Ordner1 \\neuserver\data\Alt2\Ordner1  
05.
\\altserver2\Ordner6 \\neuserver\data\Alt2\Ordner6 
Dies soll nur ein Beispiel zur Veranschaulichung sein. Letztendlich soll der Zielpfad einer Verknüpfung angepasst werden, sofern dieser einen String der linken Spalte enthält. Wenn dem so ist, wird der Zielpfad der rechten Spalte verwendet.

Problem:
Das Script ist fertig gestellt und funktioniert.
Leider ist es nur so, dass in vielen Verknüpfungen (ca. 80%) der Laufwerksbuchstabe enthalten ist und nicht der vollständige Serverpfad.

Beispiel:
Statt \\altserver1\Ordner1\Mustermann\Doku.doc
S:\Mustermann\Doku.doc
Somit wird diese Verknüpfung in meinem Script nicht berücksichtigt.

Lösungsversuch:
Mit dem Notepad++ kann man die lnk-Datei auslesen. Dort steht der vollständige Serverpfad auch drin. (Siehe Anhang) Wenn ich die Möglichkeit hätte die lnk Dateien mit vbs auszulesen, wäre das Problem gelöst. Doch leider ist mir dies nicht möglich. Ich bekomme immer nur "L" zurück. (Siehe Quellcode)

86b6a63fbeb3cfee076f3a97201a8045 - Klicke auf das Bild, um es zu vergrößern

01.
Private Sub readShortcutFile()  
02.
Dim fso,f, line, strPath  
03.
strPath = "C:\Test\Test.doc.lnk"  
04.
Const ForReading = 1  
05.
 
06.
set fso = CreateObject ("Scripting.FileSystemObject")  
07.
set f = fso.opentextfile(strPath,ForReading,true)  
08.
do while not f.AtEndOfStream  
09.
line = f.readLine()  
10.
MsgBox line  
11.
loop  
12.
End Sub 

Für Ideen bin ich sehr dankbar.

Viele Grüße
Caradh
Mitglied: dog
05.01.2010 um 15:09 Uhr
.lnk Dateien sind binäre Dateien und ein textbasierter Reader wie FileSystemObject wird deshalb immer beim ersten NUL-Zeichen abbrechen (NUL = Hier nach kommt nix mehr).

http://blogs.msdn.com/ericlippert/archive/2005/04/20/binary-files-and-t ...
http://www.motobit.com/tips/detpg_read-write-binary-files/

Grüße

Max
Bitte warten ..
Mitglied: manuel-r
05.01.2010 um 15:15 Uhr
Warum heißen die neuen Server nicht einfach so wie die alten? Das spart jede Menge Gefrickel...
Bitte warten ..
Mitglied: bastla
05.01.2010, aktualisiert 18.10.2012
Hallo Caradh und willkommen im Forum!

Das Auslesen von Verknüpfungen hatten wir mal hier (siehe Zeile 19) ...
Noch eine Anmerkung zu
Leider ist es nur so, dass in vielen Verknüpfungen (ca. 80%) der Laufwerksbuchstabe enthalten ist und nicht der vollständige Serverpfad.
Das "Leider" ist eigentlich nicht ganz nachvollziehbar - wenn die Freigabe auf einen Laufwerksbuchstaben gemapt wurde, muss ja nur diese Zuweisung angepasst werden und der Link funktioniert weiterhin ...

Grüße
bastla
Bitte warten ..
Mitglied: bakero3010
05.01.2010 um 16:48 Uhr
Hallo,
was machtn der wen du das nicht als textfile sondern als kA octetstream oder etwas ähnlichem einliest? Also dann Zeichenweise z.B ?
Bitte warten ..
Mitglied: mayho33
05.01.2010 um 16:54 Uhr
Hallo!

Du könntest die Vollen Pfade z-B. so feststellen. Musst sie dann nur noch ersetzen.


Set oShell = WScript.CreateObject("WScript.Shell")
Set oFso = WScript.CreateObject("Scripting.FileSystemObject")

FullPath = ofso.getparentfoldername(wscript.scriptfullname)

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkConnection",,48)
Set objNetwork = WScript.CreateObject("WScript.Network")

For Each item in colitems
LWName = LWName & item.localname & "|"
LWPath = lwpath & item.RemotePath & "|"
Next


arrLWPath = Split(lwpath, "|")
arrLWName = Split(lwname, "|")

MsgBox "Fertig"

Grüße

Mayho
Bitte warten ..
Mitglied: bastla
05.01.2010 um 17:05 Uhr
@bakero3010
... als kA octetstream oder etwas ähnlichem ...
Wenn die im oben von mir verlinkten Beitrag dargestellte Vorgangsweise nach dem Schema
01.
Set objShell= WScript.CreateObject("Wscript.Shell") 
02.
Set objShortcut = objShell.CreateShortcut("C:\Test\Test.doc.lnk") 
03.
WScript.Echo objShortcut.TargetPath
zu einfach ist ...

Grüße
bastla
Bitte warten ..
Mitglied: mayho33
06.01.2010 um 10:48 Uhr
@ Bastla

Dein Script in dem Link ist super!!. Hab auch mal sowas kreiert, aber wesentlich umständlicher. Danke für die tolle Anregung!!!

Mayho
Bitte warten ..
Mitglied: Caradh
06.01.2010 um 12:53 Uhr
Hallo Max,

vielen Dank für die Hilfe. So gehts.

Viele Grüße
Caradh
Bitte warten ..
Mitglied: Caradh
06.01.2010 um 13:20 Uhr
Hallo bastla,

vielen Dank für die Willkommenheißung und Deine Vorschläge.

Das Auslesen von Verknüpfungen hatten wir mal hier (siehe Zeile 19) ...

Das Auslesen des Pfades stellt an sich kein Problem dar. Es ist nur so dass ich Pfade mit Laufwerksbuchstaben nicht mit meiner "Liste" matchen" kann. Dafür benötige den vollständigen Pfad. Dieser steht in der lnk-Datei. (Siehe Abbildung "Notepad").

Das "Leider" ist eigentlich nicht ganz nachvollziehbar - wenn die Freigabe auf einen Laufwerksbuchstaben gemapt wurde, muss ja nur diese Zuweisung angepasst werden und der Link funktioniert weiterhin ...

Auch das habe ich ausprobiert. Selbst wenn ich die Zuweisung anpasse, hat sich die Verknüpfung immer noch die alte Herkunft gemerkt. In diesem Fall würde das Betriebssystem automatisch ein neue Netzwerkverbindung anlegen und den Laufwerksbuchstaben im TargetPath entsprechend anpassen.

Viele Grüße
Caradh
Bitte warten ..
Mitglied: Caradh
06.01.2010 um 13:26 Uhr
Hallo Mayho,

vielen Dank für Deine Hilfe.

Das bringt mich schon mal ein gutes Stück näher. Allerdings ist die im lnk-Datei enthaltene Information bezüglich des Zielpfades nicht immer identisch mit den Netwerkfreigaben.

Selbst wenn ich die Zuweisung anpasse, hat sich die Verknüpfung immer noch die alte Herkunft gemerkt. In diesem Fall würde das Betriebssystem automatisch ein neue Netzwerkverbindung anlegen und den Laufwerksbuchstaben im TargetPath entsprechend anpassen.

Leider komme ich nicht drum rum die lnk-Datei auszulesen. Aber mittlerweile habe ich das zum Glück auch geschafft.

Viele Grüße
Bitte warten ..
Mitglied: bastla
06.01.2010 um 14:27 Uhr
@mayho33
Dein Script in dem Link ist super!!.
Danke für die Blumen - allerdings würde ich das heute etwas anders schreiben (und zumindest die Methoden "GetBaseName" und "GetExtensionName" verwenden) ...

Grüße
bastla
Bitte warten ..
Mitglied: bastla
06.01.2010 um 14:58 Uhr
Hallo Caradh!
Selbst wenn ich die Zuweisung anpasse, hat sich die Verknüpfung immer noch die alte Herkunft gemerkt. In diesem Fall würde das Betriebssystem automatisch ein neue Netzwerkverbindung anlegen und den Laufwerksbuchstaben im TargetPath entsprechend anpassen.
Kann ich nicht nachvollziehen - wenn die Verknüpfung auf "S:\Dein Doument.doc" zeigt und "S:" auf "\\altserver1\Ordner3" gemapt ist, funktioniert die Verknüpfung bei mir weiterhin, wenn zwischenzeitlich "S:" mit "\\neuserver\data\Alt1\Ordner3" (getestet natürlich mit anderen Rechnernamen / Pfaden) verbunden wird (obwohl in der Verknüpfung der ursprüngliche UNC-Pfad gespeichert ist) - oder verstehe ich Dich falsch?

Grüße
bastla
Bitte warten ..
Mitglied: Caradh
06.01.2010 um 15:23 Uhr
Hallo bastla,

mein Szenario sieht wie folgt aus:

Ausgangssituation:
- Ich habe eine Verknüpfung die auf "S:\Dein Doument.doc" zeigt.
- Mein Laufwerk S: ist mit "\\altserver1\Ordner3" verbunden.

Vorgehen:
- Ich trenne die Verbindung von "S:" und verbinde diese neu mit "S:" mit "\\neuserver\data\Alt1\Ordner3".
- Ich öffne die Verknüpfung (Doppelklick)

Ergebnis
- Es wird eine neue Netzlaufwerksverbindung " X" angelegt, die auf "\\altserver1\Ordner3" verweist.
- Der Targetpath der Verknüpfung verweist nun auf "X:\Dein Doument.doc"
- In der lnk-Datei steht nach wie vor noch "\\altserver1\Ordner3"

Meine Lösung
Bei Verknüpfungen die keinen volllständigen Zielpfad enthalten lese ich den vollständigen Pfad aus der lnk-Datei aus.
Diesen vergleiche ich mit meiner "Text Datei" und passe gegebenenfalls den Zielpfad des Verknüpfung an.

Viele Grüße
Caradh
Bitte warten ..
Mitglied: bastla
06.01.2010 um 15:35 Uhr
Hallo Caradh!

Welches BS verwendest Du? Bei mir liegt die Verknüpfung auf einem XP Pro SP3 und es wird nach dem Neuverbinden des Laufwerkes auf die andere Freigabe zugegriffen - lediglich nach einem Umbenennen/Löschen der Datei am neuen Ort wird tatsächlich die Verknüpfung wieder auf den alten Speicherort "umgebogen" (und entsprechend in der .lnk-Datei auch gespeichert) ...

Grüße
bastla
Bitte warten ..
Mitglied: mayho33
06.01.2010 um 16:00 Uhr
Hallo Caradh!

Super! Die Lösungen die man selbst findet sind die aus denen man lernt!

Kannst du uns trotzdem noch sagen wie du's gelöst hast?

Grüße!

Mayho
Bitte warten ..
Mitglied: Caradh
06.01.2010 um 17:22 Uhr
Hallo Mayho,

ich habe in den Urls die dog gepostet hat, meine Lösung gefunden.

Ich schreibe den Inhalt der lnk-Datei in einen String. Diesen vergleiche ich dann mit meiner Txt Datei, in der alle alten und neue Serverpfade drinstehen.

Der BeispielCode liest eine binärische Datei in einen String und schreibt diesen in eine neue Textdatei.

01.
saveBinaryFileToString()
01.
Private Sub saveBinaryFileToString() 
02.
 
03.
    Dim byteArray 
04.
 
05.
    byteArray = ReadByteArray("C:\Doku.doc.lnk") 
06.
    SaveBinaryDataTextStream "String.txt", byteArray 
07.
 
08.
End Sub
01.
Function ReadByteArray(strFileName) 
02.
    Const adTypeBinary = 1 
03.
    Dim bin 
04.
    Set bin = CreateObject("ADODB.Stream") 
05.
    bin.Type = adTypeBinary 
06.
    bin.Open 
07.
    bin.LoadFromFile strFileName 
08.
    ReadByteArray = bin.Read 
09.
End Function
01.
Sub SaveBinaryDataTextStream(FileName, ByteArray) 
02.
  'Create FileSystemObject object 
03.
  Dim FS: Set FS = CreateObject("Scripting.FileSystemObject") 
04.
   
05.
  'Create text stream object 
06.
  Dim TextStream 
07.
  Set TextStream = FS.CreateTextFile(FileName) 
08.
   
09.
  'Convert binary data To text And write them To the file 
10.
  TextStream.Write BinaryToString(ByteArray) 
11.
End Sub
01.
Function BinaryToString(Binary) 
02.
  'Antonin Foller, http://www.motobit.com 
03.
  'Optimized version of a simple BinaryToString algorithm. 
04.
   
05.
  Dim cl1, cl2, cl3, pl1, pl2, pl3 
06.
  Dim L 
07.
  cl1 = 1 
08.
  cl2 = 1 
09.
  cl3 = 1 
10.
  L = LenB(Binary) 
11.
   
12.
  Do While cl1<=L 
13.
    pl3 = pl3 & Chr(AscB(MidB(Binary,cl1,1))) 
14.
    cl1 = cl1 + 1 
15.
    cl3 = cl3 + 1 
16.
    If cl3>300 Then 
17.
      pl2 = pl2 & pl3 
18.
      pl3 = "" 
19.
      cl3 = 1 
20.
      cl2 = cl2 + 1 
21.
      If cl2>200 Then 
22.
        pl1 = pl1 & pl2 
23.
        pl2 = "" 
24.
        cl2 = 1 
25.
      End If 
26.
    End If 
27.
  Loop 
28.
  BinaryToString = pl1 & pl2 & pl3 
29.
End Function
Viele Grüße
Caradh
Bitte warten ..
Mitglied: Caradh
06.01.2010 um 17:26 Uhr
Hi bastla,

ich habe auch Microsoft Windows XP Pro mit SP 3.

Viele Grüße
Caradh
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
VB for Applications
VBS Script zum versenden mehrerer Verknüpfungen zu Dateien per Lotus Notes

Frage von Sentinel87 zum Thema VB for Applications ...

Windows Server
Server 2012 R2 Cleanmgr.exe mit Systemdateien bereinigen? Wie? (4)

Frage von busteron zum Thema Windows Server ...

Batch & Shell
gelöst PowerShell Script Move-Item nach x Tagen (5)

Frage von lupolo zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...