SEくぼたの事件簿

インフラSEとしての活動を記録していきます

Microsoft365のライセンス付与 アプリのオンオフをPowerShellで実施する方法(MS Graph編)

こんばんは!

 

ブログを書くネタに困りしばらく停止してましたが、昔記載した以下の記事を修正しないといけなくなったため改めて記載します。

kbtblog.hatenablog.com

思えば1年以上前、一番最初に書いたブログでした!1年以上続いたことに自分でびっくり!笑

 

上記記事ではMicrosoft365のユーザーのライセンス割り当てをPowershellで実施する方法を紹介していました。

その際、MSOnlineというPowerShellモジュールをインストールして実行していたのですが、MSOnlineで利用されるADAL(Azure Active Directory Authentication Library)をMSAL(Microsoft Authentication Library)とMicrosoft Graph APIを利用するように変更してくださいという案内がでました!

↓の記事ですね!

Microsoft Authentication Library と Microsoft Graph への移行は完了済みでしょうか? | Japan Azure Identity Support Blog (jpazureid.github.io)

記事内では

2022 年 6 月 30 日をもちまして Active Directory Auth Library (ADAL) および Azure Active Directory Graph のサポートを終了するため、MSAL および Microsoft Graph を使用するよう、アプリのアップデートを推奨します。また、まだ ADAL を使用しているアプリを簡単に見つけることができるようにいたしました。

と書かれているので、記事をアップデートします。

なおこれによって、PowerShellのAzureADモジュールおよびMSOnlineのコマンドレットに影響が発生します。

 

実施したい内容は上記記事と同じで以下を目指します。

  1. PowerShellを利用してMicrosoft365ユーザーのライセンス割り当てを実施
  2. 特定のアプリケーションはオフ

 

  • モジュールのインストール方法

Powershellを管理者として起動して

「Install-Module Microsoft.Graph」を実行

f:id:KKubo19:20210909213203p:plain

表示される選択肢はYとAで実行

f:id:KKubo19:20210909213341p:plain

サポートされる条件は以下

細かくはここを確認

Microsoft Graph PowerShell SDK をインストールする - Microsoft Graph | Microsoft Docs

 

Powershellにて「Connect-Graph -Scopes Directory.ReadWrite.All」

f:id:KKubo19:20210909214744p:plain

※ちなみにScopesにはDirectory.ReadWrite.Allと結構大きな権限を付けてつないでいます。

呼び出したいものによって必要な委任の権限が違うので、確認されたい方はリファレンスを確認してください。

Microsoft Graph の概要 - Microsoft Graph | Microsoft Docs

こんな感じで書かれると思うので、利用するものをピックアップください。

f:id:KKubo19:20210909214257p:plain

ちなみに今回のライセンス割り当てに必要なアクセス権限は以下のどちらかです。

  • User.ReadWrite.All
  • Directory.ReadWrite.All

 

接続に利用するアカウントを選択もしくは入力

f:id:KKubo19:20210909214113p:plain

 

組織の代理として同意するにチェックをいれ承諾をクリック

f:id:KKubo19:20210909214358p:plain

 

接続されたことが確認できます。

f:id:KKubo19:20210909214424p:plain

試しに「Get-MgUser」を実行してみるとユーザーリストが取得できることがわかります。※塗りつぶし過ぎてよくわからないですね・・・笑

f:id:KKubo19:20210909214534p:plain

 

  • ライセンス割り当ての準備

ライセンス割り当てをPowershellで実行するにあたり以下の準備を実施します。

  1. 割り当てるライセンスのID確認
  2. ライセンスをオフにするアプリケーションのID確認

 

1.割り当てるライセンスのID確認

Micrsoft Graphに接続されたPowerShellコンソールで「Get-MgSubscribedSku | fl」を実行

f:id:KKubo19:20210909215210p:plain

今回はMicrosoft365 E5 DEVELOPERを付与しようと思うので上記の赤丸のSkuIdとIdを確認します。

 

2.ライセンスをオフにするアプリケーションのID確認

Micrsoft Graphに接続されたPowerShellコンソールで以下を実行

 

(Get-MgSubscribedSku -SubscribedSkuId 7bf3acff-2346-4dfa-9c69-6f23129f36ba_c42b9cae-ea4f-4ab7-9717-81576235ccac | Select-Object serviceplans).serviceplans 

-SubscribedSkuIdの後ろには対象のライセンスのIdを入力します。

SKUIDじゃないよ!注意!

f:id:KKubo19:20210909220215p:plain

これでライセンスに含まれるServicePlanNameとIDが確認できます。

