Bents Blog

 

Ein IT Blog mit Themen aus dem Windows Server Umfeld.

Windows 7 und Server 2008 R2: Verknüpfungen an die Taskleiste anheften per Gruppenrichtlinie

Seit Windows 7 und Windows Server 2008 R2 gibt es bekanntlich keine Schnellstart-Leiste (Quicklaunch) mehr. Die neue Taskleiste wurde komplett überarbeitet und wartet mit einer Fülle neuer Funktionen. Dazu gehört unter Anderem das „Anheften“ von Programmsymbolen bzw. Verknüpfungen, um den schnellen Zugriff auf häufig verwendete Anwendungen zu ermöglichen. Das ist schön und gleichzeitig gut, allerdings gibt es für die automatische Verteilung bzw. Einrichtung keine Gruppenrichtlinie. (Zum Vergleich der Möglichkeiten bei den Vorgängerversionen siehe meinen Beitrag zu den Gruppenrichtlinienerweiterungen für Windows Server 2008, letzter Abschnitt.)

Da ich aber nun auch für die aktuellen Betriebssystemversionen ebenfalls eine automatisierte Lösung (auf Basis von Gruppenrichtlinien) brauchte, habe ich mich wieder einmal zu einem neuen VBS-Skript durch gerungen. Ob nun bei der Anmeldung als Administrator an einem Server in der Domäne oder ob als Benutzer an einem Terminalserver 2008 R2, um manuelle Eingriffe so gering wie möglich zu halten, benötige ich eine automatische Konfiguration für Benutzer-abhängige Einstellungen des Betriebssystems.

Lösung

Das folgende Skript PinTaskbar.zip löst dieses Problem unkompliziert und recht elegant. Für die Umsetzung und Ausführung sind allerdings ein paar kleinere Vorbereitungen nötig. (Es wird kein Windows Server 2008 R2 Domänencontroller benötigt, diese Variante funktioniert bereits mit Windows Server 2003!) Ich werde mich in meiner folgenden Anleitung auf zwei Beispiel-Anwendungen von Windows 7 und Server 2008 R2 beschränken – Notpad und das Snipping Tool. Das Skript entpackt man am Besten in einen Unterordner der NETLOGON Ressource, in meinem Fall nach:

\\FQDN\Netlogon\Skripte\

Zu Beginn erstellt man die Verknüpfungen, die später verteilt und an die Taskleiste angeheftet werden sollen:

Diese Verknüpfungen können nun in einen zentralen Ordner für die spätere Verteilung innerhalb der Domäne verschoben werden, in meinem Beispiel nach:

\\FQDN\Netlogon\Taskbar

Wer zwischen verschiedenen Benutzergruppen unterscheiden möchte, kann entweder Unterordner (wie Administratoren und Benutzer) erstellen, oder – und das ist wesentlich eleganter – die Leseberechtigungen für jede Datei für die jeweils relevanten Gruppen setzen oder entfernen. Der Vorteil dieser zentralen Stelle ist, ich muss meine Verknüpfungen nur an einem Ort pflegen und aktualisieren, die Änderungen werden bei der nächsten Anmeldung eines Benutzers neu gesetzt.

Nun muss nur noch eine (oder mehrere, abhängig von den unterschiedlichen Verknüpfung-Sets) geeignete Gruppenrichtlinie(n) auswählen und die Ausführung des Skripts PinTaskbar.vbs konfigurieren (Benutzerkonfiguration, Windows-Einstellungen, Skripts, Anmelden):

Wichtig: Als Skript-Parameter ist das Verzeichnis (\\FQDN\Netlogon\Taskbar) anzugeben, in dem sich die Verknüpfungen befinden, ohne Parameter beendet sich das Skript ohne Aktion.

Achtung

