bodenseehost
Goto Top

Verknüpfung auf ungültiges Ziel erstellen

Pfade von Verknüpfungen sollen "bewusst" auf einen falschen/ungültigen Pfad abgeändert werden, dies verhindert Windows aber.

In Unserem Netzwerk stellen wir den Usern angepasste Desktop- und Startmenüverknüpfungen zur Verfügung. Die Verknüpfungen werden aus gegebenem Anlass quasi aus einem Share in das jeweilige Profil kopiert.
Wie kann ich die Vorlagen in dem Share bearbeiten, ohne die Verknüpfungen auf dem jeweiligen Bearbeitungs-PC gültig machen zu müssen???

Das Problem ist ja, wenn ich eine Verknüpfung über die Eigenschaften öffne und bearbeite, wird überprüft, ob der Pfad stimmt und das verknüpfte File auch wirklich dort liegt. Ist dies nicht der Fall, wird das Speichern/Schließen der Verknüpfungseigenschaften verhindert.

Da aber nicht jedes Programm auf jedem Client installiert ist, kann ich einige Verknüpfungen nicht bearbeiten - Hinweis auf einen "ungültigen Pfad".

Kann man die Überprüfung der Pfadgültigkeit abschalten?
Oder gibts ein einfaches Tool, um die Verknüpfungsinhalte bewusst auf ungültige Pfade anzupassen?

Content-Key: 168300

Url: https://administrator.de/contentid/168300

Printed on: April 23, 2024 at 14:04 o'clock

Member: Friemler
Friemler Jun 20, 2011 at 10:07:51 (UTC)
Goto Top
Hallo Bodenseehost,

ja, es gibt ein "Tool": VBScript face-wink

Set objShell    = WScript.CreateObject("WScript.Shell")  
Set objShortcut = objShell.CreateShortcut(WScript.Arguments(0))

objShortcut.TargetPath = WScript.Arguments(1)
objShortcut.Save

Das Script z.B. als ChgLNK.vbs speichern und dann so aufrufen:
cscript /nologo ChgLNK.vbs "Verknüpfung.lnk" "NeuesZiel"

Weitere Eigenschaften einer Verknüpfung:
<code type"plain">
objShortcut.WindowStyle
objShortcut.Hotkey
objShortcut.IconLocation
objShortcut.Description
objShortcut.WorkingDirectory


Gruß
Friemler
Member: Bodenseehost
Bodenseehost Jun 20, 2011 at 10:16:30 (UTC)
Goto Top
Hm... ja ok... klar.
Mit Kix hätt ich das auch hinbekommen sollen. Das als Argument im Aufruf mitzugeben macht es aber wieder schick *g*.

Bei der Anzahl der immer wieder zu bearbeitetenden .lnk's hätte ich das natürlich gerne per Maus+Desktop gemacht. Rechtsklick-Eigenschaften würde mir besser gefallen, aber so gehts auch.
Danke für Deinen Tipp!

Wenn man nur irgendwie die Pfadüberprüfung abschalten könnte?!
Member: Friemler
Friemler Jun 20, 2011 at 10:24:35 (UTC)
Goto Top
Falls Du mehrere Verknüpfungen auf das gleiche Ziel ändern willst, könntest Du das neue Ziel im Quelltext festlegen. Dann kannst Du die Icons der zu ändernden Verknüpfungen nacheinander auf das Icon des VBScripts ziehen.

Im Explorer die Pfadüberprüfung abschalten wird sich wohl nicht machen lassen.

Grüße
Member: Friemler
Friemler Jun 20, 2011 at 10:55:25 (UTC)
Goto Top
Eine GUI-Lösung:

Set objFSO   = CreateObject("Scripting.FileSystemObject")  
Set objShell = CreateObject("WScript.Shell")  

strTarget = InputBox("Neues Ziel der Verknüpfung:")  

If strTarget <> "" Then  
  Set objShortcut              = objShell.CreateShortcut(WScript.Arguments(0))
  objShortcut.TargetPath       = strTarget
  objShortcut.WorkingDirectory = objFSO.GetParentFolderName(strTarget)
  objShortcut.Save
End If

Das Icon der Verknüpfung auf das Icon des VBScripts ziehen.

Gruß
Friemler
Member: Bodenseehost
Bodenseehost Jun 20, 2011 at 12:10:56 (UTC)
Goto Top
Kuhl... Danke!
Ich glaube ich muss doch mehr mit VBS machen :-P
Member: evinben
evinben Jan 01, 2012 at 17:41:50 (UTC)
Goto Top
Gesundes neues Jahr allen!

