Install module from PSGallery behind authentication proxy without administrator privileges

認証プロキシ配下でAdministrator権限なしでPowershell Module を導入する方法

コロナですね。勘弁してほしいですね。
4月以降、今まで「出張時の一時利用」みたいなvmware上のWindwsデスクトップ(いわゆるVDI)を常用する羽目に成りまして。なおかつMicrosoft365を活用するぞー!とか話が飛んできまして。そんな状況下でMicrosoft365の管理モジュールを導入するまでの方法をご紹介します。

条件

  • PowershellでPSGelleryからModuleをInstallしてつかいたい
  • WindowsのデスクトップOSを使う
  • Proxyがある。しかも認証Proxy(凶悪)
  • 管理者権限がなく、End User権限である
    →インストールができない
    →Powershellファイルの実行権限がない
    →PackageProviderがない
    →PSRepositoryももちろんない
  • ログインするたびに設定が全て元に戻る(!!!)

これ無理ゲーじゃね?なんのしばりプレイなん?

しばりプレイとは?-ニコニコ大百科より-

結果、落ちそうな落とし穴全部落ちたので、他の人の参考になりそうなので公開します。

やりたかったのは「MicrosoftTeamsで自分の所有Teamのメンバーを一覧で取得したい」。
ただ、これだけのはずだったんだ…。

事前準備

.NetFramworkを確認する

Installにはあまり関係はないんですが、実際に動かそうとするとエラーが発生するので最新版に上げておいたほうが良いです。

バージョンは下記コマンドで取れます。

最新バージョンは下記のMicrosoft公式を見てください。

.NET Frameworkインストール ガイド

Powershellのバージョンを確認する

Windows OSだと当面5.1が最新バージョンになると思います。それ以降はLinuxやMacOSでも使える.net coreベースのPowershellに移行していくつもりらしいので。

この5.1が結構問題でして、PSRepository関係のコマンドレットがネットワーク接続を要求するくせにProxyオプションに対応してなかったり(Get-PSRepository)、Proxyオプションに対応しているように見せかけて暗号化したパスワードが通らなかったり(Register-PSRepository)とか、産廃送りにすべきレベルの地雷の連発なんです。

Powershell 7.0に上げれば解決するという情報もありますがそこは自分で解決できませんし、まだ7.0も完全互換性はなさそうで他の問題もおこったりするので5.1で解決を試みます。

プロキシを設定する

Powershell5.1のコマンドレットは認証プロキシに対応していないものがあるので、Powershell自体に対応させます。CMDのset HTTPと同じです。原点回帰ですね(白目

Proxyを必要とする環境の方はインターネットコントロールパネルに設定してあるのではないでしょうか。まずはシステムに設定してあるProxy情報を引っ張ってやります。

Proxyを直接指定している場合は、これをPowershellの環境に設定すれば動きます。

自動構成スクリプト(.pac)で設定されている場合は、.pacへの参照になっているだけでProxyの設定は取れてないです。

自動構成スクリプトは、接続元/先別のProxy負荷分散だったり社内/社外の振り分けだったりをjavascriptでやっているものです。ですから、接続先を指定して.pac参照に問い合わせすると解決します。

Provider listの問い合わせ先はhttps://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409 です。これに対するProxy Uriを取得してProxy Objectを作ります。

Proxy認証に対応する

Proxyだけだったらまだ良いのですが、認証を要求する場合さらにやっかいなのです…。
統合認証ができる場合はこれで済むようです。

個別認証の場合は、認証情報を作る必要があります。

一応、再指定しておきます。

Security Protocolを設定する

PowershellのDefaultのSecurity ProtocolはSSL3.0,TSL1.0です。

これは脆弱性が指摘されているので、2020年5月頃からTSL1.2を要求するようです。[Net.SecurityProtocolType]::Tls12 を追加します。

通信を確認する

ここまでやれば通信ができるはずです。statuscodeで200(成功)が返って来ることを確認してください。

PSGalleryを確認する

PSGalleryを確認しましょう。Get-PSRepositoryで下記が返ってきたら登録があります。

Untrustedになっているので、このままだとInstall時にいちいち聞かれるのでTrustedに変えましょう。

パッケージソースが見つかりません、と返ってきてしまったら自分で設定しないといけません

PackageProviderを設定する

まずは、NuGetが必要なのでInstall-PackageProviderを実行します。

PSRepositoryを設定する

次にPSRepositoryを-Defaultで実行します。Trustedにして構わないと思います。

Moduleを現在のUserのみにインストールする

なんか書ききった感があるのですが、本番はこれからです😓
冒頭に書いたとおり、管理者権限がありません。なので普通にInstall-Moduleを走らせるとコケます。そういった場合、ScopeをCurrentUserにすると解決します。

こうすると、userのDocuments\WindowsPowerShell\Modulesに入ります。

現在のUserの実行権を設定する

Importすると.psd1ファイルが実行されます。ファイルの実行権がないことがあるので、これもCurrentUserに許可しておきましょう。

Importする

ImportしたModuleを使う

MicrosoftTeamsのモジュールが使えるように成りました。

Get-Team -User $userで、$user が所有しているチームの情報が取れます。

取れたGroupIDでTeamUserの情報が取得できます。

いずれも$userがOwnerである必要がありますが、下記も管理者権限がなくても動くようです。

Add-TeamUser
Remove-TeamUser
Get-TeamChannel
New-TeamChannel
Set-TeamChannel
Remove-TeamChannel

まとめ

  • ProxyをPowershellに設定する
  • Security Protcolを追加する
  • 実行権をUser Scopeで付与する
  • PSRepositoryを-Defaultで登録

つなげたものをgithubに置きました。
ModuleNameをパラメタにしてあるので、引数に指定すれば他のModuleで実行できます。
Testのためimportexcelに対象モジュールを変えてます。

Install module from PSGallery behind authentication proxy without administrator privileges” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください