none
Powershell Script RRS feed

  • Frage

  • Hallo,
    ich möchte über ein PS Scipt die Pinned Apps für die Benutzer auf einem RDS setzten. Ich möchte die Default Pinned Apps Powershell und Servermanager entfernen und Outlook und Word hinzufügen.

    Hierzu habe ich folgednen Blog Eintrag gefunden http://gallery.technet.microsoft.com/ScriptCenter/en-us/b66434f1-4b3f-4a94-8dc3-e406eb30b750
    Ich habe nun eine PinnedApplications.psm1 (mit dem im Link angegebenen Code) erstellt und die folgenden Befehle in ein .ps1 Script gesetzt:

    Import-Module C:\Customizing\Script\PinnedApplications.psm1
    Set-PinnedApplication -Action UnPinFromTaskbar -FilePath "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
    Set-PinnedApplication -Action UnPinFromTaskbar -FilePath "C:\Windows\System32\ServerManager.msc"

    Ich kann sehen, dass das Modul PinnedApplications.psm1 importiert wurde und die ExecutionPolicy sitzt auf unrestricted.
    Führe ich das ps1 Script aus bekomme ich die Fehlermeldung:
    Verb Von Taskleiste lösen not found.
    Bei C:\Customizing\Script\PinnedApplications.psm1:65 Zeichen:9
    +             throw <<<<  "Verb $verb not found."
        + CategoryInfo          : OperationStopped: (Verb Von Taskleiste lösen not found.:String) [], RuntimeException
        + FullyQualifiedErrorId : Verb Von Taskleiste lösen not found.

    Kann mir hier jemand helfen?

    Gruß Holger

    Mittwoch, 3. November 2010 13:40

Antworten

  • Dachte ichs mir doch. :) Kleiner Tip, Änderungen immer erstmal auf ner Kiste ohne GPOs probieren, dann GPOs scharfschalten und sehen was passiert. Spart man sich ne menge Arbeit und Forenpostings. :)

    Was die den Fehler betrifft, gibt diverse Möglichkeiten, z.b. du kannst einfach zu Beginn des Skriptes

    $script:ErrorActionPreference = "silentlyContinue"

    einfügen, dann werden alle Fehler unterdrückt. Oder du spezifizierst mit einer Trap, was bei einem Fehler geschehen soll, z.b.

    trap {
    write-host ("Fehler:"+$_.exception.message)
    # oder was auch immer du bei einem Fehler machen willst #
    }

    die Trap kann irgendwo im script stehen, sie gilt trotzdem für das ganze script.

    Grüße, Denniver

    Freitag, 5. November 2010 15:27
    Moderator

