pikesaku’s blog

個人的な勉強メモです。記載内容について一切の責任は持ちません。

O365勉強メモ

参考
www.amazon.co.jp

Office 365を導入・運用するための基礎知識を身に付けよう

データ保管場所はサブスクリプション購入時に決定される(国・地域の指定必須)

 国で日本指定しても全てのデータが日本に保存される訳ではない
 データ保管場所は以下参照
 データの保管場所

O365テナントは規定でAzure ADテナント

 SalesforceDropBoxにSSO可能

ExpressRoute

 Azureサービスの一つ。
 社内NWとMSデータセンター間をインターネットを経由しない閉域NWで接続する。
 AzureやO365、Dynamic 365サービスが対象。
 セキュリティ・インターネット経由しないため、安定接続がメリット

ExpressRoute for Office 365

 O365に特化したExpressRouteサービス。
 ExpressRoute契約に追加アドオンが必要。
 O365はインターネット接続前提のサービスのため、この契約をしても、一部のサービスはインターネット経由で利用される。
 詳細参照
 Office 365 の URL と IP アドレスの範囲 | Microsoft Docs
 ERはい、いいえがExpressRoute利用の可否。
 実装が複雑な為、MSもメリット有無の判定に2〜6ヵ月のレビューポリシーを設定(万人受けでない、利用時は注意要)

法人向け購入プラン

 一般、大規模、FirstLine Worker(特殊)の3タイプあり
 一般は利用者が300人までで、サービス名はOffice 365 Buisiness *
 大規模は無制限で、サービス名はOffice 365 EnterPrise *
 一般・大規模に詳細プランあり、デスクトップアプリの要否・利用可能機能で分けられる。
 機能単位でオプション追加も可能。上位プランで利用可能な機能を、下位プランでオプション追加可能。
 FirestLineは店舗や工事現場等PCなしで仕事する人向けのもの
 教育機関非営利団体、政府機関向けのプランもあり
 特定の国、地域のみで提供されるプランもあり(中国、ドイツ等)
 1テナントに複数プラン混在可能。例) 300人分はBusinessで、他はEnterPrise等
 「シート」はサブスクリプションの購入単位。100シート購入したら、ユーザー追加時、1シート消費される。

Office 365 Pro Plusとは?

 O365で使えるOffice Suite。
 オンプレOfficeと以下の点が異なる。
  月額利用
  常に最新バージョン
  ライセンスはユーザー紐付け(1ユーザー5デバイスまで利用可能)

Office Onlineとは?

 かつてOffice Web Appsと呼ばれた
 ブラウザで利用できるOffice
 デスクトップ版に比べ機能は限定的

新機能や機能改善情報の取得

 Microsoft 365 Roadmap | Microsoft 365
 Lauched: リリース済み
 Rolling out: リリースされたが全テナントに展開されてないもの
 In development: 開発中
 管理センター(O365管理画面)に新機能ロールアウトが通知される
 新機能の詳細を把握するには以下ブログやTwitterハッシュタグが良い
 Microsoft 365 Blog - ホーム
 #O365、#Office365
 フィードバックコミュニティに参加し機能改善、追加リクエストが可能
 Customer Feedback for Microsoft Office 365

更新プログラムのリリースの流れ

 ※インパクトのある変更が対象
 Office365ロードマップに通知→ロールアウトが近づくと各O365管理画面のメッセージセンターに通知が届く
 更新プログラムの受け取り方は2種類の方法あり。どちらを利用するかは管理画面で設定可能。
 標準リリース→MSリリース後に数週間後に適用(一般的)
 対象指定リリース→標準リリースより早期に更新可能。フィードバック、早期準備を可能とする。テナント全体or特定ユーザーのみの指定が可能。
 メッセージセンター例
 f:id:pikesaku:20190804085934p:plain
 メッセージセンターは以下でアクセス可能
 Sign in to your account

O365は情報発信の主体は基本的に組織でなく個人。その基盤としてOnedrive for BusinessとDelveがあり。

組織から人をたどるのではなく、人から、同グループのメンバや上司をたどるが基本発想

Delveはユーザーを軸に紐づく情報を見つける機能

