SharePoint Online のサーバーリソースクォータに意味はない

Disclaimer: 本エントリは2018年1月5日現在の Office 365 の仕様に基づいています。

SharePoint Online のサイトコレクション単位で設定するサーバーリソースクォータ (Server Resource Quota) は、サンドボックスソリューションのために用意されている仕組みである。サンドボックスソリューションがサポートされなくなった今では、サーバーリソースクォータを設定することに意味はない。 SharePoint 管理センターのサイトコレクション作成の画面で既定で 300 という値が指定されているが、値を 0 にして(=クォータを設定せずに)サイトコレクションを作成しても問題ない。

f:id:umanohoneo:20180105015842p:plain Fig: サーバーリソースクォータ

不要なパラメータは一刻も早く無効化してほしいものだ。

Office 365 E3 ライセンスのうち Exchange Online (Plan 2) だけをユーザーに割り当てる

Disclaimer: 本エントリの内容は2018年1月3日時点の Office 365 の仕様に基づいています。

honeotech.hatenablog.com

上記のエントリでユーザーに Office 365 のライセンスを割り当てる方法について言及したが、組織によっては「 E1 を購入したが Exchange Online しか使わせたくない」といった場合もあると思うので、そのような場合のライセンス割り当ての方法を検証してみた。

検証したこと

Office 365 Enterprise E3 ライセンスのうち Exchange Online (Plan 2) だけをユーザーに割り当てる。

はじめに

Azure AD PowerShell v1 では Set-MsolUserLicense コマンドレットによってユーザーにライセンスを割り当てることができる。 E1 や E3 といった SKU の単位でユーザーにライセンスを割り当てることが可能であるが、それらに含まれるサービスごとのライセンスを個別に割り当てることも可能である。本エントリでは、 E3 に含まれる Exchange Online (Plan 2) だけをユーザーに割り当てる方法を示す。

SKU に含まれる特定のライセンスのみを割り当てるためには、割り当て対象のライセンスではなく、除外するライセンスを明示的に列挙する必要がある。例えば、今回のケースでは E3 に含まれる Exchange Online (Plan 2) 以外のすべてのライセンスを列挙する必要がある。この制約は、 New-MsolLicenseOption コマンドレットの仕様によるものである。

E3 に含まれるライセンスは将来的に変わる可能性があるため、はじめに E3 に含まれるライセンスの一覧を Office 365 から取得し、そこから Exchange Online (Plan 2) を除いて、「除外するライセンス」の一覧を作成することとする。

ライセンス割り当ての大まかな流れは次のとおり。

  1. E3 に含まれるライセンスの一覧を取得する
  2. Exchange Online (Plan 2) を除外したライセンスのセットを定義する
  3. ライセンスを割り当てる
  4. ライセンスの割り当て状況を確認する

E3 に含まれるライセンスの一覧を取得する

Get-MsolAccountSku コマンドレットで E3 (ENTERPRISEPACK)*1 のオブジェクトを取得し、そこからライセンスの情報を抽出する。

# Connect-MsolService が完了した状態で

# E3 ライセンスの AccountSku を取得する
$e3AccountSku = Get-MsolAccountSku | where {$_.AccountSkuId -match "ENTERPRISEPACK"}
$e3AccountSku
# 
# AccountSkuId              ActiveUnits WarningUnits ConsumedUnits
# ------------              ----------- ------------ -------------
# xxxxxxxxxx:ENTERPRISEPACK 25          0            8
# 
#
# E3 ライセンスに含まれる各サービスの ServiceName を取得する
$e3ServiceName = ($e3AccountSku | Select-Object -ExpandProperty ServiceStatus | Select-Object -ExpandProperty ServicePlan).ServiceName
$e3ServiceName
# BPOS_S_TODO_2
# FORMS_PLAN_E3
# STREAM_O365_E3
# Deskless
# FLOW_O365_P2
# POWERAPPS_O365_P2
# TEAMS1
# PROJECTWORKMANAGEMENT
# SWAY
# INTUNE_O365
# YAMMER_ENTERPRISE
# RMS_S_ENTERPRISE
# OFFICESUBSCRIPTION
# MCOSTANDARD
# SHAREPOINTWAC
# SHAREPOINTENTERPRISE
# EXCHANGE_S_ENTERPRISE

ここで BPOS_S_TODO_2 (To-Do (Plan 2)) から EXCHANGE_S_ENTERPRISE (Exchange Online (Plan 2)) までの17行が、 E3 に含まれるサービス(ライセンス)を表す文字列である。

