認証プロキシ・管理者権限無しでPowershellモジュールをインストールする

認証プロキシ配下で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にはあまり関係はないんですが、実際に動かそうとするとエラーが発生するので最新版に上げておいたほうが良いです。

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

get-item 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'

Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4

Name                           Property

----                           --------
Full                           Version       : 4.7.03062
                               CBS           : 1

                               TargetVersion : 4.0.0
                               Install       : 1

                               InstallPath   : C:\Windows\Microsoft.NET\Framework64\v4.0.30319\

                               Servicing     : 0

                               Release       : 461814

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

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

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

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

$PSVersionTable
Name                           Value
----                           -----

PSVersion                      5.1.14409.1018

PSEdition                      Desktop

PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}

BuildVersion                   10.0.14409.1018

CLRVersion                     4.0.30319.42000

WSManStackVersion              3.0

PSRemotingProtocolVersion      2.3

SerializationVersion           1.1.0.1

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

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

プロキシを設定する

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

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

$SystemProxy = [System.Net.WebRequest]::GetSystemWebProxy() 
#get WebProxy information form system setting

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

$Proxy = $SystemProxy
[System.Net.WebRequest]::DefaultWebProxy = $Proxy

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

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

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

#access point for Install-PackageProvider

$URL = "https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409"


#get proxy URI for $URL

$ProxyUri = $SystemProxy.GetProxy($URL)
$Proxy = New-Object system.net.webproxy($ProxyUri)
[System.Net.WebRequest]::DefaultWebProxy = $Proxy

Proxy認証に対応する

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

$Proxy.UseDefaultCredentials = $true

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

$proxyCredntial = Get-Credential -Message "Input Proxy User/Password”

$Proxy.Credentials = $proxyCredntial

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

[System.Net.WebRequest]::DefaultWebProxy =$Proxy

Security Protocolを設定する

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

[Net.ServicePointManager]::SecurityProtocol

<#
Ssl3, Tls
#>

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

[Net.ServicePointManager]::SecurityProtocol += [Net.SecurityProtocolType]::Tls12

通信を確認する

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

$URL = "https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409"

Invoke-WebRequest $URL



StatusCode        : 200
....

PSGalleryを確認する

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

 Get-PSRepository

Name                      InstallationPolicy   SourceLocation                                                                    
----                      ------------------   --------------                                                                    
PSGallery                 Untrusted            https://www.powershellgallery.com/api/v2

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

Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

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

PackageProviderを設定する

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

Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Scope CurrentUser

Name                           Version          Source           Summary
-------          ------           -------

nuget                          2.8.5.208        https://onege... NuGet provider for the OneGet meta-package manager

PSRepositoryを設定する

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

Register-PSRepository -Default -InstallationPolicy Trusted

Get-PSRepository

Name                      InstallationPolicy   SourceLocation                                                                    
----                      ------------------   --------------                                                                    
PSGallery                 Trusted            https://www.powershellgallery.com/api/v2

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

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

Install-Module MicrosoftTeams -Scope CurrentUser

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

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

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

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

Importする

Import-Module MicrosoftTeams -Force

ImportしたModuleを使う

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

Connect-MicrosoftTeams

Account      : user01@tenant-name.onmicrosoft.com

Environment  : AzureCloud

Tenant       : ########-####-####-####-############

TenantId     : ########-####-####-####-############

TenantDomain : tenant-name.onmicrosoft.com



Get-Team -User $user

Get-TeamUser -GroupId (Get-Team -User $user).GroupId

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に対象モジュールを変えてます。

“認証プロキシ・管理者権限無しでPowershellモジュールをインストールする” に対して3件のコメントがあります。

コメントを残す

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

CAPTCHA


This site uses Akismet to reduce spam. Learn how your comment data is processed.