認証プロキシ・管理者権限無しで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にはあまり関係はないんですが、実際に動かそうとするとエラーが発生するので最新版に上げておいたほうが良いです。
バージョンは下記コマンドで取れます。
1 2 3 4 5 6 7 8 9 10 11 |
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公式を見てください。
Powershellのバージョンを確認する
Windows OSだと当面5.1が最新バージョンになると思います。それ以降はLinuxやMacOSでも使える.net coreベースのPowershellに移行していくつもりらしいので。
1 2 3 4 5 6 7 8 9 10 11 |
$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情報を引っ張ってやります。
1 2 |
$SystemProxy = [System.Net.WebRequest]::GetSystemWebProxy() #get WebProxy information form system setting |
Proxyを直接指定している場合は、これをPowershellの環境に設定すれば動きます。
1 |
$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を作ります。
1 2 3 4 |
#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だけだったらまだ良いのですが、認証を要求する場合さらにやっかいなのです…。
統合認証ができる場合はこれで済むようです。
1 |
$Proxy.UseDefaultCredentials = $true |
個別認証の場合は、認証情報を作る必要があります。
1 2 |
$proxyCredntial = Get-Credential -Message "Input Proxy User/Password”
$Proxy.Credentials = $proxyCredntial |
一応、再指定しておきます。
1 |
[System.Net.WebRequest]::DefaultWebProxy =$Proxy |
Security Protocolを設定する
PowershellのDefaultのSecurity ProtocolはSSL3.0,TSL1.0です。
1 2 |
[Net.ServicePointManager]::SecurityProtocol
<#
Ssl3, Tls
#> |
これは脆弱性が指摘されているので、2020年5月頃からTSL1.2を要求するようです。[Net.SecurityProtocolType]::Tls12 を追加します。
1 |
[Net.ServicePointManager]::SecurityProtocol += [Net.SecurityProtocolType]::Tls12 |
通信を確認する
ここまでやれば通信ができるはずです。statuscodeで200(成功)が返って来ることを確認してください。
1 2 3 4 |
$URL = "https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409"
Invoke-WebRequest $URL
StatusCode : 200
.... |
PSGalleryを確認する
PSGalleryを確認しましょう。Get-PSRepositoryで下記が返ってきたら登録があります。
1 2 |
Get-PSRepository
Name InstallationPolicy SourceLocation
---- ------------------ --------------
PSGallery Untrusted https://www.powershellgallery.com/api/v2 |
Untrustedになっているので、このままだとInstall時にいちいち聞かれるのでTrustedに変えましょう。
1 |
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted |
パッケージソースが見つかりません、と返ってきてしまったら自分で設定しないといけません
PackageProviderを設定する
まずは、NuGetが必要なのでInstall-PackageProviderを実行します。
1 2 3 4 |
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にして構わないと思います。
1 2 3 |
Register-PSRepository -Default -InstallationPolicy Trusted
Get-PSRepository
Name InstallationPolicy SourceLocation
---- ------------------ --------------
PSGallery Trusted https://www.powershellgallery.com/api/v2 |
Moduleを現在のUserのみにインストールする
なんか書ききった感があるのですが、本番はこれからです😓
冒頭に書いたとおり、管理者権限がありません。なので普通にInstall-Moduleを走らせるとコケます。そういった場合、ScopeをCurrentUserにすると解決します。
1 |
Install-Module MicrosoftTeams -Scope CurrentUser |
こうすると、userのDocuments\WindowsPowerShell\Modulesに入ります。
現在のUserの実行権を設定する
Importすると.psd1ファイルが実行されます。ファイルの実行権がないことがあるので、これもCurrentUserに許可しておきましょう。
1 |
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned |
Importする
1 |
Import-Module MicrosoftTeams -Force |
ImportしたModuleを使う
MicrosoftTeamsのモジュールが使えるように成りました。
1 2 3 4 5 6 7 |
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件のコメントがあります。