今回は赤線で記載したTeamsとFormsをオフにしてみます。

対象のアプリケーションのIDを控えます。

 

  • いざライセンス付与

初回ライセンス付与の場合、前回の記事と同様に利用ロケーションを設定しないとライセンス付与がエラーになります。

今回pstest@xxx.mlというユーザーにライセンス付与するので、まずは利用ロケーションを設定します。※日本の想定で記載しています。

下記を実行

「Update-MgUser -UserId pstest@xxx.ml -UsageLocation "JP"」

f:id:KKubo19:20210909220535p:plain

次にライセンス情報を保有するオブジェクトを作成します。

ここで、先ほど調査したSkuIdとServicePlanIdを利用します。

下記を実行

$AddLicense = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense -Property @{SkuId = "c42b9cae-ea4f-4ab7-9717-81576235ccac"; disabledPlans =@("57ff2da0-773e-42df-b2af-ffb7a2317929","e212cbc7-0961-4c40-9825-01117710dcb1")}

f:id:KKubo19:20210909220734p:plain

SkuIdとdisabledPlans内の文字列は先ほど調査した値に合わせて変更してください。

ちなみにアプリケーションは全部オンでいいよって場合はこっち

$AddLicense = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense -Property @{SkuId = "c42b9cae-ea4f-4ab7-9717-81576235ccac"}

f:id:KKubo19:20210909221039p:plain

以下を実行

Set-MgUserLicense -UserId pstest@msdive.ml -AddLicenses @($AddLicense) -RemoveLicenses @()

f:id:KKubo19:20210909221238p:plain

管理画面から参照してみると

f:id:KKubo19:20210909221408p:plain

f:id:KKubo19:20210909221422p:plain

ちゃんと設定されていることが確認できました!!

 

  • おまけ

前回と同様に単一ユーザーへの設定のため複数ユーザーへの適用処理についても記載します。

内容はほぼ前回と一緒なので細かい解説は省きます。

Connect-Graph -Scopes Directory.ReadWrite.All
$File = "C:\temp\List.csv"
$UserLists = Import-Csv -Path $File