Das Skript funktioniert nur für die Betriebssysteme Windows 7 und Windows Server 2008 R2. Für die Ausführung via Gruppenrichtlinien sollte die WMI-Filterung genutzt werden, um Fehler auf Systemen mit älteren Betriebssystemversionen zu vermeiden.  Der WMI-Filter für Windows Server 2008 R2 und Windows 7 lautet:

select * from Win32_OperatingSystem where Version like „6.1%“

Funktionsweise

Das Skript selber ist relativ simpel und klein. Wie beschrieben, erwartet es einen Übergabeparameter – nämlich das Quellverzeichnis der Verknüpfungen, in meinem Beispielfall also:

\\FQDN\Netlogon\Taskbar

Aus diesem Verzeichnis kopiert das Skript nun alle LNK-Dateien (*.lnk) in das Zielverzeichnis:

%APPDATA%\Microsoft\Internet Explorer\Quick Launch\

Dabei zeigt die Umgebungsvariable %APPDATA% auf das Benutzerverzeichnis (Profil) %SystemDrive%\Users\Benutzername\AppData\Roaming. Somit werden die Verknüpfungen immer in das richtige Benutzerprofil kopiert und von dieser Stelle an die Taskleiste angeheftet. Das Skript funktioniert dabei sowohl für die Sprache Deutsch als auch für Englisch (andere Sprachen müssen in Zeile 30 oder 31 des Skripts geändert bzw. hinzugefügt werden). Damit ist die Abarbeitung auch schon beendet.

Update vom 30. August 2011

Auf Grund von Nachfragen und eigener Forschungen konnte ich eine kleine Verbesserung – was die initialen Verknüpfungen betrifft, die für jeden Benutzer automatisch vom System erzeugt werden – erwirken. Auf einem Remote Desktop Server 2008 R2 erhält jeder Remotedesktop-Benutzer bei seiner initialen Profil-Erstellung die Verknüpfungen für den Servermanager, die PowerShell und den Windows-Explorer. Letztere ist ganz sicher in Ordnung, die restlichen zwei sind meiner Meinung nach fehl am Platz. Die Lösung für das Problem heißt erweiterte Gruppenrichtlinien:

In der Gruppenrichtlinie des Remotedesktop-Benutzers sind die folgenden beiden Einträge unter der Benutzerkonfiguration, Einstellungen, Windows-Einstellungen, Registrierung zu erzeugen:

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband

In diesem Eintrag werden alle Verknüpfungen der Taskleiste binär gespeichert. Dabei werden die binären Daten einer Verknüpfungsdatei (*.lnk) einfach aneinander gehangen – leider entzieht sich die genaue Syntax meiner Kenntnis, sonst hätte sich hier eine Lösung parat. Mit der obigen Einstellung (0xFF) wird die Leiste komplett geleert, aus diesem Grund sollte sie – genau wie die folgende Richtlinie – nur einmal angewendet werden:

Da der Eintrag FavoritesResolve bei jeder Anmeldung neu erstellt wird, kann dieser Eintrag gelöscht werden.

Fazit

Wer mag, kann das Skript gern ändern bzw. seinen eigenen Bedürfnissen anpassen, über Verbesserungsvorschläge würde ich mich freuen! Wie bei allen meinen Beiträgen gilt: Bei Tipps, Vorschlägen sowie Fragen oder Kritiken hinterlasst bitte einen Kommentar.

Einen Blog am Leben zu erhalten kostet Zeit und Geld. Da ich auf meiner Seite weder Werbung einbinde, noch andersweitige Zuwendungen erhalte, freue ich mich über jede kleine Spende. Einfach und unkompliziert geht das über PayPalMe. Du unterstützt damit diesen Blog. Vielen Dank.