・自分のプロファイルと、最近自分が作成したファイル
・最近メールでやりとりした相手のプロファイル
・その相手が最近作成したファイル(共有されたファイルのみ)と、その相手とやりとりした添付ファイル
・「最近作成したファイル」はOneDrive for Business or SharePoint OnlineにあるファイルやO365ビデオポータルのビデオ
・プロファイルの各項目毎に「誰でも閲覧可能」か「自分のみ」を設定可能(分かりづらい。。。)
f:id:pikesaku:20190818095807p:plain
・プロファイルは「マイアカウント」→「Officeプロファイル」より編集可能。(Delve画面になる)
→業務は人に密接に基づく考え
・ファイル検索はOffice Graphで実現
SharePointの管理画面で、Office Graph検索を無効に設定する事が可能。(設定→クラシック設定)

OneDrive for Buisinessの概要

・個人用オンラインドライブ
・共有、変更管理が可能
SharePointサイトの一種。ファイル共有に特化してチューニングしたもの。
 ※SharePointはメタ情報で検索できるが、OneDriveでは出来ない。(機能簡素化)
・同期クライアントツール使うと複数ユーザーの同時編集も可能になる
⭐️個人的にファイルの全文検索が高速にできる点が便利。

MyAnalyticsの概要

・E5ライセンスで利用可能
・ユーザーのアクティビティを分析し業務時間を可視化する

メール機能

・優先受信トレイ機能は、「優先」、「その他」に自動振り分けする機能
・振り分け後のメールを右クリックし、「その他受信トレイに移動」・「優先受信トレイに移動」で移動させると学習する
・個人のメールボックス以外に「共有メールボックス」・「Office 365グループのメールボックス」がある。
・受信した添付ファイルをOneDriveに保存可能。O365検索が弱い為、OneDriveで全文検索できるのがメリット
・送信時にOneDriveリンクを送る事も可能。外部アクセス有効にすれば、テナント外O365未使用ユーザーにもリンク送りファイル送付が可能。
 ZIPパスワード付与などは不要になる!
 OneDrive/SharePoint設定次第で、有効期限付きリンクやワンタイムパスワード送信先身元保証した上でリンク共有が可能
・アドインで機能追加が可能(Outlookクライアントはストアから、Outllook on the webは管理者画面から)

Teamsアクセス制御調査

ゲストアクセスと外部アクセスの概念があり

ゲストアクセスとは?

docs.microsoft.com

・自組織以外の人を、Teamsに参加させる機能
・チームとチャネルの操作や機能にフルアクセスできる
・メールアドレスがあればOK
・Office 365 Business Premium、Office 365 Enterprise、Office 365 Educationで利用可能
・ゲスト用のライセンスは不要
・1ユーザーあたり5人のゲストを呼べる
・デフォルトで無効

外部アクセスとは?

docs.microsoft.com

・自組織以外の人を、Teamsに参加させる機能
・許可、拒否はドメインで指定。
・利用できる機能は、ゲストアクセスと比較し限定的。(1対1チャットのみ)
・デフォルトは全ドメイン許可(オープンフェデレーション)

ポイント

・外部参加者の指定方法(ゲストアクセスはメールアドレス、外部アクセスはドメイン)
・参加した外部参加者の利用できる機能(ゲストアクセスはフル、外部アクセスは1対1チャットのみ)
・共同作業レベル、セキュリティポリシーにより、どちらか決定。
・ゲストアクセスは利用可能な機能を制限可能。

利用可能機能の比較表

docs.microsoft.com

f:id:pikesaku:20190722012045p:plain

f:id:pikesaku:20190722012105p:plain

オープンフェデレーションとは?

外部アクセス設定がデフォルトの場合の動作
f:id:pikesaku:20190722014521p:plain

外部アクセス設定ポイント

・許可ドメインドメインを指定すると、他ドメインは全て拒否される。
・拒否ドメインドメインを指定すると、他ドメインは全て許可される。

ゲストアクセスで許可した場合の動作

設定項目

f:id:pikesaku:20190722015909p:plain

動作メモ

・チームにユーザー追加で、O365未使用の外部ユーザーをゲスト参加要請
・外部ユーザーにメールでチーム参加URLが送信される。
・外部ユーザーがURLクリックするとO365ログイン画面に行くが、アカウント未作成のため、作成画面になる。
・作成するとアプリ or WebどちらでTeams使うか聞かれる。
★誰でも参加可能
f:id:pikesaku:20190722023015p:plain
・ファイル、Wikiタブも見える。
・チーム操作が可能

