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.
das script hat einen fehler (html umsetzung) drin. anstelle von & sollte es in zeile 20 und 34 nur & heissen.
dasselbe problem tritt beim kommentieren auf…
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?