Public/New-Shortcut.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function New-Shortcut{
  param(
    [Parameter(Mandatory)]
    [ValidateScript({
          if (-not(Test-Path -Path $_)) {
            throw '{0} - Invalid -Target' -f $_
          }
          return $true
    })]
    [String]$Target,
    [Parameter(Mandatory)]
    [ValidateScript({
          if (-not(Test-Path -Path $_ -IsValid)) {
            throw '{0} - ShortcutFile Path is Invalid' -f $_
          }
          if(-not (Test-Path -Path $_)) {
            throw '{0} already exists' -f $_
          }
          if(-not ($_ -match '[.lnk]')) {
            throw '{0} must end in .lnk' -f $_
          }
          return $true
    })]
    [String]$ShortcutFile,
    [string]$Arguments,
    [switch]$RunAsAdmin
  )
  begin{
    $WScriptShell = New-Object -ComObject WScript.Shell
  }
  process{
    $Shortcut = $WScriptShell.CreateShortcut($ShortcutFile)
    $Shortcut.TargetPath = $Target
    if ($Arguments) {$Shortcut.Arguments = $Arguments}
    $Shortcut.Save()
    Write-Verbose -Message 'Shortcut Saved'# -Verbose:$VerbosePreference

    if($RunAsAdmin) {
      $Bytes = [System.IO.File]::ReadAllBytes($ShortcutFile)
      $Bytes[0x15] = $Bytes[0x15] -bor 0x20
      [System.IO.File]::WriteAllBytes($ShortcutFile, $Bytes)
      Write-Verbose -Message ('{0} - Set to Run as Admin' -f $ShortcutFile)# -Verbose:$VerbosePreference
    }
  }
}