Windows PowershellのAliasコマンドでハマった。
2023/03/08
Linuxで言うところのshellにalias設定をWindowsで行うことをしたかった。しかしこの設定がWindowsのPowerShellの進化の過程で難しい設定になっていた。1時間位ははまった!でも最後は成功してよかった。
PowerShellのAlias設定は?
一時的な設定と恒久的な設定がある。コマンドは同じだが。とりあえず一時的な設定を案内しよう。
1 2 3 4 5 |
ps> Set-Alias Aliasするコマンド 大本のコマンド 具体例(Windows標準メモ帳をfeコマンドとして呼び出す) ps> Set-Alias fe notepad 設定後 ps> fe vpc-create.yml |
恒久的なPowerShellのAlias設定ファィルの準備
実はこれが大変設定が難しい。1時間もハマって。もうだめかなと諦めかけたがなんとかなりました。どうやらPowerShellの変遷で過去は簡単だったようだが現代の設定は難しい。PowerShellのスクリプトは基本的にデジタル署名しないと実行できない。緩めて使う方法もある。でもそれはやりたくないからデジタル署名を行う。
恒久的なAliasは編集ファイルが変数$profileで確認できる。以下のような感じでパス名を出力してくれます。しかもPowerShellって複数のバージョンを混在できるのでバージョンごとに保存場所が異なる。
1 2 3 |
ps> $profile C:\Users\ichin\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 この上記ファイルは実際にはパスやファィルが存在していないため作成する必要がありました。とりあえず空でOkなので予め作成しておきましょう。 |
PowerShellの実行許可作業はデジタル署名が必要なのだ
自己署名ルート証明書を作成する。これが中々面倒な作業手順オンパレード。PowerShellで実行してください。
1 |
$rootCert = New-SelfSignedCertificate -CertStoreLocation Cert:\CurrentUser\My -DnsName "RootCA" -TextExtension @("2.5.29.19={text}CA=true") -KeyUsage CertSign,CrlSign,DigitalSignature |
次の作業は証明書を PFX ファイルにエクスポートして、後の手順で必要な場所にインポートできるようにする
1 2 3 4 |
[System.Security.SecureString]$rootCertPassword = ConvertTo-SecureString -String "password" -Force -AsPlainText [String]$rootCertPath = Join-Path -Path 'cert:\CurrentUser\My\' -ChildPath "$($rootCert.Thumbprint)" Export-PfxCertificate -Cert $rootCertPath -FilePath 'RootCA.pfx' -Password $rootCertPassword Export-Certificate -Cert $rootCertPath -FilePath 'RootCA.crt' |
RootCA によって署名された、サブジェクト名が “SignedByRootCA” の証明書を作成
1 |
$testCert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "SignedByRootCA" -KeyExportPolicy Exportable -KeyLength 2048 -KeyUsage DigitalSignature,KeyEncipherment -Signer $rootCert |
同様に、署名された証明書を秘密キーと共に PFX ファイルに保存し、公開キーのみを CRT ファイルに保存
1 2 3 |
[String]$testCertPath = Join-Path -Path 'cert:\LocalMachine\My\' -ChildPath "$($testCert.Thumbprint)" Export-PfxCertificate -Cert $testCertPath -FilePath testcert.pfx -Password $rootCertPassword Export-Certificate -Cert $testCertPath -FilePath testcert.crt |
PowerShellスクリプトに署名
これでおしまい。$profileに含まれたパスが恒久的なalias設定するパスなのでそこへ署名します
1 2 3 |
$rootcert = @(Get-ChildItem cert:\CurrentUser\Root -CodeSigningCert)[0] Set-AuthenticodeSignature $profile $rootcert |
Set-Aliasの設定はこんなかんじかな
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
ps> notepad $profile 以降がテキスト編集画面 Set-Alias sublime sublime_text function ff($file){ Get-ChildItem -Recurse -Filter $file } # SIG # Begin signature block # MIIFwwYJKoZIhvcNAQcCoIIFtDCCBbACAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUEPJnJBeh7hYYGCwiPJOS4/P4 途中省略 # QeNUSMuscW5O5vH7qE/FvUOeRxA9QmiRgwtoyQAK0LFnnyXINkK3 # SIG # End signature block |
設定は無事できました。コマンドは省略して使えたので良かった。めでたしめでたし。