外部アクセスで許可した場合の動作

※ゲストアクセス無効、外部アクセスデフォルト=オープンフェデレーション状態

チームメンバー追加は出来ない。
f:id:pikesaku:20190722034714p:plain

O365メモ

インプレースメールアーカイブ機能とは

 www.biz2cloud.com

・バックアップでなく監査用の機能
・ユーザーが削除したメールも保持し訴訟/監査時に役立つ
・以下2機能を有効にする必要あり
 訴訟ホールド(全メールをアーカイブ)
 インプレース保持機能(条件指定してアーカイブ)
 インプレース保持と訴訟ホールド | Microsoft Docs
Skype for Businessコンテンツのアーカイブも可能
・Exchange Search機能は管理者向けメール検索機能
アーカイブは検索が速い
・インプレース保持有効化
 セキュリティ/コンプライアンス センターでアーカイブ メールボックスを有効にする | Microsoft Docs
・訴訟ホールド有効化
 メールボックスを訴訟ホールドの対象にする | Microsoft Docs
 
 

ユーザーのアーカイブフォルダとは異なるもの

・ユーザーのアーカイブは2016追加機能
 【Office 365新機能】Outlook 2016の[古いアイテムの整理]ですばやくメールをアーカイブする | できるネット
・ゴミ箱に捨てずアーカイブすると、メールボックスからはメールが消えるが検索可能

O365ことはじめ

参考URL

www.nextset.co.jp

独自ドメイン取得

 workドメインは年間1円!
 

O365申し込み

products.office.com

Office 365 Business Premium
を無料申し込み。期間すぎたら以下変更するかも。
Office 365 Business Essentials

O365セットアップ

DNSにMXとTXTレコード登録必要。
docs.microsoft.com

まあ、言われた通りに進めれば独自ドメインで使えるようになる。

ログインはここから

Office 365 ログイン | Microsoft Office

Webスクリピングサンプルコード

大変だった。。。待機が重要。

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time

RETRY = 5

def select_by_xpath(wd, xpath, text):
    # nameで指定
    em = wd.find_element_by_xpath(xpath)
    # selectタグの値をテキストで指定
    em = Select(em)
    # optionsでselect選択肢を取得可能
    #for i in em.options:
    #    print(i.text)
    em.select_by_visible_text(text)


def click_by_xpath(wd, xpath):
    # elementがクリック可能になるまで待つ必要あり。そうしないと以下エラーが不定期に出る。
    # selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
    # http://www.seleniumqref.com/api/python/conditions/Python_presence_of_element_located.html
    # 結局waitとループで対処
    cnt = 1
    wait = WebDriverWait(wd, 30)
    while True:
        if cnt >= RETRY:
            print('Error: click_by_xpath failed: ' + wpath)
            exit()
        try:
            em = wait.until(expected_conditions.visibility_of_element_located((By.XPATH, xpath)))
            em = wait.until(expected_conditions.element_to_be_clickable((By.XPATH, xpath)))
            em.click()
            break
        except:
            print('Warn: click_by_xpath retryed: ' + xpath)
            cnt += 1
            time.sleep(0.5)


def click_by_xpath_with_scroll(wd, xpath):
    # 読み込み失敗したらスクロールダウン
    cnt = 1
    wait = WebDriverWait(wd, 30)
    while True:
        if cnt >= RETRY:
            print('Error: click_by_xpath_with_scroll failed: ' + wpath)
            exit()
        try:
            em = wait.until(expected_conditions.visibility_of_element_located((By.XPATH, xpath)))
            em = wait.until(expected_conditions.element_to_be_clickable((By.XPATH, xpath)))
            em.click()
            break
        except:
            print('Warn: click_by_xpath_with_scroll retryed: ' + xpath)
            wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            cnt += 1
            time.sleep(0.5)


def get_last_page(wd):
    time.sleep(5)
    xpath = '//a[@ng-click="setCurrent(pageNumber)" and @class="ng-binding"]'
    em = wd.find_elements_by_xpath(xpath)
    return em[-1].text


def scraping():
    options = webdriver.ChromeOptions()
