Top-Themen

Aktuelle Themen (A bis Z)

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

Frage Entwicklung

GELÖST

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

Mitglied: Caradh

Caradh (Level 1) - Jetzt verbinden

05.01.2010, aktualisiert 18.10.2012, 5483 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 ..
Ähnliche Inhalte
Windows 7
System bereinigen?
Frage von hanheikWindows 77 Kommentare

Kennt ihr das? Die Festplattenleuchte ist eigentlich permanent an, Menüs werden langsam aufgeklappt, alle Aktionen gehen nur im Schneckentempo, ...

Batch & Shell
Logdateien bereinigen mit sed
gelöst Frage von cuilsterBatch & Shell12 Kommentare

Hallo. Ich versuche log Dateien mittels sed Befehl zu bereinigen. Ziel ist es erstmal alle Zeilen zu löschen in ...

Batch & Shell
Script zum Kopieren einer Datei in mehren unterschiedlichen Ordner über eine Verknüpfung
gelöst Frage von KnuefiBatch & Shell12 Kommentare

Hallo zusammen, ich benötige mal wieder euren fachmännischen Rat. Ich benötige ein Script das mir eine Datei (unterschiedliche Namen, ...

Windows Server
Alten Server DCpromo was noch bereinigen?
Frage von manu90Windows Server1 Kommentar

hi zusammen, wenn ich den alten Server per DCpromo raus nehme was habe ich noch manuell zu bereinigen? in ...

Neue Wissensbeiträge
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 2 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 3 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 3 TagenSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 3 TagenSicherheit12 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
Firewall
Penetrationstester-Labor - Firewalls
Frage von Oli-nuxFirewall10 Kommentare

Mich würde interessieren warum man beim Einrichten eines Penetrationstester-Labor (VMs) die Firewall der Systeme deaktivieren soll? Hat das nur ...

SAN, NAS, DAS
Wer kennt sich mit QNAP und CISCO aus ?
gelöst Frage von MachelloSAN, NAS, DAS9 Kommentare

Hallo Zusammen hier im Forum, Ich habe ein QNas 451+ und dieses NAS hat zwei GBit Lan Adapter die ...

Netzwerkgrundlagen
IPv6 Inter-VLAN Routing
gelöst Frage von clSchakNetzwerkgrundlagen9 Kommentare

Hi ich befasse mich gerade mit der Implementierung von IPv6 was bisher (in einem VLAN) korrekt funktioniert inkl. DNS ...

Windows Netzwerk
Zugriff auf den Desktop Ordner eines anderen Rechners in der gleichen Domäne
gelöst Frage von JensNomaWindows Netzwerk6 Kommentare

Guten Abend, ich war neulich mit unserem Admin am Tisch gesessen. Er an seinem Notebook angemeldet mit dem Domänen-Admin, ...