Exchange Online (Plan 2) を除外したライセンスのセットを定義する

前の手順で取得したライセンスの一覧から Exchange Online (Plan 2) を除外し、ライセンスの一覧を再生成する。

# EXCHANGE_S_ENTERPRISE を除外した ServiceName の一覧を作成する
$serviceName = $e3ServiceName | sls -Pattern "EXCHANGE" -NotMatch
$serviceName
# 
# BPOS_S_TODO_2
# FORMS_PLAN_E3
# STREAM_O365_E3
# Deskless
# FLOW_O365_P2
# POWERAPPS_O365_P2
# TEAMS1
# PROJECTWORKMANAGEMENT
# SWAY
# INTUNE_O365
# YAMMER_ENTERPRISE
# RMS_S_ENTERPRISE
# OFFICESUBSCRIPTION
# MCOSTANDARD
# SHAREPOINTWAC
# SHAREPOINTENTERPRISE
# 
# 

次に、 New-MsolLicenseOption コマンドレットで LicenseOption オブジェクトを生成する。その際、 -DisalbedPlans オプションに前述のライセンス一覧を指定する。これにより、 Exchange Online (Plan 2) 以外のライセンスが無効化された E3 の LicenseOption オブジェクトが生成される。

# LicenseOption オブジェクトを作成する
$licenseOption =  New-MsolLicenseOptions -AccountSkuId 'xxxxxxxxxx:ENTERPRISEPACK' -DisabledPlans $serviceName

ライセンスを割り当てる

Set-MsolUserLicense コマンドレットでユーザーにライセンスを割り当てる。この時、 -LicenseOption オプションで、前の手順で作成した LicenseOption オブジェクトを指定する。なお、ユーザーに E3 ライセンスを既に割り当てている場合は、 -AccountSkuId オプションは省略可能である。

# ライセンスを割り当てる
Set-MsolUserLicense -UserPrincipalName <upn> -LicenseOptions $licenseOption -AddLicenses "xxxxxxxxxx:ENTERPRISEPACK"
# 何も出力されなければ成功

ライセンスの割り当て状況を確認する

最後に、 Get-MsolUser コマンドレットでライセンスの割り当て状況を確認する。

# ライセンスの割り当て状況を確認する
Get-MsolUser -UserPrincipalName <upn> | Select-Object -ExpandProperty Licenses | Select-Object -ExpandProperty ServiceStatus
# 
# ServicePlan           ProvisioningStatus
# -----------           ------------------
# BPOS_S_TODO_2         Disabled
# FORMS_PLAN_E3         Disabled
# STREAM_O365_E3        Disabled
# Deskless              Disabled
# FLOW_O365_P2          Disabled
# POWERAPPS_O365_P2     Disabled
# TEAMS1                Disabled
# PROJECTWORKMANAGEMENT Disabled
# SWAY                  Disabled
# INTUNE_O365           PendingActivation
# YAMMER_ENTERPRISE     Disabled
# RMS_S_ENTERPRISE      Disabled
# OFFICESUBSCRIPTION    Disabled
# MCOSTANDARD           Disabled
# SHAREPOINTWAC         Disabled
# SHAREPOINTENTERPRISE  Disabled
# EXCHANGE_S_ENTERPRISE Success  # Exchange Online (Plan 2) のみが割り当てられている
# 

Exchange Online (Plan 2) のみが割り当てられていることが確認できた。

*1:E1 の場合は STANDARDPACK

Python で Office 365 からメールを送信する

Disclaimer: 本エントリの内容は2018年1月3日時点の Office 365 の仕様に基づいています。

Python で Office 365 からメールを送信する方法を検証してみた。

検証条件

メールの送信者となる Office 365 のユーザーには多要素認証を適用していない。

使用するライブラリ

smtplib パッケージと email パッケージを使用する。 smtplilb パッケージは SMTP サーバ(Office 365)との通信に用いる。一方、 email パッケージはメッセージの組み立てに用いる。

なお、 Office 365 からメールを送るための専用のパッケージもあるようだが、 smtplib のほうが汎用性が高そうなので、勉強がてら今回は smtplib を使うことにした。

コード

必要最小限ではあるが、以下のコードで Office 365 からメール送信できる。smtp.ehlo() 以降の行には、 Python インタプリタで一行ずつ実行した際の出力(SMTP サーバからの応答)をコメントとして併記している。

import smtplib
from email.message import EmailMessage