$AddLicense = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphAssignedLicense `
-Property @{SkuId = "c42b9cae-ea4f-4ab7-9717-81576235ccac"; disabledPlans =@("57ff2da0-773e-42df-b2af-ffb7a2317929","e212cbc7-0961-4c40-9825-01117710dcb1")}

foreach($User in $UserLists){
  Update-MgUser -UserId $User.User -UsageLocation "JP"
    Set-MgUserLicense -UserId $User.User -AddLicenses @($AddLicense) -RemoveLicenses @()
    
}
Disconnect-Graph

f:id:KKubo19:20210909221632p:plain

相変わらずForeachを利用し続けるくぼたなのでした!笑

 

 

  • 最後に!

Twitterでも情報発信したいと思いますので、興味があったらフォローしてください!

Windows365 Enterpriseをデプロイしてみる

こんにちは。

ついに8/2にWindows365がリリースされましたね!!

Twitterをみてると他の方も作られてる方が多数いらっしゃるようですが、負けずに作っていきたいと思います!笑

Windows365ってAzure Virtual Desktop(旧Windows Virtual Desktop)と何が違うの?って思うのですが、大きくは月額固定制か従量課金制かの違いがあるかと思います。

※Windows365ではマルチセッションWindowsがないことに注意してね!

ライセンス価格気になる方はこちらを参照ください。

Windows 365 Enterprise のプランと価格 | Microsoft

 

Windows365の中にもBusinessとEnterpriseの2パターンあり、Microsoft365同様300名以下であればBusinessの契約が可能です。

Businessプランだと

  • OSイメージのカスタマイズできない
  • ネットワーク接続がMicrosoft管理
  • AzureADJoinedオンリー

等々の制約があるようです。

今回はEnterpriseで作っていきたいと思います。

Enterpriseで作成する場合、以下が必要です。

  • Active Directoryへの参加
  • Azureのサブスクリプション
  • オンプレネットワークとの接続(今回はAzure上だけ通信可能なように作成)
  • AzureAD Premium P1ライセンス
  • Microsoft Endpoint Managerの利用ライセンス
  • Hybrid AzureAD Joined

公式の文書ではこのように記載されています

Windows 365 Enterprise を使用するには、各ユーザーに Windows 10 Pro サブスクリプションMicrosoft エンドポイント マネージャー、および Azure Active Directory P1 のライセンスが付与されている必要があります。これらは Microsoft 365 F3、Microsoft 365 E3、Microsoft 365 E5、Microsoft 365 A3、Microsoft 365 A5、Microsoft 365 Business Premium、Microsoft 365 Education 学生使用特典のサブスクリプションに含まれています。 

 ちゃんと見たい人はここを参照してね

Windows 365 についてよく寄せられる質問 | Microsoft

 

  • 今回作成する環境について

今回作成する環境はWindows365 Enterpriseをデプロイする前提です。

作成した環境のイメージ図はこんな感じです。

f:id:KKubo19:20210804141252p:plain

ネットワークはオンプレと接続してActive Directory参加する手順になっていましたが、所有しているAzureにオンプレの接続を作成していなかったので、Virtual Network内にServerNetとWVDNetいう名前のサブネットを作成しServerNetにActive DirectoryやAzureADConnectがいる環境にしています。

※必要に応じてVPN GatewayやExpress RouteでオンプレとS2S接続可能です。

 

また、Active Directoryの環境はAzureADConnectを利用してHybridAzureADJoinedの構成を実装しています。

 必要な方は以下記事を参照ください。

kbtblog.hatenablog.com

Windows365を参加させるネットワークはWVDNetとしています。

※過去WVD作成したときのサブネットをそのまま流用しちゃってますので分かりにくくなっちゃってますね。ごめんなさい笑

WVDNetに属するWindows365はServerNetに属するADに参加する必要があるため、

VirtualNetworkのDNSにADサーバーを指定しています。

 

  • 設定方法

Microsoft365管理センターよりサービスを購入するをクリックし対象を選択

※CSP契約の場合は代理店にお願い?になるかもです。

f:id:KKubo19:20210804142043p:plain

無料トライアルをクリック

f:id:KKubo19:20210804142136p:plain

続行をクリック

f:id:KKubo19:20210804142200p:plain

アクティブなユーザーからライセンスを割当するユーザーを選択し、

ライセンスとアプリをクリック

f:id:KKubo19:20210804142259p:plain

対象のWindows365ライセンスを付与して保存

f:id:KKubo19:20210804142411p:plain

Microsoft365管理センターよりエンドポイントマネージャーをクリック

f:id:KKubo19:20210804142528p:plain

バイス-Cloud PC(環境によってはWindows365かも)をクリックして

画面の承認をクリック

f:id:KKubo19:20210804142607p:plain

ダッシュボードが表示されます

f:id:KKubo19:20210804142728p:plain

オンプレミスのネットワーク接続から接続の作成をクリック

f:id:KKubo19:20210804142804p:plain

上記作成環境のイメージ図の通り、WVDNetに参加させるよう値を入力し次へをクリック

f:id:KKubo19:20210804142934p:plain

ADに参加させるための必要情報を入力して次へ

f:id:KKubo19:20210804143306p:plain

内容が問題ないことを確認し「確認と作成」をクリック

f:id:KKubo19:20210804143417p:plain

しばらくすると確認がおわりステータスが変化します。

※たぶん1つ警告でます。

f:id:KKubo19:20210804143632p:plain

ステータスをクリックすると詳細が表示されます。

「AzureADデバイスの同期」が警告になっています。

そりゃまだ端末デプロイしてないからAzureADにはデバイスないやろ・・・・って思いましたが、そのまま次に進んでOKです。

f:id:KKubo19:20210804143719p:plain

プロビジョニングポリシーからポリシーの作成をクリック

f:id:KKubo19:20210804144007p:plain

ポリシーに名前を作成し、先ほど作成したオンプレミスのネットワーク接続を選択し次へをクリック

f:id:KKubo19:20210804144059p:plain

イメージの種類からギャラリーイメージを選択し、イメージの選択内から対象を選択

※カスタムイメージもここで選択可能です。

f:id:KKubo19:20210804144205p:plain

選択できたら次へをクリック

f:id:KKubo19:20210804144344p:plain

ポリシー適用するグループを設定します。

先ほどライセンスを割り当てたユーザーが所属するグループを選択します。

f:id:KKubo19:20210804144455p:plain

選択したら次へをクリック

f:id:KKubo19:20210804144513p:plain

内容を確認し作成をクリック

f:id:KKubo19:20210804144542p:plain

すべてのクラウドPCのタブにプロビジョニングのステータスを確認できます。

デプロイには1時間ちょっとかかりました。

f:id:KKubo19:20210804144611p:plain

デプロイ中にいろいろ確認すると

AD内の指定OUにコンピューターオブジェクトが作成されるところが見えたり

f:id:KKubo19:20210804144741p:plain

AzureADのデバイスにHybrid Azure AD Joinedのステータスでデバイスがあがってきたり

f:id:KKubo19:20210804144822p:plain

Microsoft Endpoint Managerのデバイスにも表示されてくることが分かります。

f:id:KKubo19:20210804144859p:plain

この辺ができていない場合、Hybrid Azure AD Joinedが失敗している可能性があるので、これを参考にしてみるとよいかも

Hybrid Azure AD Join 失敗時の初動調査方法について (マネージド編) | Japan Azure Identity Support Blog (jpazureid.github.io)

 

デプロイが完了するとステータスが変化します。

f:id:KKubo19:20210804145141p:plain

ここまでで管理者側の準備は完了

 

  • アクセスしてみる

ユーザーはブラウザアクセスする場合、https://windows365.microsoft.comにアクセスします。

するとAzureADのログオン画面が表示されるので、対象アカウントでログオン

次へをクリック

f:id:KKubo19:20210804145337p:plain

次へをクリック

f:id:KKubo19:20210804145359p:plain

次へをクリック

f:id:KKubo19:20210804145426p:plain

開始をクリック

f:id:KKubo19:20210804145445p:plain

ブラウザーで開くをクリック

f:id:KKubo19:20210804145507p:plain

ローカルリソースへの接続を選択して許可をクリック

f:id:KKubo19:20210804145534p:plain

ドメイン参加したADのユーザー名/パスワードを入力し送信をクリック

f:id:KKubo19:20210804145636p:plain

ちゃんと表示されました!

f:id:KKubo19:20210804145748p:plain

 

  • まとめ

今回は話題のWindows365を触ってみました。

Windowsのブラウザからのアクセス以外にもリモートデスクトップアプリからのアクセス、iOSiPadからのリモートデスクトップアプリアクセスも問題なくできました。

実際、ライセンス費の観点でいけるのかどうなんだろ・・・って思ったりもしましたが、選択肢のひとつとして入れてみてはいかがでしょうか!?

 

  • 最後に!

Twitterでも情報発信したいと思いますので、興味があったらフォローしてください!

ApplicationProxyを利用して社外からVPNなしでガルーンサーバーへアクセスしてみる

こんにちは。

最近テレワークの会社が増えたからなのか社内のアプリケーションへのアクセスにVPNなしでやる方法があるならそれがいいといわれる機会がありました。

前々からAzureAD Application Proxyを試してみたかったのもあったので今回試して見ようと思います。

ってことで今回は!

「社外からVPNなしでガルーンサーバーへアクセスしてみる」をやってみたいと思います。

 

  • 概要

ApplicationProxy自体は検索するとどんなものなのか結構いっぱいでてきたので概要だけさらっと記載していきます。

まずApplicationProxyを利用するのに必要なライセンスですが

・Azure Active Directory Premium P1

が必要となります。

※アクセスする人数分必要です。

 

次にどんなアクセス経路になるかの概要図です。

ざっくりと下図のような感じでアクセスしていきます。

※今回はガルーンにアクセスさせるので右側がガルーンになっています。

ネクターサーバーとガルーンサーバー、ADサーバーはそれぞれサーバーOSをWindowsで準備しています。

f:id:KKubo19:20210624191036p:plain

通信の流れを簡単に!

①②AzureADで認証してトークンを取得(ユーザーはユーザーIDとパスワードを入力)多要素認証してたらそれも適用されます!

③デバイスからアプリケーションプロキシサービスにトークンを送信

 アプリケーションプロキシサービスがデバイスから受け取ったトークンでUPNとSPNを取得しアプリケーションプロキシコネクタに送信

④コネクタがADと認証を実施(今回はSSO設定するので)

⑤コネクタがガルーンにアクセス

⑥ガルーンの応答をアプリケーションプロキシサービス経由でデバイスに送信

って感じです。

詳しくはこちら

オンプレミスのアプリへのリモート アクセス - Azure AD アプリケーション プロキシ | Microsoft Docs

 

今回の構成ではAD認証を利用してガルーンにアクセスする必要があります。

アプリケーションプロキシでは対応可能な認証が以下です。

・パスワードベースのサインオン

・ヘッダーベースのサインオン

・統合Windows認証

SAMLによるシングルサインオン

アプリケーション プロキシを使用したオンプレミス アプリでのシングル サインオンについて | Microsoft Docs

 

ガルーンとADの連携ではLDAPを利用することも可能なのですが、

今回はAD-ガルーン間およびアプリケーションプロキシの両方とも統合Windows認証で設定をしています。

 

  • 前提

ガルーンサーバーが導入されており、AzureADもカスタムドメイン登録が終わっている状態にて作成

 

  • 設定

ガルーン側を統合Windows認証にするために以下の設定を追加

f:id:KKubo19:20210624200851p:plain

ガルーン側のIISの設定にてWindows認証が有効になっていることを確認

※英語でごめんなさい笑

f:id:KKubo19:20210624201032p:plain

Windows認証がない場合はサーバーの役割追加からIIS内のWindows認証を有効にします

これでAD-ガルーン間の統合Windows認証の設定は完了です。

 

次にアプリケーションプロキシ側を設定します。

AzureAD管理センターにログオンし、エンタープライズアプリケーション-アプリケーションプロキシを選択し、「コネクタサービスのダウンロード」から規約に同意してダウンロードをクリック

f:id:KKubo19:20210624201427p:plain

ダウウンロードできたモジュールをコネクターサーバー上で実行

Installをクリック

f:id:KKubo19:20210624201534p:plain

AzureADの管理アカウントでサインイン

f:id:KKubo19:20210624201647p:plain

インストールが完了したらCloseをクリック

f:id:KKubo19:20210624201706p:plain

AzureAD管理センターのエンタープライズアプリケーションよりすべてのアプリケーションを選択し、新しいアプリケーションをクリック

f:id:KKubo19:20210624201825p:plain

オンプレミスのアプリケーションの追加をクリック

f:id:KKubo19:20210624201936p:plain

名前にアプリケーションの管理名称を入力

内部URLに社内からアクセスしているガルーンサーバーのURLを記載

外部URLは適切に選択してください。

※内部URLと外部URLを同じURLにするには証明書が必要となるので今回は別で実施します。

事前認証をAzure Active Directory

として追加をクリック

f:id:KKubo19:20210624201947p:plain

作成が完了したら

AzureAD管理センターのエンタープライズアプリケーション内のすべてのアプリケーションから上記で作成した名称のアプリケーションをクリック

f:id:KKubo19:20210624202434p:plain

ユーザーとグループの割り当てをクリック

f:id:KKubo19:20210624202539p:plain

今回はこんな感じで追加してあります。

※追加する際はユーザーまたはグループの追加から追加してください

f:id:KKubo19:20210624202622p:plain

シングルサインオンからWindows統合認証をクリック

f:id:KKubo19:20210624202822p:plain

内部アプリケーションSPNには

http/サーバー名

今回はgaroonというホスト名のサーバーなので

http/garoon

http/

ってところが重要(http://じゃないよ)

委任されたログインIDは「ユーザープリンシパル名のユーザー名部分」としています。

これはAzureADのユーザー名がUserA@xxx.com

ADのユーザー名がxxx\UserAという完了で作成しており

UserAを一致させるために「ユーザープリンシパル名のユーザー名部分」を利用しています。

設定したら保存をクリック

f:id:KKubo19:20210624203044p:plain

ADサーバーにログオンし、ActiveDirectoryのユーザーとコンピューターをクリック

f:id:KKubo19:20210624203518p:plain

ネクターサーバーをダブルクリック

今回はConnecterVMとしています。(スぺスはミスったのでご了承を笑)

f:id:KKubo19:20210624203728p:plain

委任タブよりGaroonサーバーに対しhttpの通信を許可

※追加ボタンからサーバーを検索してプロトコルを選択できます。

f:id:KKubo19:20210624203848p:plain

 

これで設定は完了!!

 

  • いざアクセス

エンタープライズアプリケーション内の作成したアプリケーションのプロパティにユーザーのアクセスURLの記載があります。

f:id:KKubo19:20210624204342p:plain

アクセスするとAzureADのサインイン画面が表示される

f:id:KKubo19:20210624204527p:plain

多要素認証の設定をしていればその画面が表示

f:id:KKubo19:20210624204720p:plain

こんな感じで表示されるはずです!!
※文字やフォーム崩れが結構おきるようなのでご注意を

f:id:KKubo19:20210624211526p:plain

今回はガルーンの設定自体何にもしていないので何も表示されません。。。。笑

 

ちなみにアクセスの際はちゃんとADとAzureADが同期されたユーザーで実施してくださいね!!

ドメインに入っていない端末からのアクセスは試していないのですが余裕があればまたどこかで試してみたいと思います!

 

  • まとめ

前々から試してみたかったアプリケーションプロキシ!試してみたら最後のアクセスで何度か詰まりました!笑

皆さんも実施する際は余裕をもってやってみていただくと良いかもしれません!

今回は実施していませんが、条件付きアクセスもあわせて設定可能なのでよりセキュアに社内アプリケーションにアクセスさせられるのではないかと思います!

ぜひ一度使ってみては??

 

  • 最後に!

Twitterでも情報発信したいと思いますので、興味があったらフォローしてください!