Unter Windows 7 gibt es die Möglichkeit, häufig verwendete Programme an das Startmenü oder an die Startleiste zu heften. Der programmatische Zugriff auf dieses Feature, z. B. aus .NET heraus, wurde aus diversen Gründen von Microsoft erschwert. Auszug von http://blogs.msdn.com/b/oldnewthing/archive/2003/09/03/54760.aspx:
In Windows 95, we gave programmatic access to the Start menu „Fast items“ list – the items that appear at the top of the Start menu above the Programs list. This area was meant for the user to customize with their favorite links, but programs quickly saw the opportunity and spammed themselves into it every chance they got. In IE, we gave programmatic access to the Favorites menu, and once again, programs spammed themselves into it. In Windows XP we intentionally did not give programmatic access to the bold list of items at the top of the Start menu (the „pin list“). The pin list is for users to put their favorite icons. It is not the place for a program to decide unilaterally, „I am so cool. I am your favorite icon. I just know it. So I’ll put myself there because, well, I’m so cool.“ [..] Because we knew that the moment we let people mess with the pin list, everybody would install themselves into it and it would become meaningless (and annoying).
Das Feature wurde also deaktiviert, da der programmatische Zugriff oft missbraucht wird und damit die als Favoriten gedachten Einträge ihren Sinn verloren. Trotzdem gibt es Anwendungsfälle, in denen der programmatische Zugriff auf diese Einträge legitim ist. Man denke an Firmen, bei denen die Verfügbarkeit und Position der Programmsymbole in den Workflow integriert werden. In diesen Fällen verbietet es sich für jeden Benutzer und auf jedem Rechner die Einstellungen manuell durchzuführen. Es gibt keine Möglichkeit zur automatischen Aktualisierung, falls sich die Anforderungen einmal ändern. Ganz sicher kann man diesen Anwendungsfall auch über das Active-Directory lösen, dies wäre aber weitaus unflexibler als z. B. ein Script. Abhilfe Hier sind wir auch schon bei der Lösung des Problems. Wie unter http://blog.ananthonline.net/?p=37 beschrieben, lässt es sich mit dem Shellobject im Windows-Scripting (VBS) lösen. Grundsätzlich besteht die Technik darin, dass man sich zu einer Verknüpfung sämtliche „Verbs“ (Menüpunkte) holt und diese dann gezielt auslöst. So ist es möglich, jede verfügbare Verknüpfung an- und abzupinnen. Gepinnte Einträge werden dann als Verknüpfung unter folgendem Pfad abgelegt: %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\StartMenu Beispiel für die Verwendung Im Folgenden zeige ich ein Beispielscript, welches folgende Aufgaben übernimmt:
  • Alle gepinnten Einträge des Startmenüs abheften
  • Alle Links eines über die Kommandozeile definierten Ordners wieder anpinnen.
Für die Verwendung muss ein Verzeichnis mit den gewünschten Verknüpfungen erstellt werden. Der Pfad zu dem Verzeichnis wird dann in der Kommandozeile als Parameter an das Script übergeben. Hinweis: Wie man gut erkennen kann, ist diese Lösung von der Systemsprache abhängig.
Set oShell = CreateObject( "WScript.Shell" )
Set fs = createobject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")

' Argumente prüfen
Set objArgs = WScript.Arguments
if objArgs.Count = 0 then WScript.Quit

' Gepinnte Einträge unpinnen
Set f = fs.getFolder(oShell.ExpandEnvironmentStrings("%AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\StartMenu"))
Set fc = f.files
' Alle Links durchlaufen
For Each el In fc
	'Wscript.Echo el.name
	Set objFolder = objShell.Namespace(oShell.ExpandEnvironmentStrings("%AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\StartMenu"))
	Set objFolderItem = objFolder.ParseName(el.name)
	Set colVerbs = objFolderItem.Verbs
	' Eintrag zum Abheften in den verfügbaren Menüpunkten suchen und auslösen
	For Each objVerb in colVerbs
	    If Replace(objVerb.name, "&", "") = "Vom Startmenü lösen" Then objVerb.DoIt
	Next
Next

' Zu pinnende Links aus dem übergebenen Verzeichnis durchlaufen
Set f = fs.getFolder(objArgs(0))
Set fc = f.files
For Each el In fc
	'Wscript.Echo el.name
	Set objFolder = objShell.Namespace(objArgs(0))
	Set objFolderItem = objFolder.ParseName(el.name)
	Set colVerbs = objFolderItem.Verbs
	' Eintrag zum Anheften in den verfügbaren Menüpunkten suchen und auslösen
	For Each objVerb in colVerbs
	    If Replace(objVerb.name, "&", "") = "An Startmenü anheften" Then objVerb.DoIt
	Next
Next
Update Im Code hatte sich beim Speichern ein Fehler eingeschlichen. In Zeile 20 und 34 stand statt einem einfachen „&“ das HTML-Äquivalent „&“. Danke an Markus für diesen Hinweis.  

Schreibe einen Kommentar zu Peter

  1. Markus
    Dez 20, 2011

    das script hat einen fehler (html umsetzung) drin. anstelle von & sollte es in zeile 20 und 34 nur & heissen.

    Antworten
  2. Markus
    Dez 20, 2011

    dasselbe problem tritt beim kommentieren auf…

    Antworten
  3. Peter
    Nov 13, 2014

    Das anpinnen ans Startmenü will bei mir nicht funktionieren. Es scheint am Ü zu liegen. Denn an der Taskleiste kann ich problemlos anheften.

    Lösungsvorschläge wie das zu Stande kommt? und wieso es bei mir wegen ö und ü nicht funktioniert?

    Antworten