17 Kommentare für “Windows 7 und Server 2008 R2: Verknüpfungen an die Taskleiste anheften per Gruppenrichtlinie”

  • Andreas

    Interessanter Artikel, der Ansatz für eine gestaltete Pinbar ist cool. Das Skript PinTaskbar.zip ist ein Workaround. Ich suche noch nach einer Möglichkeit den Einsatz des Scripts zu umgehen.

    – ADMX Vorlage anpassen (eher nicht, diese ist beim nächsten Update wieder default)
    – User-Shortcuts.xml von Hand anpassen klappt nicht (warum auch immer)

    Ev. hat ja noch jemand eine Idee ohne Script also alle Settings in einer Gruppenrichtline.

  • Frank

    Wir stellen gerade unsere Terminalserverfarm von W2K3 nach W2k8R2 um.
    Das Vbs-Script ist eine sehr gute Hilfe für das Einfügen von Links in die neue Taskbar. Wenn ich allerdings die Rechte auf den Links verändere (z. B. soll ein User einen bestimmten Link micht mehr angezeigt bekommen) bricht das Script mit einer Fehlermeldung, welches auf fehlende Zugriffsrechte hinweist ab.
    Gibt es da schon eine Lösung bzw. welche Rechte müssen auf den Links noch sein damit das Script weiterläuft und Link aus der Taskbar des User entfernt werden ?

  • Bent Schrader

    Hallo Frank,

    das Skript selbst entfernt KEINE Verknüpfungen aus der Taskbar – es fügt lediglich NEUE hinzu. Ich vermute, dass bei dem Kopiervorgang, bei dem fehlenden Leserecht selbiger abgebrochen wird. Bitte teste mal Folgendes:

    Füge bitte in Zeile 18 den Befehl

    On Error Resume Next

    hinzu. Das sollte dafür sorgen, dass bei einem Fehler, dass Skript nicht abbricht, sondern mit der Abarbeitung des nächsten Elements fortsetzt.

    Bitte gib mir ein Feedback, ob dass so funktioniert. Vielen Dank.

    Gruß,
    Bent

  • Frank

    Hallo Bent,

    ja, daß funktioniert jetzt.
    Prima!
    Es werden nur Icon’s die dafür berechtigt sind in die Taskbar kopiert.
    Auch wenn der User keine Recht (kein Gruppenmitglied mehr ist) mehr dafür hat , läuft das Script durch.
    Super wäre natürlich, wenn auch die Icon’s dann entfernt würden.
    Wir haben ca. 60 Access-Datenbanken im Einsatz deren Zugriff darüber gesteuert wird.
    Bis konnten wir dies mit einem KIX-Sript realisieren, welches aber unter W2K8R2 so nicht mehr funktioniert.

    Vielen Dank für Deinen Bemühungen.

    Gruß
    Frank

  • Frank

    Hallo Bent,

    als Nachtrag:
    Nicht mehr benötigte bzw. Icon’s worauf kein Zugriff mehr besteht, kann ich auch nicht so einfach löschen. Weder händisch durch den User selbst, noch im Profil.
    Zumindest bleibt immer immer ein weißer Hintergrund, wo das Icon einmal war.
    Mit der Zeit schaufelt sich so ein Profil mit allerhand Müll zu.
    Von daher noch einmal meine Anregung dies zu automatisieren und dabei „sauber“ zu Löschen. Ansonsten scheidete die Löung für uns aus.
    Bitte eine kurze Rückmeldung, ob Du an dieses Problem rangehen möchtest ?

    Vielen Dank.

    Gruß
    Frank Heinen

  • Bent Schrader

    Hallo Frank,

    ich kenne das von Dir beschriebene Verhalten der manuell gelöschten Verknüpfungen ebenfalls, habe auch nie behauptet, mein Skript könne nicht mehr benötigte Verknüpfungen einfach entfernen. Alle hier zur freien Verwendung angebotenen und von mir entwickelten Skripte sind grundsätzlich zum Einsatz geeignet – aber immer OHNE Zwang wie Haftung. In Deinem Kommentar schwingt mir einfach eine Note Vorwurf mit, deshalb nochmals dieser Hinweis.

    Zum Löschen der Icons folgender Hinweis: Alle Änderungen, die an der Taskleiste vorgenommen werden, sind in der Registry an folgendem Ort gespeichert:
    HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband, hier stehen (im binären Format) die Verknüpfungen unter Favorites und ein Counter FavoritesChanges der sich bei jeder Änderung um eins erhöht. Wenn ich die korrekte Syntax kennen würde, mit der die dargestellten Verknüpfungen im binären Format abgelegt werden, ich hätte bereits ein funktionsfähiges Skript geschrieben. Für Hinweise bin ich hier sehr dankbar.

    Gruß,
    Bent

  • Frank

    Hallo Bent,

    tut mir leid.
    Es sollte auf keinen Fall als Vorwurf bei Dir angekommen.
    Man muß doch für jedes kostenlose Tool dankbar bar.
    Ich suche halt nach einer optimalen Lösung und wenn das Löschen mit Deinem Script noch ginge, wäre das super.
    Teste zur Zeit noch eine Kombination von *.vbs (PinItem_de.vbs /UnPinItem_de.vbs) und *.cmd (mit ifmember-Abfrage).
    Vom Prinzip her funktioniert es.
    Nur leider relativ langsam (ca. 30 Sekunden) und ich muß alle Links auf dem jeweiligen lokalen Anmeldeterminalserver vorhalten.
    Über Provisioningserver kein Riesenproblem, aber lästig und ein zentrale Ablage z. B. im Netlogon-Verzeichnis wäre sicher von Vorteil.
    Reine Netzwerklinks werden ja nicht in die Taskbar übernommen, sondern nur die mit dem jeweiligem kompletten Programmaufrufpfad.
    Wenn Dich das interessiert, sende ich Dir die Sripts einmal zu ?

    Gruß
    Frank

  • Bent Schrader

    Hallo Frank,

    ja gern. Bitte sende die Skripte an meine Mai-Adresse aus dem Impressum.
    Vielen Dank.

    Gruß,
    Bent

  • Johannes Sebald

    Hallo Bent,

    vielen Dank erstmal für deine freie Arbeit und das du das Skript zur Verfügung stellst. Habe es nun schon länger im Einsatz, jedoch wird nun seit einigen Tagen die Verknüpfungen doppelt angepinnt. Muss das Anmeldescript nur einmal angewendet werden und falls ja wie? Hatte bis jetzt die Version 1.0 im Einsatz und habe nun auf Version 1.1 „geupdatet“. Hat sich im Bezug auf mein Problem etwas am Skript geändert?

  • Dominik Stampfli

    Guten Tag

    Funktioniert dies auch mit ACCESS Programm auf dem Netz oder mit TwixTel aus dem Netz?

    Danke für die schnelle Antwort. :)

    Gruss

  • Bent Schrader

    Hallo Dominik,

    ich bin mir nicht sicher ob ich Dich richtig verstehe. Aber ich vermute, bei Dir funktionieren einige Verknüpfungen nicht? In der Tat können nur Verknüpfungen an der Taskleiste angeheftet werden, deren Ziel lokal vorliegt, bei externen Verknüpfungen fehlt die Funktion – testbar über das Kontextmenü im Explorer: die Funktionen „an Startmenü anheften“ und „an Taskleiste anheften“ fehlen hier.
    Trifft das möglicherweise bei Dir zu?

    Gruß,
    Bent

  • Steffen H.

    Hallo zusammen,

    das Skript ist ein schöne Lösung für Terminal Server unter 2008R2, leider spuckt es bei uns folgenden Fehler aus:
    Code: 451, Quelle: Laufzeitfehler in Microsoft VBScript, Details: Das Objekt ist keine Auflistung.
    Das Skript liegt ganz normal unter .UserScriptsLogon und die .lnk-Files unter einem Unterordner darin. Den Pfad zu den Verknüpfungen als Skriptparameter habe ich explizit als UNC-Pfad angegeben (\domain.localsysvoldomain.localPolicies….. usw usw )
    Jemand eine Idee dazu?

    Um nicht benötigte Symbole auszublenden behelfen wir uns über folgenden Weg:

    GPO > Computerkonfiguration > Windows-Einstellungen > Sicherheitseinstellungen > Dateisystem

    Dann wählt man die Verknüpfung wie z.B:
    %AllUsersProfile%MicrosoftWindowsStart MenuProgramsAdministrative ToolsServer Manager.lnk

    Bei den nicht benötigten Verknüpfungen wie z.B. Server-Manager und Powershell wird die Gruppe Benutzer aus den Sicherheitseinstellungen entfernt. Somit hat man keine weißen Symbole übrig und der Explorer bleibt erhalten.
    Man kann somit also auch verschiedene Verknüpfungen genauen Gruppen zuordnen, via GPO.

  • michael

    nach einigen windows Updates erhalte ich auch folgenden Fehler:
    Code: 451, Quelle: Laufzeitfehler in Microsoft VBScript, Details: Das Objekt ist keine Auflistung.
    gibts irgendwelche Lösungen??
    danke

  • Alex

    Hallo zusammen,
    super Script. Gibt es auch eine Lösung für Server2012R2? Dort funktioniert das Script leider nicht.

    Gruß Alex

  • Mahir

    Hallo,

    es wäre Toll wenn man noch angeben könnte in welcher Reihenfolge dir Verknüpfungen hinzugefügt werden.
    Ich habe konkret Mozilla Firefox und Windows Explorer als Verknüpfungen erstellt.
    In der Taskleiste tauch leider Mozilla zurerst auf (aplhabetische Reihenfolge?) und dann der Windows Explorer.

    Das Skript funktioniert sonst Super.

    PinTaskBar.vbs könnte eventuell eine ini Datei auslesen in der die Reihenfolge festgelegt ist. z.B.:

    PinTaskBar.ini
    [Order]
    Windows Explorer.lnk
    Mozilla Firefox.lnk

  • Randy

    Hallo,
    Ich habe das Script noch ein bisschen erweitert.
    – Verknüfungen die im Verzeichnis (\FQDNNetlogonTaskbar) aktualiesiert wurden, werden neu angeheftet
    – Alte Vernüfungen die nicht mehr angeheftet sind und werden gelöscht

    Dim objArgs
    Dim objSourceFolder
    Dim objTargetFolder
    Dim objFolderItem, objLNKItem
    Dim Itemverb

    Set objArgs = WScript.Arguments
    Set WSHShell = WScript.CreateObject(„WScript.Shell“)
    Set objEnv = WshShell.Environment(„Process“)
    Set objFSO = CreateObject(„Scripting.FileSystemObject“)
    Set objShell = CreateObject(„Shell.Application“)

    ‚Ist das Argument (Source Folder) vorhanden
    If objArgs.Count > 0 Then

    strSourceFolder = objArgs(0)

    ‚Lokaler Pfad für die Ablage der Verknüpfungen
    strTargetFolder = objEnv(„APPDATA“) & „MicrosoftInternet ExplorerQuick Launch“

    ‚““ wird am Schluss des (Source Folder) angehängt fals noch nicht vorhanden
    If Right(strSourceFolder,1) „“ Then strSourceFolder = strSourceFolder & „“

    Set objSourceFolder = objFSO.GetFolder(strSourceFolder)
    Set objTargetFolder = objFSO.GetFolder(strTargetFolder)

    ‚Erstellen und aktualisieren von Tasklisten Verknüpfungen
    ‚———————————————————
    ‚Iteration des (Source Folder)
    For Each File In objSourceFolder.Files
    Set objSourceFile = objFSO.GetFile(File)

    ‚Schaut ob das File eine Verknüpfung ist
    If Lcase(objFSO.GetExtensionName(objSourceFile)) = „lnk“ Then

    ‚Schaut ob das File im (Target Folder) schon vorhanden ist
    If objFSO.FileExists(strTargetFolder & File.Name) Then
    Set objTargetFile = objFSO.GetFile(strTargetFolder & File.Name)

    ‚Vergleicht das Target File und Source File ob es geändert wurde
    If objSourceFile.DateLastModified objTargetFile.DateLastModified Then
    Set objFolderItem = objShell.Namespace(strTargetFolder)
    Set objLNKItem = objFolderItem.ParseName(File.Name)
    For Each Itemverb In objLNKItem.Verbs
    ‚Wenn der Vergleich positiv ausgefallen ist werden die Verknüpfungen von der Taskliste gelöscht (DEU)
    If Replace(Itemverb.Name, „&“, „“) = „Von Taskleiste lösen“ Then Itemverb.DoIt
    ‚Wenn der Vergleich positiv ausgefallen ist werden die Verknüpfungen von der Taskliste gelöscht (ENG)
    If Replace(Itemverb.Name, „&“, „“) = „Unpin from Taskbar“ Then Itemverb.DoIt
    Next
    ‚Das geänderte (Target File) wird überschrieben
    objFSO.CopyFile strSourceFolder & File.Name, strTargetFolder, TRUE
    End If
    Else
    ‚Das nicht vorhandene (Target File) wird kopiert
    objFSO.CopyFile strSourceFolder & File.Name, strTargetFolder, TRUE
    End If

    Set objFolderItem = objShell.Namespace(strTargetFolder)
    Set objLNKItem = objFolderItem.ParseName(File.Name)
    For Each Itemverb In objLNKItem.Verbs
    ‚Verknüpfung wird (wieder) angeheftet (DEU)
    If Replace(Itemverb.Name, „&“, „“) = „An Taskleiste anheften“ Then Itemverb.DoIt
    ‚Verknüpfung wird (wieder) angeheftet (ENG)
    If Replace(Itemverb.Name, „&“, „“) = „Pin to Taskbar“ Then Itemverb.DoIt
    Next
    End If
    Next

    ‚Löschen von alten Verknüpfungen im „MicrosoftInternet ExplorerQuick Launch“ Verzeichnis
    ‚——————————————————————————————-
    ‚Iteration des (Target Folder)
    For Each File In objTargetFolder.Files
    Set objTargetFile = objFSO.GetFile(File)

    ‚Schaut ob das File eine Verknüpfung ist
    If Lcase(objFSO.GetExtensionName(objTargetFile)) = „lnk“ Then

    Set objFolderItem = objShell.Namespace(strTargetFolder)
    Set objLNKItem = objFolderItem.ParseName(File.Name)
    For Each Itemverb In objLNKItem.Verbs
    ‚Schaut ob das (Target File) an der Taskliste angeheftet ist (DEU)
    If Replace(Itemverb.Name, „&“, „“) = „An Taskleiste anheften“ Then
    ‚Falls das (Target File) nicht an der Taskliste angeheftet ist, wird die Verknüpfung gelöscht
    objFSO.deleteFile(objTargetFile)
    End If
    ‚Schaut ob das (Target File) an der Taskliste angeheftet ist (ENG)
    If Replace(Itemverb.Name, „&“, „“) = „Pin to Taskbar“ Then
    ‚Falls das (Target File) nicht an der Taskliste angeheftet ist, wird die Verknüpfung gelöscht
    objFSO.deleteFile(objTargetFile)
    End If
    Next
    End If
    Next
    End If

  • Bent Schrader

    Hi Randy,

    herzlichen Dank für Deine Arbeit! Ich würde mit Deiner Erlaubnis die Änderungen in mein Skript übernehmen?

    Gruß Bent

Einen Kommentar hinterlassen:

Antispam Bee hat Bent's Blog vor 410.433 Spam-Kommentaren bewahrt.