none
Erstellte Programmverknüpfungen tracken RRS feed

  • Frage

  • Hallo,

    ich erstelle mit meinem Programm Verknüpfungen auf dem Desktop des Benutzers. Hierfür nutze ich die shell32.dll. Das funktioniert soweit auch ganz gut.

    Allerdings muss ich die erstellten Verknüpfungen irgendwie "tracken", so dass ich sie im Bedarfsfall auch wieder löschen kann. (Ähnlich als wenn der MSI Installer beim deinstallieren die Verknüpfungen wieder löscht)

    Welche Möglichkeiten habe ich zum tracken der in meinem Programm manuell erstellten Verknüpfungen?

    Freitag, 22. Mai 2015 08:19

Antworten

  • Hallo Stefan,

    was für eine Art von Verknüpfung ist es denn? Eine klassische LNK-Datei oder ein symbolischer Link? LNK-Dateien sind normale Dateien die Windows minimal anders behandelt. Symbolische Links dagegen werden irgendwie anders vom System gehandhabt, weswegen sie praktisch direkt die Datei darstellen. Wie diese vom System verwaltet werden kann ich dir aber auch nicht sagen.
    URL Dateien verhalten sich übrigens wie LNK Dateien.

    Und wie genau meinst du das mit den Rechten? Baut das auf dem Rechtesystem von Windows auf oder ist es etwas eigenes?

    Grundsätzlich würde ich immer noch sagen dass du dir abspeichern solltest wo die Verknüpfungen liegen und diese dann ggf. löschen. Du musst auch bedenken, dass sich der Benutzer auch einfach selbst Links erstellen kann. Dass könnte man wiederum mit dem Rechtesystem von Windows blockieren.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 25. Mai 2015 12:50
    Moderator