Hallo Friemler,

wie soll der Script sein, wenn zur einen bestehenden Verknüpfung ein Kommentar hinzugefügt werden soll (da die restlichen bestehenden Eigenschaften nicht überschrieben werden dürfen)?

Mein Versuch war wie folgt:
Set objShell=WScript.CreateObject("Wscript.Shell")  
Set objShortcut=objShell.CreateShortcut("%ProgramData%\Microsoft\Windows\Start Menu\Programs\%NewLinkName%")  
objShortcut.Description="%Beschreibung(Kommentar)%"  
objShortcut.Save
Dieser Code-Aufbau funktioniert nur dann, wenn zusätzlich eine Befehlszeile mit dem Pfad zu der exe-Datei mit angegeben wird. Dannn wird aber eine vollständig neue Verknüpfung angelegt. In meinem Fall ist dies nicht erwünscht, da das Ziel (die Eigenschaft: Pfad zur exe-Datei) bei der Installation der Anwendung variiert werden kann – je nach Version. Somit möchte ich erreichen, dass die Kommentar-Eigenschaft der Verknüpfung bei Bedarf benutzerdefiniert gesetzt wird, aber ihre restlichen Eigenschaften unverändert bleiben.

Danke.
Member: Friemler
Friemler Jan 01, 2012 at 19:26:59 (UTC)
Goto Top
Hallo evinben,

auch Dir ein frohes Neues.

Meine Idee zu Deinem Problem wäre, alle interessierenden Eigenschaften auszulesen und ergänzt um den Kommentar wieder in den Shortcut zu schreiben.

Viel Glück
Friemler
Member: evinben
evinben Jan 02, 2012 at 10:32:40 (UTC)
Goto Top
Hallo Frimler,

den Code habe ich von Bastla. Die Eigenschaften auszulesen schaffe ich daher nicht, da ich mit VB nicht vertraut bin. Den bestehenden Code wollte ich nur umändern/ergänzen.

?

Danke für den Glück.
Evin
Member: Friemler
Friemler Jan 02, 2012 at 12:19:32 (UTC)
Goto Top
Hallo evinben,

ich habe gerade bei mir einen kleinen Test durchgeführt. Mit folgendem Code konnte ich nur den Kommentar einer Verknüpfung neu setzen:

If WScript.Arguments.Count = 2 Then
  Set objShell            = CreateObject("WScript.Shell")  
  Set objShortcut         = objShell.CreateShortcut(WScript.Arguments(0))
  objShortcut.Description = WScript.Arguments(1)
  objShortcut.Save
End If

Den Code z.B. als ChngComment.vbs speichern und dann folgendermaßen aufrufen:

cscript /nologo ChngComment.vbs "PfadZurVerknüpfung.lnk" "Neuer Kommentar"

Beim Pfad zur Verknüpfung muss die Dateierweiterung .lnk mit angegeben werden.

Die Methode CreateShortcut erzeugt keine neuen Verknüpfungen (der Name ist missverständlich). Die Methode erzeugt ein Objekt, über das auf die Eigenschaften einer Verknüpfung (auch lesend) zugegriffen werden kann. Geänderte/neue Eigenschaften müssen mit der Methode Save gespeichert werden (Zeile 5). Wenn die Verknüpfungsdatei noch garnicht existiert, wird sie erst dann erstellt.

Um VBS zu lernen: Google mal nach script56.chm (englische Version von MS) oder lade Dir von hier die (teilweise) deutsche Version.

Gruß
Friemler
Member: evinben
evinben Jan 02, 2012 at 21:07:00 (UTC)
Goto Top
Hallo Friemler,

es klappt!
Die Methode CreateShortcut erzeugt keine neuen Verknüpfungen (der Name ist missverständlich).
Wieder einiges dazu gelernt.

Ich freue mich, dass ich nicht aus diesem Grund darauf hingewiesen wurde, dass „diese Methode eben wie schon ihr Name sagt die Aufgabe hat eine vollständig neue Verknüpfung zu erzeugen und nichts anders“.
Etwas Hoffnung ist daher im Leben wichtig und es funktioniert.


Danke sehr für den Tipp mit dem VB-Lehrstoff "script56.chm".Dies werde ich mir ernst nehmen. Von meinem dicken VB-Buch im Regal scheue ich mich noch.

