Schriftgröße: +
4 minutes reading time (768 words)

Die ultimative Methode um mit Powershell .lnk Verknüpfung mit Icon zu erzeugen

posh 180x180Mir ist aktuell keine direkte Methode bekannt, mit der man mit einem einzigen Befehl eine Verknüpfung mit Parametern in Powershell erstellen kann. Jedoch kann man Objekte wie das WScript.Shall auch in PowerShell benutzen. Ich erinne mich zumindest wage, dass es in diesem Bereich eine Neuerung gab, konnte aber nichts finden. Hier nun dennoch die ultimativen Powershell Funktionen zur Erstellung von Shortcus. Dabei u.a. auch die Möglichkeit, administrative Shortcuts zu erzeugen, die eine Elevation der Anwendung bewirken. Als Parameter kann ein "ico" Icon File angegeben werden und ansonsetn wird versucht, mit den "Special Folders" zu arbeiten.

Praktisch ist hierbei insbesondere der Befehl „SpecialFolders“, mit dem die Lokation der Verknüpfung automatisch festgelegt werden kann.

  • AllUsersDesktop
  • AllUsersStartMenu
  • AllUsersPrograms
  • AllUsersStartup
  • Desktop
  • Favorites
  • SendTo
  • StartMenu
  • Startup #Autostart

Powershell Create Shortcut Funktion:

 

<#
	.SYNOPSIS
		Create a Shortcut
	.DESCRIPTION
		Create a link based a a spacial folder name
	.PARAMETER  ShortcutFilePath
		relative Path to the SpecialFolder "\appfolder\myapp.lnk" oder simpley "myapp.lnk"
        example LinkLocation = Desktop: ..\Desktop\appfolder\myapp.lnk"
	.PARAMETER  linklocation
		;andatory, a SpecialFolder name "Desktop","StartMenu" etc.
    .PARAMETER TargetPath
        Mandatory, Path to a exe or batch file etc.
    .PARAMETER Hotkey
        Optional, a Hotkey to start. Example : "CTRL+F"
    .PARAMETER WindowsStyle
        Optional
        1 - Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position.
        3 - Activates the window and displays it as a maximized window. 
        7 - Minimizes the window and activates the next top-level window.
    .PARAMETER IconLocation
        Path to the icon file and Icon Number. Example: "C:\Windows\system32\shell32.dll, 1"
   .PARAMETER Arguments
       Optional, command line arguments. Example: /c echo hallo
   .PARAMETER WorkingDirectory
        Optional, execution path of the script or exe
    .PARAMETER $Description
        Optional, a description of your shortcut
    .PARAMETER UACAdmin
        Optinal, run the shortcut as administrator
	.EXAMPLE
        Create a administrative shortcut for notepad.exe in the folder lalula on the Desktop
        Create-Shortcut -ShortcutFilePath "lalula\test2.lnk" -linklocation Desktop -TargetPath c:\Windows\notepad.exe -UACAdmin:$true

    .AUTOR
        Andreas Nick' 2016
#>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [String]$ShortcutFilePath,
        [ValidateSet("AllUsersDesktop", "AllUsersStartMenu", "AllUsersPrograms", "AllUsersStartup", "Desktop", "Favorites", "SendTo", "StartMenu", "Startup")]
        [Parameter(Mandatory = $true)]
        [String]$linklocation,
        [Parameter(Mandatory = $true)]
        [string]$TargetPath,
        [String]$Hotkey = "",
        [ValidateSet("1", "3", "7")]
        [String]$WindwosStyle = "1",
        [String]$IconLocation = "",
        [String]$Arguments = "",
        [String]$WorkingDirectory = "",
        [String]$Description = "",
        [switch]$UACAdmin = $false
    )
    
    process
    {
        write-host "Test"
        
        If (-not ($ShortcutFilePath -match "\.lnk$"))
        {
            Write-Verbose $('Error: Illigal Shortcut' +  "$ShortcutFilePath"+ ' - a shortcut ends with .lnk')
            throw 'Error: Illigal Shortcut' +  "$ShortcutFilePath"+ ' - a shortcut ends with .lnk'
            
        }
        
        
        
        [System.IO.FileInfo] $DestinationPath = [environment]::getfolderpath("$linklocation") + '\' + $ShortcutFilePath
        
        #Check The Path
        
        if (-not (test-path (Split-Path $DestinationPath.FullName -Parent)))
        {
            new-item  -Type Directory  -Path (Split-Path $DestinationPath.FullName -Parent)
        }

        #Create a new shortcut for computers or users.
        $WshShell = New-Object -ComObject WScript.Shell
        $Shortcut = $WshShell.CreateShortcut($DestinationPath.FullName)
        $Shortcut.TargetPath = "$TargetPath"
        $Shortcut.Arguments = $Arguments
        $Shortcut.Description = $Description
        $Shortcut.HotKey = $HotKey
        $Shortcut.WorkingDirectory = $WorkingDirectory
        $Shortcut.WindowStyle = $WindwosStyle
        
        if ($IconLocation -eq "")
        {
            $Shortcut.IconLocation = "C:\Windows\system32\shell32.dll, 17"
        }
        else
        {
            $Shortcut.IconLocation = $IconLocation
        }
        
        try
        {
            $Shortcut.Save()
            if ($UACAdmin)
            {
                [byte[]]$bytes = [System.IO.File]::ReadAllBytes("$DestinationPath")
                $bytes[0x15] = $bytes[0x15] -bor 0x20
                [System.IO.File]::WriteAllBytes("$DestinationPath", $bytes)
            }
        }
        Catch
        {
            Write-Verbose "Cannot create the shortcut $($DestinationPath.FullName)" -Verbose
            Write-Verbose $Error[0].Exception.Message -Verbose
            Return $False
        }
    }

 

