Pin program to taskbar using PS in Windows 10
Very nice! I made a few small tweaks to that powershell example, I hope you don't mind :)
param ( [parameter(Mandatory=$True, HelpMessage="Target item to pin")] [ValidateNotNullOrEmpty()] [string] $Target)if (!(Test-Path $Target)) { Write-Warning "$Target does not exist" break}$KeyPath1 = "HKCU:\SOFTWARE\Classes"$KeyPath2 = "*"$KeyPath3 = "shell"$KeyPath4 = "{:}"$ValueName = "ExplorerCommandHandler"$ValueData = (Get-ItemProperty ` ("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\" + ` "CommandStore\shell\Windows.taskbarpin") ).ExplorerCommandHandler$Key2 = (Get-Item $KeyPath1).OpenSubKey($KeyPath2, $true)$Key3 = $Key2.CreateSubKey($KeyPath3, $true)$Key4 = $Key3.CreateSubKey($KeyPath4, $true)$Key4.SetValue($ValueName, $ValueData)$Shell = New-Object -ComObject "Shell.Application"$Folder = $Shell.Namespace((Get-Item $Target).DirectoryName)$Item = $Folder.ParseName((Get-Item $Target).Name)$Item.InvokeVerb("{:}")$Key3.DeleteSubKey($KeyPath4)if ($Key3.SubKeyCount -eq 0 -and $Key3.ValueCount -eq 0) { $Key2.DeleteSubKey($KeyPath3)}
Here's Humberto's vbscript solution ported to PowerShell:
Param($Target)$KeyPath1 = "HKCU:\SOFTWARE\Classes"$KeyPath2 = "*"$KeyPath3 = "shell"$KeyPath4 = "{:}"$ValueName = "ExplorerCommandHandler"$ValueData = (Get-ItemProperty("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\" + "Explorer\CommandStore\shell\Windows.taskbarpin")).ExplorerCommandHandler$Key2 = (Get-Item $KeyPath1).OpenSubKey($KeyPath2, $true)$Key3 = $Key2.CreateSubKey($KeyPath3, $true)$Key4 = $Key3.CreateSubKey($KeyPath4, $true)$Key4.SetValue($ValueName, $ValueData)$Shell = New-Object -ComObject "Shell.Application"$Folder = $Shell.Namespace((Get-Item $Target).DirectoryName)$Item = $Folder.ParseName((Get-Item $Target).Name)$Item.InvokeVerb("{:}")$Key3.DeleteSubKey($KeyPath4)if ($Key3.SubKeyCount -eq 0 -and $Key3.ValueCount -eq 0) { $Key2.DeleteSubKey($KeyPath3)}
In windows 10 Microsoft added a simple check before showing the verb. The name of the executable must be explorer.exe. It can be in any folder, just the name is checked. So the easy way in C# or any compiled program would be just to rename your program.
If that's not possible, you can fool the shell object in to thinking your program is called explorer.exe. I wrote a post here on how to do it in C# by changing the Image Path in the PEB.