PowerShellを実行するショートカットファイルを作成する

WindowsでPowerShellスクリプトをダブルクリックして実行することは標準設定ではセキュリティ上の考慮から出来なくなっている。

しかし運用管理ツール等はバッチファイルからPowerShellスクリプトに移行しつつある(少なくとも移行したらかなり高度なことができるようになる)が、実行のさせ方が課題になる。
この課題を解決する一つの方法として、PowerShell.exeに引数でコマンドを指定した状態のショートカットファイルを作ることが考えられる。
ちょっと前に流行したマルウェアがこの方法で実現されていた。

function New-PowerShellShortcut() {
    Param(
        [Parameter(Mandatory = $true, Position = 1)]
        [string] $Destination,

        [Parameter(Mandatory = $true, Position = 2)]
        [ScriptBlock] $ScriptBlock,

        [Parameter(Mandatory = $false, Position = 3)]
        [string] $IconFilePath = [string]::Empty
    );

    $bytes = [Text.Encoding]::Unicode.GetBytes($ScriptBlock.ToString());
    $b64str = [Convert]::ToBase64String($bytes);

    $objShell = New-Object -ComObject "WScript.Shell";
    $objShortcut = $objShell.CreateShortcut($Destination);
    $objShortcut.TargetPath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"; # 実行させるPowerShell.exeへのパスをここで指定
                                                                                           # 例えば64bit環境で32bit PowerShellを指定したい場合にはここを変更する

    $arrArg = @();
    $arrArg += "-ExecutionPolicy ByPass";
    $arrArg += "-STA";
    $arrArg += "-EncodedCommand {0}" -F $b64str;
    $objShortcut.Arguments = ($arrArg -join " ");

    if([string]::Empty -ne $IconFilePath -and $null -ne $IconFilePath) {
        $objShortcut.IconLocation = $IconFilePath;
    }

    $objShortcut.Save();
    $code;
    $b64str;

    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objShortcut) | Out-Null;
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objShell) | Out-Null;

    return;
}
Export-ModuleMember -Function "New-PowerShellShortcut";

例えばこんな感じのモジュールを準備しておくことで

$code = {
  Add-Type -TypeName "System.Windows.Forms" | Out-Null;
  [System.Windows.Forms.MessageBox]::Show("Hello, World.") | Out-Null;
}

Import-Module -Name "MyPowerShellShortcutTool" -Force; # 今回作成したモジュールの名前例
New-PowerShellShortcut -Destination $Env:USERPROFILE -ScriptBlock $code;

とすることで、ダブルクリックからコードを実行できるショートカットファイルを作ることができる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です