Alle Antworten

  • Hallo,

    poste doch bitte mal die PinnedApplications.psm1.

    Grüße, Denniver

    Donnerstag, 4. November 2010 00:10
    Moderator
  • Hallo Denniver,

    hier die .psm1

     ###########################################################################"
     # 
     #
     # NAME: PinnedApplications.psm1
     # 
     # AUTHOR: Jan Egil Ring, Crayon
     #
     # DATE : 06.08.2010 
     # 
     # COMMENT: Module with the ability to pin and unpin programs from the taskbar and the Start-menu in Windows 7 and Windows Server 2008 R2.
     #
     # This module are based on the Add-PinnedApplication script created by Ragnar Harper and Kristian Svantorp:
     # http://blogs.technet.com/kristian/archive/2009/04/24/nytt-script-pin-to-taskbar.aspx
     # http://blog.crayon.no/blogs/ragnar/archive/2009/04/17/pin-applications-to-windows-7-taskbar.aspx
     #
     # Johan Akerstrom`s blog: http://cosmoskey.blogspot.com
     #
     # For more information, see the following blog post:
     # http://blog.crayon.no/blogs/janegil/archive/2010/02/26/pin-and-unpin-applications-from-the-taskbar-and-start-menu-using-windows-powershell.aspx
     #
     # VERSION HISTORY:
     # 1.0 17.04.2009 - Initial release by Ragnar Harper and Kristian Svantorp
     # 1.1 26.02.2010 - Update by Jan Egil Ring. Added the capability to unpin applications.
     # 1.2 06.08.2010 - Update by Johan Akerstrom. Added full MUI support.
     # 
     ###########################################################################"
    
    
    function Set-PinnedApplication
    {
    <# 
    .SYNOPSIS 
    This function are used to pin and unpin programs from the taskbar and Start-menu in Windows 7 and Windows Server 2008 R2
    .DESCRIPTION 
    The function have to parameteres which are mandatory:
    Action: PinToTaskbar, PinToStartMenu, UnPinFromTaskbar, UnPinFromStartMenu
    FilePath: The path to the program to perform the action on
    .EXAMPLE
    Set-PinnedApplication -Action PinToTaskbar -FilePath "C:\WINDOWS\system32\notepad.exe"
    .EXAMPLE
    Set-PinnedApplication -Action UnPinFromTaskbar -FilePath "C:\WINDOWS\system32\notepad.exe"
    .EXAMPLE
    Set-PinnedApplication -Action PinToStartMenu -FilePath "C:\WINDOWS\system32\notepad.exe"
    .EXAMPLE
    Set-PinnedApplication -Action UnPinFromStartMenu -FilePath "C:\WINDOWS\system32\notepad.exe"
    #> 
      	[CmdletBinding()]
      	param(
       [Parameter(Mandatory=$true)][string]$Action, 
    	 [Parameter(Mandatory=$true)][string]$FilePath
      	)
      	if(-not (test-path $FilePath)) { 
      		throw "FilePath does not exist." 
    	}
      
      	function InvokeVerb {
      		param([string]$FilePath,$verb)
    		$verb = $verb.Replace("&","")
    		$path= split-path $FilePath
    		$shell=new-object -com "Shell.Application" 
    		$folder=$shell.Namespace($path)  
    		$item = $folder.Parsename((split-path $FilePath -leaf))
    		$itemVerb = $item.Verbs() | ? {$_.Name.Replace("&","") -eq $verb}
    		if($itemVerb -eq $null){
    			throw "Verb $verb not found."			
    		} else {
    			$itemVerb.DoIt()
    		}
      		
      	}
    	function GetVerb {
    		param([int]$verbId)
    		try {
    			$t = [type]"CosmosKey.Util.MuiHelper"
    		} catch {
    			$def = [Text.StringBuilder]""
    			[void]$def.AppendLine('[DllImport("user32.dll")]')
    			[void]$def.AppendLine('public static extern int LoadString(IntPtr h,uint id, System.Text.StringBuilder sb,int maxBuffer);')
    			[void]$def.AppendLine('[DllImport("kernel32.dll")]')
    			[void]$def.AppendLine('public static extern IntPtr LoadLibrary(string s);')
    			add-type -MemberDefinition $def.ToString() -name MuiHelper -namespace CosmosKey.Util			
    		}
    		if($global:CosmosKey_Utils_MuiHelper_Shell32 -eq $null){		
    			$global:CosmosKey_Utils_MuiHelper_Shell32 = [CosmosKey.Util.MuiHelper]::LoadLibrary("shell32.dll")
    		}
    		$maxVerbLength=255
    		$verbBuilder = new-object Text.StringBuilder "",$maxVerbLength
    		[void][CosmosKey.Util.MuiHelper]::LoadString($CosmosKey_Utils_MuiHelper_Shell32,$verbId,$verbBuilder,$maxVerbLength)
    		return $verbBuilder.ToString()
    	}
    
    	$verbs = @{ 
    		"PintoStartMenu"=5381
    		"UnpinfromStartMenu"=5382
    		"PintoTaskbar"=5386
    		"UnpinfromTaskbar"=5387
    	}
      	
    	if($verbs.$Action -eq $null){
      		Throw "Action $action not supported`nSupported actions are:`n`tPintoStartMenu`n`tUnpinfromStartMenu`n`tPintoTaskbar`n`tUnpinfromTaskbar"
    	}
    	InvokeVerb -FilePath $FilePath -Verb $(GetVerb -VerbId $verbs.$action)
    }
    
    Export-ModuleMember Set-PinnedApplication

    Vielen Dank

    Gruß Holger

    Donnerstag, 4. November 2010 08:09
  • Also bei mir funktionierts problemlos.

    Mich irritiert die Fehlermeldung "Verb Von Taskleiste lösen not found." Also würde aus "UnPinFromTaskbar" "Von Taskleiste lösen" gemacht, was die korrekte übersetzung wäre. Kann ich mir gerade keinen Reim drauf machen, hast du's auch mal lokal auf nem Rechner getestet?

     

    Grüße, Denniver

    Donnerstag, 4. November 2010 14:35
    Moderator
  • bei mir auf meinem Win7 klappt es auch.
    starte ich das script aber auf einem RDS 2008 R2 kommt die Fehlermeldung. Ich möche mit dem Script dem Benutzer die standardmäßig vorhanden Pinned Apps Server Manager und PowerShell entfernen. Der RDS ist in englisch und hat MUI Packs installiert u.a. auch deutsch.

    Gruß Holger

    Donnerstag, 4. November 2010 14:41
  • Ich habe mir mal die $Verb -Inhalte raus schreiben lassen während das Script läuft. Aus der action "unpinfromtaskbar" wird (auf ner deutschen Maschine) scriptintern dann tatsächlich "von Taskleiste lösen". Da das lokal funktioniert, ist das offensichtlich die falsche Fährte.

    Ich habs ausserdem mal auf nem 2008R2 via RDP probiert, ging auch einwandfrei. Wie führst du das Script denn auf dem Terminalserver aus? Sind dort GPOs aktiv?

     

    Grüße, Denniver

    Donnerstag, 4. November 2010 15:14
    Moderator
  • ich starte PS und rufe das script direkt aus dem Unterordner Custom\Script auf (als Admin). GPOs sind aktiv. Ich kann es leider erst morgen ohne GPO testen...

    Gruß

    Donnerstag, 4. November 2010 15:20
  • Hallo Denniver,

    es liegt wohl an den GPOs da ich es auf einer Testmaschine ebenfalls ausführen konnte. Ich werde mir die GPOs jetzt mal anschauen.

    Aber vielleicht kann ich noch eine kurze Frage anfügen :-)
    Was passiert eigendlich, wenn z.B. das Script eine Vernküpfung entfernen möchte, die es gar nicht mehr gibt (weil es z.B. zweimal gestartet wurde). Läuft es dann weiter oder bricht es ab. Ich habe es einmal versucht zu simulieren und habe das Gefühl das es abbricht (also es bricht ab... bin mir aber nicht sicher ob es am Script liegt oder ob dies der Standard bei der PS ist). Leider bin ich (wie du sicherlich gemerkt hast) nicht so tief in der PS drin. Kann man in der PS so eine Art resume on error setzten?

    Gruß Holger

    Freitag, 5. November 2010 13:57
  • Dachte ichs mir doch. :) Kleiner Tip, Änderungen immer erstmal auf ner Kiste ohne GPOs probieren, dann GPOs scharfschalten und sehen was passiert. Spart man sich ne menge Arbeit und Forenpostings. :)

    Was die den Fehler betrifft, gibt diverse Möglichkeiten, z.b. du kannst einfach zu Beginn des Skriptes

    $script:ErrorActionPreference = "silentlyContinue"

    einfügen, dann werden alle Fehler unterdrückt. Oder du spezifizierst mit einer Trap, was bei einem Fehler geschehen soll, z.b.

    trap {
    write-host ("Fehler:"+$_.exception.message)
    # oder was auch immer du bei einem Fehler machen willst #
    }

    die Trap kann irgendwo im script stehen, sie gilt trotzdem für das ganze script.

    Grüße, Denniver

    Freitag, 5. November 2010 15:27
    Moderator
  • schon klar aber manchmal sieht man den Wald vor lauter Bäumen nicht..... :-)

    noch eine finale Frage zu dem Trap. Muss ich dies definieren

    trap {
    write-host ("Fehler:"+$_.exception.message)
    # oder was auch immer du bei einem Fehler machen willst #
    }

    oder kann ich einfach nichts eintragen, wenn ich keine Benachrichtigung möche?

    Merci und schönes Wochenende 

    Gruß Holger

    Freitag, 5. November 2010 15:32
  • Wenn du die Ausgabe unterdrücken willst, nimm die erste Variante. Mit Trap... mhm also  Powershell unterscheidet zwischen abbrechenden Fehlern und nichtabbrechenden Fehlern. Mit Trap kannst du abbrechende Fehler abfangen und nicht-abbrechende Fehler zu abbrechenden machen. Es gibt auch noch diverse Optionen, was bei einem Fehler passieren soll. Ist ein längeres Thema, wenn du möchtest lies doch mal über Trap, Throw, Ty-Catch-Finally.

    Grüße, Denniver

    Freitag, 5. November 2010 15:44
    Moderator