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

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, 5498 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
Sicherheit

MikroTik-Router patchen, Schwachstelle wird ausgenutzt

Information von kgborn vor 17 StundenSicherheit

Am 23. April 2018 wurde von Mikrotik ein Security Advisory herausgegeben, welches auf eine Schwachstelle im RouterOS hinwies. Mikrotik ...

Windows 10

Microcode-Updates KB4090007, KB4091663, KB4091664, KB4091666 für Windows 10

Information von kgborn vor 23 StundenWindows 101 Kommentar

Kurze Information für Administratoren von Windows 10-Systemen, die mit neueren Intel CPUs laufen. Microsoft hat zum 23. April 2018 ...

iOS
Updates für Iphone und Co
Information von sabines vor 1 TagiOS

Gestern abend ist iOS 11.3.1 erschienen, ein kleineres Update, dass einige Lücken schließt und "Lahmlegen" nach einem Display Tausch ...

Windows 7

Windows 7 - Server 2008 R2: Exploit für Total Meltdown verfügbar

Information von kgborn vor 2 TagenWindows 7

Kleine Information für Administratoren, die für die Updates von Windows 7 SP1 und Windows Server 2008 R2 SP1 verantwortlich ...

Heiß diskutierte Inhalte
Batch & Shell
Powershell: Im AD nach Rechnern mit bestimmten IP-Adressen suchen
gelöst Frage von Raven42Batch & Shell36 Kommentare

Hallo zusammen, ich suche nach einer Möglichkeit nach Computern im AD zu suchen , deren IP-Adresse mit 10.11.12. beginnt. ...

C und C++
Frage1 C Programmierung-Makefile Frage2 PHP-Programmierung HTTP-Fehler 404
Frage von KatalinaC und C++34 Kommentare

Hallo, ich habe 2 Fragen, die nichts miteinander zu tun haben aber mit denen ich mich gerade beschäftige: 1. ...

LAN, WAN, Wireless
Watchguard T15 VPN Einrichtung
gelöst Frage von thomasjayLAN, WAN, Wireless25 Kommentare

Hallo zusammen, wir möchten gerne über unsere Watchguard T15 einen VPN-Tunnel (Mobile VPN with IPSec) einrichten! Als Client nutzen ...

Windows Server
Alten DC entfernen
Frage von smartinoWindows Server24 Kommentare

Hallo zusammen, ich habe hier eine Umgebung übernommen und erstmal einen DCDIAG gemacht. Dabei fällt auf, daß eine ganze ...