Verknüpfungen mit relativen Pfad-Angaben

  • Moin moin!

    Mal eine Frage: Gibt's unter Windows 7 'ne Möglichkeit statt absoluter Pfad-Angaben in Verknüpfungen relative zu benutzen?

    Beispiel:

    Ich habe auf Rechner 1 in C:\Dateien\Ordner1 die Datei Beispiel.exe liegen. Lege ich nun in C:\Dateien\Ordner2 eine Verknüpfung mit Beispiel.exe.lnk an, so steht als Verknüpfungsziel C:\Dateien\Ordner1\Beispiel.exe drin. Da ich aber den Ordner Dateien zwischen zwei Rechnern synchronisiere, dieser aber auf Rechner 2 nicht unter C:\Dateien zu finden ist, sondern unter D:\Dateien, funktioniert die oben genannte Vernküpfung auf Rechner 2 nicht.

    Nun habe ich schon versucht, als Verknüfungsziel ..\Ordner1\Beispiel.exe anzugeben, allerdings kann Windows damit offensichtlich nix anfangen.

    Kennt hier jemand eine Möglicht, dies zu realisieren? Möglichst mit Windows-eigenen Bordmitteln - und ohne Admin-Rechte...

    «Ich verstehe Ihre Frage so: Dass es Menschen gibt, die wünschen, dass ein solches OS als "Retro-OS" bezeichnet wird, ja? Mir ist nicht bekannt, dass solche Absichten bestehen, da HP-UX 9.x einfach ein altes OS ist. Niemand hat die Absicht, ein "Retro-OS" zu bauen.» Xaar, 2014

    Prozessor gesucht? -> Prozessoren, die ich abgeben kann (unter "Available for trading")
    "Überschüssige" Prozessoren oder Hardware? -> Einfach PN an mich schicken :b1: -> Hardware, die ich suche

    Einmal editiert, zuletzt von Xaar (18. Februar 2018 um 09:33)

  • mklink braucht leider Admin-Rechte - ist damit ungeeignet :b2:

    «Ich verstehe Ihre Frage so: Dass es Menschen gibt, die wünschen, dass ein solches OS als "Retro-OS" bezeichnet wird, ja? Mir ist nicht bekannt, dass solche Absichten bestehen, da HP-UX 9.x einfach ein altes OS ist. Niemand hat die Absicht, ein "Retro-OS" zu bauen.» Xaar, 2014

    Prozessor gesucht? -> Prozessoren, die ich abgeben kann (unter "Available for trading")
    "Überschüssige" Prozessoren oder Hardware? -> Einfach PN an mich schicken :b1: -> Hardware, die ich suche

  • Beitrag von clik!84 (18. Februar 2018 um 12:02)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • :( Ich frag' mich echt, warum man zum Erstellen von Symlinks Admin-Rechte braucht. Ich mein: Wenn ich auf was verlinke, auf das ich keinen Zugriff habe, wird mir der Zugriff eh verweigert.

    @clik: Habe ich irgendwo geschrieben, dass ich das auf meinem Rechner ohne Admin-Rechte machen will? Nein. Nur, dass es ohne Admin-Rechte gehen soll. Entweder geht's - oder halt nicht.

    «Ich verstehe Ihre Frage so: Dass es Menschen gibt, die wünschen, dass ein solches OS als "Retro-OS" bezeichnet wird, ja? Mir ist nicht bekannt, dass solche Absichten bestehen, da HP-UX 9.x einfach ein altes OS ist. Niemand hat die Absicht, ein "Retro-OS" zu bauen.» Xaar, 2014

    Prozessor gesucht? -> Prozessoren, die ich abgeben kann (unter "Available for trading")
    "Überschüssige" Prozessoren oder Hardware? -> Einfach PN an mich schicken :b1: -> Hardware, die ich suche

  • Die Idee hatte ich auch schon - nur führt 'ne Batch-Datei mit dem Inhalt cd ..\Ordner2 zwar auf der Kommandozeile zum Erfolg - nur im Explorer ändert sich beim Ausführen nix.

    «Ich verstehe Ihre Frage so: Dass es Menschen gibt, die wünschen, dass ein solches OS als "Retro-OS" bezeichnet wird, ja? Mir ist nicht bekannt, dass solche Absichten bestehen, da HP-UX 9.x einfach ein altes OS ist. Niemand hat die Absicht, ein "Retro-OS" zu bauen.» Xaar, 2014

    Prozessor gesucht? -> Prozessoren, die ich abgeben kann (unter "Available for trading")
    "Überschüssige" Prozessoren oder Hardware? -> Einfach PN an mich schicken :b1: -> Hardware, die ich suche

  • Explorer kann nicht nur Verzeichnisse mit relativen Pfadangaben öffnen, sondern auch Programme ausführen – was darauf hinausläuft, dass es sich bei beidem um Variationen von ShellExecute handelt:

    Code
    C:\Windows\explorer.exe ..\Ordner2\Beispiel.exe

    Alternativ per Shell (Konsolenfenster poppt kurz auf):

    Code
    C:\Windows\System32\cmd.exe /c start ..\Ordner2\Beispiel.exe


    bzw. mit Wechsel des Arbeitsverzeichnis:

    Code
    C:\Windows\System32\cmd.exe /c cd ..\Ordner2 & start Beispiel.exe

    In allen diesen Fällen sollte man beachten, das Feld „Ausführen in“ leer zu lassen, damit die Verknüpfung kein Arbeitsverzeichnis vorgibt und dadurch vom übergeordneten Verzeichnis der Verknüpfung ausgeht – und nicht etwa C:\Windows oder C:\Windows\System32 wie vom Verknüpfungsassistent vorgegeben.

    Die Win32-API bzw. die COM-Schnittstelle der Shell hat zwar eine SetRelativePath-Methode, aber diese macht nicht, was man davon erwartet (ist dafür gedacht, den beabsichtigten Pfad zu einer Verknüpfungsdatei anzugeben, wenn man diese nicht mit dem IPersistFile-Interface in eine Datei schreibt, sondern per IPersistStream anderweitig bearbeitet).

    Prinzipiell gibt es für das Problem einen Hack. Verknüpfungen speichern üblicherweise immer einen absoluten und relativen Pfad zu ihrem Ziel. Letzterer wird aber in der Regel nicht benutzt, da eine Verknüpfung auch verschiedene Informationen enthält, die es dem Explorer erlauben, das verschobene Ziel einer Verknüpfung wiederzufinden (Kapitel 2.3.1 VolumeID, Seite 22ff. in „[MS-SHLLINK]: Shell Link (.LNK) Binary File Format“). Diese sind in deinem Fall aber völlig missführend, da sie z. B. auch die Seriennummer und Label des Laufwerks enthalten (hier z. B. auf Laufwerk „Windows 10“ auf dem Rechner „spitfire“), auf dem das Ziel abgelegt wurde.

    Programmatisch kann man nun das Flag ForceNoLinkInfo (um diese Strukturen zu ignorieren) sowie ForceNoLinkTrack (um ähnliche Strukturen für Vista aufwärts zu ignorieren) gemäß Kapitel 2.1.1 setzen, damit der Explorer bei fehlendem Ziel als nächstes auf den relativen Pfad zurückgreift. Das geht ebenfalls entweder wie oben beschrieben über das COM-Interface – oder indem man den 32-Bit-Integer an Offset 0x14 um die Flags 0x40100 ergänzt. Gegebenfalls schreibe ich im Zug dafür noch ein kleines Programm.

  • Ja, das scheint so zu funktionieren. :)
    Habe eine ähnliche Situation wie bei dir erzeugt (C:\Test\Programm\Programm.exe und C:\Test\Verknüpfung\Test.lnk) und die Verknüpfung mithilfe meines Programms gepatcht. Es nimmt Pfade zu Verknüpfungen (*.lnk) als Parameter, man kann diese auch per Drag-and-Drop daraufziehen.
    https://gist.github.com/DosAmp/4849037…1f3d1460abf2d9e
    Wenn ich anschließend den Ordner Test nach D:\ verschiebe, startet die Verknüpfung nach wie vor das Programm. Auch wenn wenig überraschend in den Eigenschaften der Verknüpfung nach wie vor C:\Test\… steht.

    Im Anhang ist eine mit MSVC 2015 kompilierte Kopie des Programms enthalten (benötigt die "Microsoft Visual C++ 2015 Redistributable (x64) - 14.0.xxxxx" laut Programmliste).

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!