Gruß
evinben
Member: Knuefi
Knuefi Nov 14, 2015 at 21:21:17 (UTC)
Goto Top
Hallo Friemler,
kannst du mir bitte weiter Helfen?. Ich versuche ein VBScripts zu erstellen, mit dem ich eine Verknüfung eines Ordner erstellen kann. Schön wäre, wenn ich das Icon des Scipts auf den Ordner ziehe und die Verknüfung wird an den vorgegebenen Ort erstellt. Zudem soll die Eingabe des Namen der Verknüfungen mölich sein.
Gruß
Member: evinben
evinben Nov 15, 2015 updated at 19:36:14 (UTC)
Goto Top
Hallo Knuefi face-wink

willkommen in diesem Beitrag.

Gestern war ich spät Abend zu müde, um dir gleich mit einer Lösung zu antworten und jetzt habe ich die Gelegenheit gefunden für dich etwas aus den obigen Schnipseln von Friemler was zusammenzustellen.
Bei mir funktioniert es problemlos und wenn's was gibt, melde dich gerne und hoffe dein Anliegen soweit korrekt verstanden zu haben.

Schön wäre, wenn ich das Icon des Scipts auf den Ordner ziehe und die Verknüfung wird an den vorgegebenen Ort erstellt.
Du sollst allerdings andersrum vorgehen (den Ordner auf das Skript ziehen)

Gruß
Nik

'Wenn das Skript ohne Argument ausgeführt wird, abbrechen  
If WScript.Arguments.Count < 1 Then WScript.Quit

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objShell = CreateObject("WScript.Shell")  

'Ziehl der Verknüpfung abfragen  
strTarget = InputBox("Neues Ziel der Verknüpfung:")  

If strTarget <> "" Then  
  Set objShortcut              = objShell.CreateShortcut(WScript.Arguments(0) & ".lnk")  
  
  'Kommentar/Beschreibung setzen  
  'objShortcut.Description = WScript.Arguments(1)  

  'Ziehl der Verknüpfung setzen  
  objShortcut.TargetPath       = strTarget

  'Abreitsverzeichnis setzen  
  objShortcut.WorkingDirectory = objFSO.GetParentFolderName(strTarget)

  objShortcut.Save
End If
Member: Friemler
Friemler Nov 15, 2015 updated at 18:08:28 (UTC)
Goto Top
Hallo Knuefi, hallo Nik,

ich hatte auch noch was anderes zu tun, deshalb erst jetzt mein Vorschlag. Wie meistens etwas länger als der Code der "Konkurenz" face-wink, aber ausführlich kommentiert und komplett ausprogrammiert mit Fehlerhandling usw.:

'Alle Variablen müssen vor ihrer Verwendung deklariert werden  
Option Explicit


'Konstanten zur Konfiguration der Verknüpfung  
Const cWindowStyleShowNormal    = 1
Const cWindowStyleShowMaximized = 3
Const cWindowStyleShowMinimized = 7

'Speicherpfad für die Verknüpfungsdateien  
Const cLinkStorageLocation = "C:\Users\<User>\Desktop"  


'Variablendeklaration  
Dim colArgs, objFSO, objShell, objShortcut
Dim strFolderPath, strLinkName
Dim strScriptDescription
Dim strMsgPromptForName
Dim strErrMsgNoArgs, strErrMsgDirNotExists, strErrMsgLinkNameInvalid 


'Meldungs-Strings initialisieren  
strScriptDescription     = "Verknüpfung erzeugen"  
strMsgPromptForName      = "Geben Sie einen Namen für die Verknüpfung an."  
strErrMsgNoArgs          = "Bitte übergeben Sie das Ziel der Verknüpfung" & vbCrLf & _  
                           "beim Aufruf dieses Scripts als Argument!"  
strErrMsgDirNotExists    = "Das übergebene Verzeichnis existiert nicht!"  
strErrMsgLinkNameInvalid = "Der eingegebene Name enthält ungültige Zeichen." & vbCrLf & _  
                           "Die Zeichen \/:*?""<>| dürfen nicht Bestandteil" & vbCrLf & _  
                           "des Namens sein."  


'Argument-Collection holen  
Set colArgs = WScript.Arguments

'und prüfen, ob mindestens ein Argument übergeben wurde  
If colArgs.Count = 0 Then
  ShowError strErrMsgNoArgs
  WScript.Quit
End If

'Filesystem-Objekt erzeugen und den absoluten Pfad  
'des übergebenen Verzeichnisses ermitteln  
Set objFSO    = CreateObject("Scripting.FileSystemObject")  
strFolderPath = objFSO.GetAbsolutePathName(colArgs(0))