Hier noch einmal die gleiche Funktion für Web-Shortcuts:

 

<#
	.SYNOPSIS
		Create a Shortcut
	.DESCRIPTION
		Create a link based a a spacial folder name
	.PARAMETER  ShortcutFilePath
		relative Path to the SpecialFolder "\appfolder\myapp.lnk" oder simpley "myapp.lnk"
        example LinkLocation = Desktop: ..\Desktop\appfolder\myapp.lnk"
	.PARAMETER  linklocation
		;andatory, a SpecialFolder name "Desktop","StartMenu" etc.
    .PARAMETER TargetPath
        Mandatory, Path to a exe or batch file etc.
    .PARAMETER Hotkey
        Optional, a Hotkey to start. Example : "CTRL+F"
    .PARAMETER IconLocation
        Path to the icon file and Icon Number. Example: "C:\Windows\system32\shell32.dll, 1"
    .PARAMETER $Description
        Optional, a description of your shortcut

	.EXAMPLE
        Create-WebShortcut -ShortcutFilePath "heise.lnk" -linklocation Desktop -TargetPath http://www.heise.de

    .AUTOR
        Andreas Nick' 2016
#>

function Create-WebShortcut
{
    #[CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [String]$ShortcutFilePath,
        [ValidateSet("AllUsersDesktop", "AllUsersStartMenu", "AllUsersPrograms", "AllUsersStartup", "Desktop", "Favorites", "SendTo", "StartMenu", "Startup")]
        [Parameter(Mandatory = $true)]
        [String]$linklocation,
        [Parameter(Mandatory = $true)]
        [string]$TargetPath,
        [String]$Hotkey = "",
        [String]$IconLocation = "C:\Program Files\Internet Explorer\iexplore.exe, 0",
        [String]$Description = ""
    )
    
    
    process
    {
        
        If (-not ($ShortcutFilePath -match "\.lnk$"))
        {
            Write-Verbose $('Error: Illigal Shortcut' + "$ShortcutFilePath" + ' - a shortcut ends with .lnk')
            throw 'Error: Illigal Shortcut' + "$ShortcutFilePath" + ' - a shortcut ends with .lnk'
            
        }
        
        [System.IO.FileInfo]$DestinationPath = [environment]::getfolderpath("$linklocation") + '\' + $ShortcutFilePath
        
        #Check The Path
        
        if (-not (test-path (Split-Path $DestinationPath.FullName -Parent)))
        {
            new-item -Type Directory -Path (Split-Path $DestinationPath.FullName -Parent)
        }
        
        
        #Create a new shortcut for computers or users.
        $WshShell = New-Object -ComObject WScript.Shell
        $Shortcut = $WshShell.CreateShortcut($DestinationPath.FullName)
        $Shortcut.TargetPath = "$TargetPath"
        $Shortcut.IconLocation = $IconLocation
        $Shortcut.Description = $Description
        $Shortcut.HotKey = $HotKey
        
        try
        {
            $Shortcut.Save()
        }
        Catch
        {
            Write-Verbose "Cannot create the web shortcut $($DestinationPath.FullName)" -Verbose
            Write-Verbose $Error[0].Exception.Message -Verbose
            Return $False
        }
    }
}

 

 

 

×
Stay Informed

When you subscribe to the blog, we will send you an e-mail when there are new updates on the site so you wouldn't miss them.

Prüfung der sicheren Verbindungen im Kaspersky Int...
Shortcut Management mit App-V zur Bereitstellung v...

Ähnliche Beiträge

 

Kommentare 1

Gäste - Ich am Mittwoch, 22. Juli 2020 13:35

Hi,
super Ding, ich wollte mich gerade daran setzen und genau sowas schreiben.

P.S.
Putzig finde ich den Variablennnamen: $WindwosStyle[/u]

Hi, super Ding, ich wollte mich gerade daran setzen und genau sowas schreiben. P.S. Putzig finde ich den Variablennnamen: $WindwosStyle[/u] [i][/i]
Bereits registriert? Hier einloggen
Donnerstag, 18. April 2024

Sicherheitscode (Captcha)

Nick Informationstechnik GmbH
Dribusch 2
30539 Hannover

+49 (0) 511 165 810 190
+49 (0) 511 165 810 199

infonick-it.de

Newsletter

Anmeldung zum deutschen M.A.D. Newsletter mit Informationen zur Anwendungsvirtualisierung!

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.