Alle Antworten

  • Hallo StefanWend,

    du kannst einfach an geeigneter Stelle abspeichern, welche Verknüpfungen erstellt wurden und lädst die gespeicherten Werte ein, wenn es ans Löschen gehen soll.

    Der Windows Installer macht auch nichts anderes.

    Gruß


    - Florian

    Freitag, 22. Mai 2015 09:14
  • Hallo Florian,

    was wäre denn eine geeignete Stelle? Gibt es da von Microsoft etwas vorgeschriebenes/geschlagenes?

    Freitag, 22. Mai 2015 09:45
  • Da gibt es die üblichen Möglichkeiten, die auch für alle anderen Daten gelten, die du abspeicherst:

    - Registry
    - Datei
    - Datenbank

    Dabei sollte drauf geachtet werden das die nötigen Berechtigungen am Speicherort zur Laufzeit deines Programms vorliegen, damit dort auch gespeichert werden kann.

    Art und Umgebung des Programms könnten für die passende Wahl entscheidend sein.

    Weiterhin spielt es eine Rolle ob es Daten für einen einzelnen Benutzer sind oder für alle Benutzer.

    Z. B. wäre ApplicationData ein geeigneter Ordner für eine Speicherung in einer Datei, welche Benutzerspezifisch ist.

     

    - Florian

    Freitag, 22. Mai 2015 09:59
  • Hallo,

    mh also sehe ich das richtig, dass es keine Windows API's dafür gibt? Weist du, wo der MSI Installer solche Informationen speichert ?

    Samstag, 23. Mai 2015 18:51
  • Hallo Stefan,

    soweit ich weiß speichern die MSI-Installer gar nichts im System ab außer dem Ort wo die Uninstaller-Anwendung liegt. Somit wird es wohl von Seiten Microsofts nichts spezielles dafür geben. Wenn du es dir ganz einfach machen willst, dann kannst du die Einstellungen der Anwendung nutzen. Sonst bleiben die von Florian genannten Wege.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Samstag, 23. Mai 2015 22:29
    Moderator
  • Hallo Tom,

    der MSI Installer erstellt ja idr. Verknüpfungen im Startmenü von AllUsers, oder dem Benutzer. Jenachdem was der Entwickler sich so überlegt hat.

    Deinstalliere ich nun die Applikation wieder, entfernt der MSI Installer solche Verknüpfungen. Irgendwoher muss er ja noch wissen, welche er damals erstellt hat, um diese wieder zu entfernen.

    Hintergrund ist: Ich möchte die Verknüpfung auch wieder entfernen können, wenn der Benutzer sie umbenannt hat.Und ich habe absolut keine Idee, wie ich das anstellen soll.

    Sonntag, 24. Mai 2015 19:56
  • Hallo StefanWend, 

    dem Installer würden in solch einem Falle zwei Optionen zur Verfügung stehen:

    1. Da diese speicherorte "konstant" sind, kann er doch einfach alle Dateinen (.lnk) im bekannten Ordner öffnen und deren ziel einlesen. Sollte das Ziel auf seine Datei verweisen, weiß er, dass er es löschen kann. Das einlesen/erstellen von Links kann man mittels der WindowsShellLibrary machen. Hier gibt es ein Beispiel.

    2. Die andere alternative wäre es - wie gesagt - alle Shortcuts irgendwo zu speichern (vorzugsweise in der Registry) als Liste und dort einfach beim löschen alle nacheinander einlesen, die Datei löschen und am ende auch den Registry-Zweig.



    © 2015 Thomas Roskop

    Germany // Deutschland

    Montag, 25. Mai 2015 07:00
  • Vielen Dank für das Feedback.

    Das erzeugen der Verknüpfungen funktioniert einwandfrei. Ich erstelle Verknüpfungen für schon vorhandene Programme.

    (Ziel ist es, wenn ein Benutzer nicht mehr das Recht besitzt, diese Verknüpfung zu haben, soll sie gelöscht werden)

    Gibt es denn eine Art Identification von den Verknüpfungen(GUID zum Beispiel)? Wenn der Benutzer diese selbst umbenennt, dann würde ja mein Verweis auf eine Verknüpfung zeigen, die nicht mehr vorhanden ist.

    Montag, 25. Mai 2015 11:08
  • Hallo Stefan,

    was für eine Art von Verknüpfung ist es denn? Eine klassische LNK-Datei oder ein symbolischer Link? LNK-Dateien sind normale Dateien die Windows minimal anders behandelt. Symbolische Links dagegen werden irgendwie anders vom System gehandhabt, weswegen sie praktisch direkt die Datei darstellen. Wie diese vom System verwaltet werden kann ich dir aber auch nicht sagen.
    URL Dateien verhalten sich übrigens wie LNK Dateien.

    Und wie genau meinst du das mit den Rechten? Baut das auf dem Rechtesystem von Windows auf oder ist es etwas eigenes?

    Grundsätzlich würde ich immer noch sagen dass du dir abspeichern solltest wo die Verknüpfungen liegen und diese dann ggf. löschen. Du musst auch bedenken, dass sich der Benutzer auch einfach selbst Links erstellen kann. Dass könnte man wiederum mit dem Rechtesystem von Windows blockieren.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 25. Mai 2015 12:50
    Moderator
  • Hi

    für die Deinstallation einer MSI Installation wird ja immer noch das MSI benötigt und damit sind alle Infos WO noch da (zwischengespeichert unter %systemroot%\installer). Welche Teile des MSIs installiert wurden wird in der Registry gespeichert: HKLM\Software\Microsoft\Windows\CurrentVersion\Installer

    Gruß

      Stefan

    Montag, 25. Mai 2015 20:01
  • Hallo StefanWend,

    der Windows Installer verwendet zum deinstallieren ebenfalls die Informationen aus der MSI Datenbank. Wenn Dateien verändert oder umbenannt wurden, verbleiben diese auf dem System, da sie für die Deinstallation nicht mehr gefunden werden und weil durch den Benutzer durchgeführte Änderungen nicht "getrackt" werden, d. h. Windows Installer nicht entscheiden kann in welchen Zustand diese zu überführen wären.

    Benutzungsrechte wirst Du schwerlich durch das Löschen einer Verknüpfung nehmen können, dies aus mehreren Gründen:
    - Der Benutzer kann jederzeit eine Verknüpfung kopieren
    - Der Benutzer kann jederzeit auch ohne Verknüpfung zum Programmordner navigieren und die Anwendung dort starten
    - Der Benutzer kann ggfls. nötige Parameter für den Programmstart in einer komplett eigenen Verknüpfung hinterlegen

    Es gibt natürlich andere Möglichkeiten einen Benutzer die Rechte für die Verwendung eines Programms bzw. den Zugriff auf ein verknüpftes Ziel zu entziehen, dies ist aber ein anderes Thema und hat mit der oben gestellten Frage nicht direkt zu tun.

    Gruß


    - Florian

    Dienstag, 26. Mai 2015 06:34
  • Hallo, Ja es sind normale lnk Verknüpfungen. Ich weiß, dass ich damit nicht die Rechte auf eine Applikation einschränken kann, dafür habe ich eine andere Methode außerhalb meines Programs. Kennt ihr vielleicht von Citrix das online Plugin, oder den aktuellen Citrix Receiver? Hier können Verknüpfungen umbenannt werden und trotzdem kann der Receiver diese wieder entfernen. Diese Funktionalität hätte ich gerne.
    Mittwoch, 3. Juni 2015 15:26
  • Hallo,

    Citrix sagt mir nur vom Namen her etwas, die Software kenne ich daher nicht.

    Ich habe 2 Ideen wie das Programm die Verknüpfungen trotzdem wieder findet:

    1. Ein FielSystemWatcher der die Datei überwacht und ggf. die Datenbank mit den Verknüpfungen ändert.
    2. Das Programm sucht einfach alle Verknüpfungen an den üblichen Plätzen oder überall und findet so auch die umbenannten.

    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 3. Juni 2015 15:30
    Moderator
  • File System Watcher würde bedeuten, dass das Programm durchgehend im Hintergrund laufen müsste.

    Ich habe schon dran gedacht, nach der Erstellung einen MD5 Hash der lnk Datei zu erzeugen und diesen abzuspeichern. Selbst wenn die lnk umbenannt wird, bleibt der MD5 Hash gleich, da er den Inhalt vergleicht.

    Ich frage mich nur, wenn ich nachher 20 Verknüpfungen habe, und die Anwendung beim Logon ausgeführt wird, alle Verknüpfungen durchzugehen, einen Hash zu erzeugen und mit der Datenbank abzugleichen, ob das nicht zu lange dauert.

    Mittwoch, 3. Juni 2015 17:04
  • Hallo,

    20 Verknüpfungen dürften noch machbar sein. Doch musst du die gesamte Festplatte durchsuchen...bzw. alles worauf der Benutzer zugreifen kann. Das ist eben das Problem.

    Hashs werden dir da auch nur bedingt helfen. Denn Sicherheit ob 2 Dateien gleich sind bekommst du nur durch einen Byte-für-Byte vergleich.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 3. Juni 2015 18:34
    Moderator