'Prüfen, ob das übergebene Verzeichnis existiert  
If Not objFSO.FolderExists(strFolderPath) Then
  ShowError strErrMsgDirNotExists
  WScript.Quit
End If

'Name der Verknüpfung vom User einlesen  
'Als Default-Wert wird der Name des Verzeichnisses eingetragen  
strLinkName = InputBox(strMsgPromptForName, _
                       strScriptDescription, _
                       objFSO.GetFileName(strFolderPath) _
                      )

'Prüfen, ob eine Eingabe gemacht wurde  
'Wenn nicht, Abbruch  
If strLinkName = "" Then  
  WScript.Quit
End If

'Prüfen, ob der Name ungültige Zeichen enthält  
If ContainsIllegalChars(strLinkName) Then
  ShowError strErrMsgLinkNameInvalid
  WScript.Quit
End If

'Jetzt können die Daten der Verknüpfung festgelegt werden  
Set objShell    = WScript.CreateObject("WScript.Shell")  
Set objShortcut = objShell.CreateShortcut(objFSO.BuildPath(cLinkStorageLocation, strLinkName & ".lnk"))  

objShortcut.TargetPath  = strFolderPath
objShortcut.WindowStyle = cWindowStyleShowNormal

'Jetzt die Verknüpfungsdatei speichern  
objShortcut.Save



'Prüft, ob ein übergebener String bestimmte Zeichen enthält  
Function ContainsIllegalChars(ByRef strAString)
  Dim objRegEx
  
  Set objRegEx = New RegExp
  
  objRegEx.IgnoreCase = True
  objRegEx.Global     = True
  objRegEx.Pattern    = "[\\/:\*\?""<>\|]"  
  
  ContainsIllegalChars = objRegEx.Test(strAString)
End Function


'Zeigt Dialogboxen mit Fehlermeldungen an  
Sub ShowError(ByRef strMessage)
  MsgBox strMessage, _
         vbCritical + vbOKOnly, _
         strScriptDescription
End Sub

In Zeile 11 muss der Pfad zu dem Verzeichnis angegeben werden, in dem die erzeugten Verknüpfungen abgelegt werden sollen.

Das Icon des Scripts auf das Icon des Verzeichnisses ziehen, zu dem die Verknüpfung erstellt werden soll, funktioniert natürlich nicht, dadurch würde das Script in das Verzeichnis kopiert. Es geht nur umgekehrt.

Gruß
Friemler
Member: evinben
evinben Nov 15, 2015 updated at 20:07:52 (UTC)
Goto Top
hey Friemler, extrem ordentlich face-wink.
ist es bei dir immer so überall zu Hause perfekt?

Den Code habe mir gleich archiviert (zu meiner Verknüpfungs-Sammlung eingefügt).
Wenn du schon sowieso dabei bist, vielleicht könntest du ihn leicht so erweitern, dass ebenso eine Fehlermeldung kommt (und zwar schon vor Eingabe des Ordner-Namens), falls der Pfad nicht stimmt (Speicherpfad für die Verknüpfungsdateien / Const cLinkStorageLocation) und eventuell ein Schalter (Option) für die Beschreibung/"Kommentar", dann haben alle zukünftige Leser gleich in Fülle servierte Lösung .

Einen schönen Abend
Nik
Member: Friemler
Friemler Nov 15, 2015 updated at 20:52:16 (UTC)
Goto Top
Hi Nik,

nur wenn man hohe Ansprüche hat (auch an sich selbst), kommt man dem Idealfall näher. Und nein, das wenigste von dem was ich mache, ist auch nur annähernd perfekt, bin ja auch nur ein Mensch.

Ich habe nur auf solche Aussagen wie "Geht auch mit diesen 5 Zeilen" oder "Ich nehme die Lösung von XY, weil sie kürzer ist" angespielt.

Bzgl. Deiner Erweiterungswünsche: Erst mal abwarten, was Knuefi dazu meint, das Script ist ja für ihn.

Und außerdem: Die besten Möglichkeiten, sich selbst zu verbessern (besonders beim programmieren), bieten sich einem, wenn man das verbessert, was andere gemacht haben... face-wink

Grüße
Friemler
Member: evinben
evinben Nov 15, 2015 updated at 20:44:58 (UTC)
Goto Top
Und nein, das wenigste von dem was ich mache, ist auch nur annähernd perfekt, bin ja auch nur ein Mensch.
das beruhigt mich aber und macht dich zugleich sympathisch (keine Roboter, stimmt's?)
Alles richtig gesagt!