# 接続先 SMTP サーバの定義
smtp = smtplib.SMTP('smtp.office365.com', 587)  # FQDN とポート番号

# 認証情報の定義
user = 'USER@DOMAIN'  # SMTP サーバに接続するためのユーザ
password = "PASSWORD"

# メッセージの組み立て
message = EmailMessage()
message['From'] = 'SENDER@DOMAIN'  # 送信者のメールアドレス
message['To'] = 'RECIPIENT@DOMAIN'  # 受信者のメールアドレス
message['Subject'] = 'SUBJECT'  # 件名
message.set_content('CONTENT')  # 本文

# SMTP サーバへの接続とメールの送信
smtp.ehlo()
    # (250, ...
smtp.starttls()  # TLS の開始(以降の通信は暗号化される)
    # (220, b'2.0.0 SMTP server ready') 
smtp.ehlo()
    # (250, ...
smtp.login(user, password)  # SMTP サーバにログイン
    # (235, ...
smtp.send_message(message)  # メッセージの送信
    # {}
smtp.quit()  # SMTP セッションの終了と TCP コネクションの切断
    # (221, b'2.0.0 Service closing transmission channel')

参考

PowerShell で Office 365 のユーザーを作成する(クラウド ID モデル)

Disclaimer: 本エントリの内容は2018年1月2日時点の Office 365 の仕様に基づいています。

Office 365 のクラウド ID モデルのユーザーを PowerShell で作成する方法を確認してみた。なお、クラウド ID モデルのユーザーとは、オンプレミスの Active Directory から Azure AD に同期されたユーザーではなく、Office 365 上に直接作成されたユーザーのことである。

大まかな手順は以下のとおり。

  1. ユーザーを作成する
  2. ユーザーの所在地を設定する
  3. ユーザーにライセンスを割り当てる
  4. ユーザーの初期パスワードを設定する

ユーザーを作成する

はじめに Office 365 上にユーザーを作成する。

# Connect-MsolService が完了した状態で
New-MsolUser -UserPrincipalName <upn> -DisplayName <dn>

New-MsolUser には、少なくとも UserPrincipalName (UPN) と DisplayName を指定する必要がある。 <dn> を空文字("")や $null にして New-MsolUser を実行するとエラーとなるため、 DisplayName には空文字以外の何らかの文字列を指定する必要がある。

ユーザーの所在地を設定する

次に、ユーザーの所在地を設定する。

Set-MsolUser -UserPrincipalName <upn> -UsageLocation <ul>

<upn> には前の手順で作成したユーザーの UPN を指定する。 <ul> には、ユーザーが Office 365 を使用する場所を「2文字の国または地域番号」で指定する。日本の場合は ”JP” である。なお、所在地を設定しないと次の手順(ライセンス割り当て)が失敗するため、所在地の設定は必須である。

f:id:umanohoneo:20180102173619p:plain Fig: 所在地が未設定の状態でライセンスを割り当てる

ユーザーにライセンスを割り当てる

所在地の設定が完了した後、ユーザーに Office 365 のライセンスを割り当てる。

Set-MsolUserLicense -UserPrincipalName <upn> -AddLicenses <AccountSkuId>

<AccountSkuId> には所有しているライセンスの SKU ID を指定する。なお、所有しているライセンスとその SKU ID は Get-MsolAccountSku で確認できる。

Get-MsolAccountSku
#
#AccountSkuId              ActiveUnits WarningUnits ConsumedUnits
#------------              ----------- ------------ -------------
#<tenant>:ENTERPRISEPACK 25          0            6

上記の例では、 "<tenant>:ENTERPRISEPACK" の部分が SKU ID である。<tenant> の部分はテナント名(初期ドメイン xxx.onmicrosoft.com の xxx の部分)が入る。

ユーザーの初期パスワードを設定する

最後に初期パスワードを設定する。

# パターン1
# パスワードをランダムに生成する
Set-MsolUserPassword -UserPrincipalName <upn>
# 生成されたパスワードが表示される

パスワードを指定する場合は、 -NewPassword パラメータを使用する。

# パターン2
# パスワードを指定する
Set-MsolUserPassword -UserPrincipalName <upn> -NewPassword <password>

上記のいずれのパターンでも、ユーザーは初回サインイン時にパスワード変更を要求される。ユーザーにパスワード変更を要求しない場合は、 -ForceChangePassword $false を指定して Set-MsolUserPassword を実行する。