#    options.add_argument('--headless')
#    options.add_argument('--window-size=1280,1280')
    wd = webdriver.Chrome(options=options)
    wd.implicitly_wait(20)
    wd.get('https://access.redhat.com/errata')

    # プロダクト選択
    # ボタンを押してからでないと、選択肢を選べない
    click_by_xpath(wd, '//div[@class="col-sm-3"]/div[@class="dropdown more-wrapper"]/button[@id="dropdown-other-filters-portal-product"]')
    click_by_xpath(wd, '//li[text()="Red Hat Enterprise Linux"]')

    # OS選択
    click_by_xpath(wd, '//div[@class="col-sm-3 chosen-wrapper" and contains(@ng-hide, "portal_product_variant")]/div[@class="dropdown more-wrapper"]/button[@id="dropdown-other-filters-portal-product"]')
    click_by_xpath(wd, '//li[text()="Red Hat Enterprise Linux Server"]')

    # バージョン選択
    click_by_xpath(wd, '//div[@class="col-sm-3 chosen-wrapper" and contains(@ng-hide, "portal_product_version")]/div[@class="dropdown more-wrapper"]/button[@id="dropdown-other-filters-portal-product"]')
    click_by_xpath(wd, '//li[text()="6"]')

    # アーキテクチャ選択
    click_by_xpath(wd, '//div[@class="col-sm-3 chosen-wrapper" and contains(@ng-hide, "portal_architecture")]/div[@class="dropdown more-wrapper"]/button[@id="dropdown-other-filters-portal-product"]')
    click_by_xpath(wd, '//li[text()="x86_64"]')

    # 表示行を最大に
    select_by_xpath(wd, '//select[@ng-model="pageSize"]', '100')

    # 最後のページ数を取得
    last_page = get_last_page(wd)

    # テーブル情報取得
    for i in range(int(last_page)):
        i = i + 1
        xpath = '//a[@ng-click="setCurrent(pageNumber)" and @class="ng-binding" and text()="' + str(i) + '"]'
        click_by_xpath_with_scroll(wd, xpath)
        html = wd.page_source
        bs = BeautifulSoup(html, 'html.parser')
        table = bs.findAll('table', {'id': 'DataTables_Table_0'})[0]
        rows = table.findAll("tr")
        for row in rows:
            for cell in row.findAll('span', {"class": "cell-content"}):
                print(cell.get_text())
        time.sleep(1)
    wd.quit()


if __name__ == '__main__':
    scraping()

Xpathのパス指定メモ

パス省略(//)は複数使ってもOK?

サンプルコード

# -*- coding: utf-8 -*-
from lxml import html

a = """
<html>
    <head>
        <title>Sample</title>
    </head>
    <body>
        <div>
            <h1 class="title1">Sample #01</h1>
        </div>
        <div>
            <h1 class="title2">Sample #02</h1>
        </div>
        <div>
            <h1 class="title3">Sample #03</h1>
        </div>
    </body>
</html>
"""

print('### フルパス指定')
a = html.fromstring(a)
b = a.xpath("/html/body/div/h1")
for i in b:
  print(i.text)
print('')


print('### フルパス指定+条件付き')
b = a.xpath("/html/body/div/h1[@class='title1']")
for i in b:
  print(i.text)
print('')


print('### 省略パス// 指定')
b = a.xpath("//h1[@class='title1']")
for i in b:
  print(i.text)
print('')


print('### 2重省略パス// 指定')
b = a.xpath("//body//h1[@class='title1']")
for i in b:
  print(i.text)
print('')


print('### ワイルドカード指定')
b = a.xpath("/html/*/*/h1[@class='title1']")
for i in b:
  print(i.text)
print('')


print('### 間違った省略パス指定')
b = a.xpath("//body/h1[@class='title1']")
for i in b:
  print(i.text)
print('')


print('### 間違ったワイルドカード指定')
b = a.xpath("/html/*/h1[@class='title1']")
for i in b:
  print(i.text)

実行結果

### フルパス指定
Sample #01
Sample #02
Sample #03

### フルパス指定+条件付き
Sample #01

### 省略パス// 指定
Sample #01

### 2重省略パス// 指定
Sample #01

### ワイルドカード指定
Sample #01

### 間違った省略パス指定

### 間違ったワイルドカード指定