ロックダウンされたネットワークやサーバー上で PowerShell モジュールを扱うのは、頭の痛い問題です。インターネットに接続できないサーバー上で SQLServer や PSWindowsUpdate などのモジュールを起動しようとしても、すべてがうまくいかない、という経験はありませんか?そんな時、この問題を解決する方法があります。このガイドでは、PowerShell モジュールをオフラインでインストールする方法(インターネットに頼る必要がない)と、必要に応じてリモートマシンからモジュールをインポートする方法を解説します。つまり、煩わしいネットワーク制限を気にすることなく環境を構築できるということです。もちろん、隔離された環境や厳しい IT ポリシーを扱う際にも非常に便利です。ネットワーク制限に関係なく、必要な場所で適切なモジュールを利用できるようになります。
オフラインのコンピュータに PowerShell モジュールをインストールする方法
まず、インターネットに接続されたマシンからモジュールを取得します
ほとんどのモジュールはPowerShellギャラリー(https://www.powershellgallery.com/)から直接入手されるため、まずはインターネットに接続されたコンピューターにダウンロードすることが重要です。PowerShellのバージョンは5.1以降である必要があります。5.1以降かどうかは、 で確認できます$PSVersionTable. PSVersion。それより古いバージョンだと、互換性の問題が発生する可能性があります。確認が終わったら、次のコマンドでSqlServerなどの必要なモジュールを見つけます。
Find-Module –Name *SqlServer* | Select Name, Version, Repository
このコマンドは、特定のモジュールがギャラリーに存在することを確認するのに役立ちます。確認後、覚えやすいフォルダ(例えば、以下のフォルダ)にダウンロードしてくださいC:\PS。
Save-Module –Name SqlServer –Path C:\PS\
さて、ここからが少し難しいところです。モジュールはすべてのファイルを含むフォルダとしてダウンロードされますが、必ずしもすべての依存関係が含まれているわけではありません。そのため、依存関係がない場合、フォルダをターゲットマシンにコピーするだけでは不十分です。モジュールが正常に動作するために他のモジュールやファイルが必要になる場合があります。しかし、基本的なモジュールであれば、フォルダを正しいパスにコピーするだけで多くの場合問題なく動作します。システムのデフォルトのモジュールパスは通常、以下のとおりです。
- C:\Users\username\Documents\WindowsPowerShell\Modules – 現在のユーザーに合わせてローカライズ
- C:\Program Files\WindowsPowerShell\Modules – すべてのユーザー向け(管理者権限が必要)
- C:\Windows\system32\WindowsPowerShell\v1.0\Modules – 組み込みモジュール
モジュールフォルダ全体をC:\Program Files\WindowsPowerShell\Modules(または、ユーザー専用の場合はユーザーフォルダ)にコピーします。その後、PowerShellがモジュールを認識するかどうかを確認します。
Get-Module -Name SqlServer -ListAvailable
モジュールが表示されれば、準備完了です。次のコマンドでコマンドを一覧できます。
Get-Command -Module SqlServer
これにより、サーバーがインターネットやPowerShellGalleryにアクセスできない場合でも、モジュールをインポートしてオフラインで使用できるようになります。ただし、依存関係のあるモジュールの中には、追加の手順や事前にダウンロードしたモジュールが必要な場合があることにご注意ください。
重要なヒント:
一部の環境では、この方法が最初の試みではうまくいかない場合があります。特に依存関係が欠落している場合やバージョンが一致していない場合は顕著です。PowerShell、または(場合によっては)マシン自体を再起動すると、新しいモジュールが認識されるようになる場合があります。少し風変わりな方法ですが、Windowsではよくあることです。
リモート コンピューターから PowerShell モジュールをインポートする
インストールをスキップし、別のコンピュータからモジュールを借りるだけです
モジュールをローカルにインストールできない場合は、PowerShellリモート処理を使ってリモートマシンから直接読み込むことができます。基本的には、セッションを作成し、リモートで利用可能なモジュールを確認し、必要なコマンドをインポートするだけです。特定のモジュールが時々必要になったり、ローカル環境を混乱させることなくテストを行ったりする場合に便利です。
まず、リモート マシンへの新しいセッションを作成します。
$session = New-PSSession -ComputerName dub-sql1
dub-sql1 をリモートシステムの名前に置き換えてください。接続したら、次のコマンドでそのマシンで利用可能なモジュールを確認できます。
Get-Module -PSSession $session -ListAvailable
モジュールが存在する場合は、次のように現在のセッションにインポートします。
Import-Module -PSSession $session -Name SqlServer
このコマンドは、リモートSQLServerモジュールのすべてのコマンドレットをローカルのPowerShellセッションに読み込みます。その後は、Invoke-Sqlcmdモジュールがローカルにインストールされているかのようにコマンドを実行できます。ただし、実行後はセッションを閉じることを忘れないでください。
Remove-PSSession $session
もう一つの方法は、これらのコマンドをネイティブコマンドと同じように動作させ、セッションを常に管理させたくない場合に、暗黙的なリモート処理を使うことです。これは次のように実行できます。
$session = New-PSSession -ComputerName dub-sql1 Invoke-Command {Import-Module SqlServer} -Session $session Export-PSSession -Session $session -CommandName *-Sql* -OutputModule RemoteSQLServer -AllowClobber Remove-PSSession $session Import-Module RemoteSQLServer
これにより、バックグラウンドでリモート サーバーに接続するローカル モジュールがセットアップされます。これはちょっと巧妙ですが、ホスト マシンに何もインストールせずに SQL サーバー コマンドを実行する場合に非常に便利です。
とにかく、オフラインインストールでもリモートインポートでも、これらの方法は、通常のインターネット接続によるインストールが不可能な場合に役に立ちます。少し手間はかかりますが、壊れた依存関係をいじったり、IT部門がギャラリーを公開するのを待ったりするよりはずっと楽です。