# パターン3
# パスワードをランダムに生成し、パスワード変更を要求しない
Set-MsolUserPassword -UserPrincipalName <upn> -ForceChangePassword $false

Exchange Online のメールボックスに適用されている OWA メールボックスポリシーを確認する

Disclaimer: 本エントリの内容は2018年1月1日の Office 365 の仕様に基づいています。

Exchange Online のメールボックスに適用されている OWA メールボックスポリシーを確認する方法を検証してみた。

前提

  • ひとつのメールボックスにはひとつの OWA メールボックスポリシーが適用される。
  • 既定では組込みの OwaMailboxPolicy-Default という名前のポリシーが適用される。

メールボックスに適用されているポリシーを確認する

メールボックスに適用されているポリシーを確認するには、メールボックスの名前やエイリアスを指定して Get-CASMailbox を実行する。 実行結果における OWAMailboxPolicy プロパティの値が、ポリシーの名前を示している。

# Exchange Online PowerShell に接続した状態で
Get-CASMailbox <Name|Alias> | Select-Object OWAMailboxPolicy
#
#OwaMailboxPolicy
#----------------
#OwaMailboxPolicy-Default  # これがポリシー名
#
#

上記の <Name|Alias> の箇所に指定する文字列は、メールボックスを一意に特定するものであれば、メールボックスの名前やエイリアスでなくてもよいらしい(未検証)。詳細は以下のページを参照。

Identity パラメーターは、表示するメールボックスを指定します。メールボックスを一意に識別する任意の値を使用できます。

以下に例を示します。

... https://technet.microsoft.com/ja-jp/library/bb124754(v=exchg.160).aspx

ポリシーの定義を確認する

ポリシーの定義を確認するには、ポリシーの名前を指定して Get-OWAMailboxPolicy を実行する。先ほど出てきた既定の OWA メールボックスポリシー "OwaMailboxPolicy-Default" の定義を確認してみる。

# Exchange Online PowerShell に接続した状態で
Get-OWAMailboxPolicy OwaMailboxPolicy-Default

#実行結果は省略

SharePoint Online のサイトコレクション作成時に < テンプレートを後で選択... > を選ぶとどうなるか

Disclaimer: 本エントリは2018年1月1日の Office 365 の仕様に基づいています。

SharePoint Online でサイトコレクションを作成する際に、サイトコレクションに適用するテンプレートを選択する必要がある。この時「< テンプレートを後で選択... >」を選んでサイトコレクションを作成すると、サイトコレクション管理者のユーザーにどのような画面が表示されるのか気になったので検証してみた。

サイトコレクションを作成する

はじめに、全体管理者として SharePoint 管理センターにアクセスし、サイトコレクションを作成する。

f:id:umanohoneo:20180101170054p:plain Fig: テンプレートを後で選択...

サイトコレクションにアクセスする

次に、サイトコレクションの管理者*1として、サイトコレクションにアクセスする。すると、テンプレートを選ぶ画面が表示された。概ね予想どおりの挙動である。

f:id:umanohoneo:20180101170138p:plain Fig: サイトコレクションに初めてアクセスした時に表示される画面

組織においてサイトコレクション管理者にテンプレートの選択権を完全に委ねる場合は、「< テンプレートを後で選択... >」を選択してサイトコレクションを作成したほうが、全体管理者の運用の手間が少なくなるだろう。

*1:今回は全体管理者と同じユーザーを利用した。

Office 365 全体管理者のメールボックスの「名前」を変更する

Office 365 のサインアップ時に作成した Office 365 全体管理者のメールボックスを Get-MailBox で確認したところ、サインアップ時に指定した姓名(例えば「太郎山田」)がメールボックスの名前(name 属性)に入っていた。

f:id:umanohoneo:20180101013357p:plain Fig: 全体管理者のメールボックスの名前

メールボックスの名前はメールボックスを一意に特定するものであるから、全体管理者のメールボックスに個人名が登録されているのは都合が悪い場合もありそうだ(組織で Office 365 を使う場合など)。できれば、他のメールボックスと同じように、 名前と Alias を一致させたい。

試しに Office 365 管理センターで全体管理者の表示名を空に変更してみたが、メールボックスの名前は変わらなかった。そこで、 Set-Mailbox で直接名前を変更してみたらうまくいった。

例えば、名前を「太郎山田」から "admin" に変更する場合は、

# Exchange Online PowerShell に接続した状態で
Set-Mailbox -Identity "太郎山田" -Name "admin"

のように Set-Mailbox を実行する。