UTFとか文字コードの話とExcelやpowershellなどのアプリケーション対応を調べた

迂闊ながら職場で"SJISでデータ下さい"って言ったらゴミを見るような目で見られたので調べます(メールでデータ送るから、って言われたから流れでSJISって言っちゃったねん

登場人物(文字コード編)

UTF-8

UTF-8と言っても2つあり、BOMありとBOMなし。BOMというのはバイトオーダーマークで、これがあればプログラムがファイルを読み込むときに確実にUTF-8と分かるが、BOM付ファイルを1バイト目から実データ部分と扱って処理しようとすると死亡する。なおExcelUTF-8(BOM付)なら文字化けせず開けるらしい

UTF-16

wikipediaさんによると、UTF-16は5種類あるらしい。

BEとLEというのはビッグエンディアンとリトルエンディアンというもので、実装方法(?)によって差があるあるらしいが、ファイルが読み込めるか否かはBEやLEに関係なく、BOMが目印になるか、そもそもUTF-16に対応したファイルかによる様子。

どうもWindowsの世界ではUnicode = UTF-16 LEになる様子。UTF-16はBOMなしだとBEと判定されるらしい。となると、UTF-16 BE,UTF-16 BOMなし(BE)の違いが分からなかったので、UTF-16 BOMなし(BE)は除外して調べる。

登場人物(プログラム編)

  • Excel 2016:時に方眼紙、時にユーザー一覧出力先とITの世界で大活躍する一線級ソフトウェア
  • サクラエディタ:私の愛する最強エディタ。インストール不要で客先にも持ち込みやすい
  • メモ帳:ゴミだがサーバーにはこれしかない事多し。
  • powershell ISEのエディタ部分:実はサーバー上でメモ帳以上に使えるもう1つのエディタ。正規表現も使えるよ
  • VisualStudioCode:powershell ISE以上のエディタ。1度慣れるとISEには戻れないしサクラエディタの地位も怪しい。起動に1秒くらいかかるのが欠点。
  • powershell v5:cmd.exeを過去のものにしたWindows標準のコマンドラインツール。サーバーへのリモートアクセスからWebスクレイピングもがんばりゃ出来る優れもの。

チェック結果

読み込み

- Excel 2016 サクラエディタ メモ帳 ISEエディタ部分 vscode ps v5
UTF-8 × × △ ※1 △ ※2
UTF-8(BOM付)
UTF-16 BE × × × × ×
UTF-16 LE × × × × ×
UTF-16 BOM BE ×
UTF-16 BOM LE
  • ※1 自動判別できない。読み込んだ後、手動で文字コードを指定すれば読み込み可能
  • ※2 -Encording オプションを明示的に指定する事で読み込み可能

書き出し

- Excel 2016 サクラエディタ メモ帳 ISEエディタ部分 vscode ps v5
UTF-8 × × × △ ※5
UTF-8(BOM付) △ ※3 ○ ※4
UTF-16 BE × × × × ×
UTF-16 LE × × × × ×
UTF-16 BOM BE × ○ ※4
UTF-16 BOM LE ○ ※4 ○ ※4
  • ※3 2016年10月の最新版Excelcsv形式のみエクスポート可能
  • ※4 タブ区切り形式のみエクスポート可能
  • ※5 開いた文字コードと同じ形式でしか保存できない
  • ※6 -Encording オプションを明示的に指定する事で読み込み可能

結論と注意点

  • WindowsではUTF-8(BOM付)か、UTF-16 BOM付 LEを使えば、基本的に読めない事はない
  • サクラエディタUTF-8で保存する際、デフォルトではBOMにチェックが入っておらずBOMなしで保存されてしまうので注意
  • Excelで作成したデータをUTF-8(BOM付)、UTF-16 BOM付 LEに保存する際は、一度SJISなどで保存してからメモ帳で変換するのがよい(MS公式もアナウンスしている)
  • powershellで-encordingに何も指定しないと、unicode(UTF-16 BOM付 LE)で保存される
  • となると全てのファイルをunicode(UTF-16 BOM付 LE)で保存すればいいじゃんと思ったりしてしまうが、UTF-8に比べてファイルサイズが1.5倍くらいになってしまうので悩ましい
  • よって場面によっては多少面倒だが、UTF-8(BOM付)で保存するのがよい

参考

Powershell で文字コードを変更する(clip.exe へのリダイレクトもね)

「Azure AD Connect のシングル サインオンは冗長化できない」と誤解していた話

ちょっと前に「Azure AD Connect(AADC)使ってシングルサインオン出来るぞー!もうADFS必要ないんじゃーい!」みたいなニュースがありました。

これ見て、すげー!と思ったものの「AADCって冗長化サポートされてないじゃん…そんなんに認証基盤任せられるかよ…解散」となっていましたが。記事をよーく見たら冗長化サポートされていたのでした。(風呂入ってるときに「いくらなんでも冗長化されてないままリリースしないよな。もう1回確認しよ」と思って調べ直したのがきっかけ)

誤解1:AADCのシングルサインオン冗長化できない → できる

パススルー認証を運用環境デプロイで使用することを計画している場合は、別のサーバー (Azure AD Connect と最初のコネクタを実行しているサーバー以外) に 2 つ目のコネクタをインストールすることを強くお勧めします。

にある通り、

手順 1: コネクタをダウンロードしてインストールする

AADApplicationProxyConnectorInstaller.exe REGISTERCONNECTOR=“false” /q

手順 2: パススルー認証用にコネクタを Azure AD に登録する

.\RegisterConnector.ps1 -modulePath “C:\Program Files\Microsoft AAD App Proxy Connector\Modules\” -moduleName “AppProxyPSModule” -Feature PassthroughAuthentication

とします。Azure AD側で複数のコネクタが存在すると認識し、使用できるコネクタに対して認証要求を投げるようです。ここらへんはAzure AD Health Serverとか使ってるのかな?

誤解2:AADCのシングルサインオンが使えない場合、Office365にログインできない → できる

仮にAADCが全て停止した場合、AzureADの認証先であるAADCが使えないためO365にログインできない…と思ってましたが、これはADFSの発想でした。AADCの場合、サービス停止時は、単純にO365に直接ログインする形になるようです。

シームレス SSO は便宜的な機能であり、何らかの理由で失敗した場合、ユーザーのサインイン エクスペリエンスはその通常の動作に戻ります。つまり、ユーザーはサインイン ページでパスワードを入力する必要があります。

ADFSと違ってO365上のドメインがFederetedにならないので、このような動作になるんですね。そういった意味ではADFSを冗長化するよりも耐障害性が強いと言えます。

これらを考慮すると、Azure AD Connectシングルサインオン構成は利点しかない、という事が分かりました。強いて言うなら、AADC稼働中と障害中でユーザーのオペレーションが違うという事くらいですが、ほとんどの会社では気にしないでしょう。

まだプレビュー機能だし、OutlookSkypeなどの動作も確認する必要がありますが、早くGAして検証したいです。

第19回 Office 365 勉強会:感想

第19回 Office 365 勉強会というのに行ってきました。初参加でした。気になったところだけ感想です。

今の Office 365ってこんな感じ?

Groups/Teams周りと変わりつつあるO365サービスについて。

MyAnalytics

E5でついてくる機能。本命はMyAnalyticsの企業版であるWorkPlaceAnalyticsらしい。MSとしてはこの機能をプッシュしたいらしい。ということで、僕個人の会社アカウントもMyAnalyticsが有効になっているのだが、正直使えないという印象がある。というのは、Outlookの予定表を正としてデータ分析をしているのだが、午前半休だからOutlookの予定表に"午前半休"と4時間くらいの予定をぶっこむと、それを"会議"と認識したりする。原因として、Outlookで予定を作成する時に、"空き時間",“予定あり”,“外出中"くらいしかまともな選択肢がなく、細かい属性に落とし込めない。これが他社のスケジューラーだともうちょい選択肢があったりするのだが…。一案として、Outlookの"分類"をGPOで縛って特定の選択肢を必ず表示するようにし、それをユーザーが選ぶことを強制させる事があるが、それをMyAnalyticsに連携するのは無理なんだろうな…。

また「会議中にメールを送る事は悪なのか?」「メールは送ってないかもしれないけど、IMはしてるかもしれないし、ネットサーフィンしてるかもしれない。IMやネットサーフィンはMyAnalyticsでは検知できない」など、いろいろとツッコミがある。少なくとも、その会議が「有用かどうか判定」は、会議中の内職の内容を全て把握し、それが会議から派生した事柄かまでを判定しないといけないので、現状もこれからも正直厳しいと思う。

…と僕は感じており、MyAnalyticsのAIに対する納得感がないので、アドバイスを信用できない、という感情になる。WorkPlaceAnalyticsのリリース時にそれらがどこまで改善できているかが気になりますが…。

Flow/PowerApps/Forms周りの話、社内のpoweruserを味方につける

Flowくらいしか使ってないので正直実感がないですが、便利は便利なんだろうな、と思います。1点気になるのはNotes → Sharepoint移行の時によくある「昔○○さんが作ったワークフローを勝手に使ってるんですよー。辞めちゃって誰も仕組み分からないんですけど」や「Notesのアプリってたくさんあるけど何が使われてるかよくわからないから、念のため全部移行したいよね」問題。便利さの対極に発生する問題なのでどうしようもないが、情シスが管理できないサービスの利用が進めば進むほどOffice365へのロックインが進んで、他社サービスに移行し辛くなる気がするな。

なので展開にあたってはある程度ガバナンスを利かせたい。例えば、1人5つまでしかFlowを作れないようにするとか(適当)。そうすれば、実際に使っているFlowだけが残りやすくなる。あと1年毎に棚卸をして、不要なFlowやPowerAppsは消すとか。けどそれが出来ないから各社Notes移行の時に苦労してるんだろうな。

この辺りをMyAnalyticsで通知してくれればいいかも。例えば「このFlowは○ヵ月トリガーを検知していません」とか「このフローは動いていますが、リアクションを取っているユーザーがいません。」とか。Teamsには非アクティブのチームを自動的に削除する設定が追加されるらしいし、ILMも意識した管理者設定が出来れば助かるな。

Hololens…ではなくPowerBIの話

Hololensデモはテンションが上がる!もうなんでもかんでもHololens使ってデモしようw PowerBIの話。PowerBIもそうだが、Teams,Flow,PowreAppsも使ってみようと思わないと使えない。受け身では使えない。例えばWindowsフリーソフトたくさん入れてるような人は自然に使うだろうし、そうじゃない人は使えない。現状、うちの会社もExcel中心で業務をやっているが、その中でPowerBIを使った方が便利なものはどんどん移管していくべきだな、と思ったとはいえ、こういう系のデモだとBtoCの想定が主であるため、BtoBが中心のSIerでどうやって使おうかなぁ…と考えつつ、結局使ってないのが現状です。

私、PowerBIとかPowerAppsってあんまりワクワクしなくて、管理者設定系の方が気になっちゃいます。管理者があれこれ試行錯誤して、ユーザーの皆様にサービスを提供するような。それは多分職業柄ってのと、その方が俺が面白いじゃん、って事かな。ユーザーがPowerBIとかPowerApps使ってゴリゴリやる方がみんなが面白いよね、ってのは頭じゃ分かってるんですけど。

あーけどFlowなんかは自分で使ってみてすげー便利だと思うからみんなにも進めたいと思うし、やっぱPowerBIとかPowerAppsの便利さが自分で分かってないだけなのかな…。うーん。

SfBBotの話

自分でがんばって作ろうとして挫折してたので非常に助かりました!!!めっちゃよかった~。開発者じゃないので、お作法系が分からず詰まってましたがこのセッションを受けたからには必ず作りきろうと思います。

座談会

印象に残ったのは、Office 365で障害が発生した時にどう伝える?というのと、Sharepointをファイルサーバーに出来るのか、という点。前者は、大声で伝えるとか電話で連絡するとかFAXするとか、昭和の古典的なソリューションで面白かったです。弊社の場合、Office 365に限らずシステムがよく落ちるので(…)「なんか調子悪いなー」「今メール見れないっぽいよ」「んじゃ飯行こう」で終わりそうです。。。Sharepointファイルサーバー問題は、現行のファイルサーバーの闇の深さによると思ってて、闇が深いとSI側も闇にとらわれる、というイメージ…。あとは使い勝手ですね。やっぱエクスプローラーでファイル一覧みたいじゃん、ブラウザ不便じゃん、と。僕はOD4B同期ツールを使ってドキュメントライブラリを同期する事でエクスプローラー閲覧を実現しているのですが、ドキュメントライブラリに大容量ファイルを置かれてたまに死にます。ファイルサーバーをそのまま移行というより、SPOのメリット・デメリットを把握した上で、ユーザーの使い方も変える前提で展開しないとクレームになると思います。

以上です。

初めての勉強会で馴染めるか不安でしたが、良い意味でセミナーみたいで、内輪なアットホーム感もありつつ初めての人を歓迎する雰囲気もあり、よかったです。座談会でディスカッション出来て、みんな同じような事に悩んでるんだな、と分かりました(Microsoftさんなんとかしてください。)

レポ書くのに写真1枚も撮ってない事に気づきました…。せめてお菓子くらいは撮影しとけばよかったです。次回参加時の反省にします。

Azure上に作成した仮想マシンを作業時だけサイズ変更して快適に利用する(その他仮想マシン作成後のメモ)

Azure上の仮想マシン、最低サイズのBasic_A0だと料金は約1000円/月なのですが、これだとまともに操作できないレベルに遅い。快適に操作するならBasic_A3くらいだが、約5000円/月くらいとなり辛い。

作業時以外はマシンをシャットダウンして課金を抑えるのもいいが、ADのような常時起動前提のサーバーの場合、長期間シャットダウンするとトラブルの元となるため、作業時のみサイズ変更をして終わったら元に戻すスクリプトを作成する。

powershellでログイン

スクリプトのみで自動ログインをする場合、こちらとなる。

$secpasswd = ConvertTo-SecureString "[パスワード]" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("[ID]", $secpasswd)
Login-AzureRmAccount -Tenant "[テナントID]" -Credential $mycreds -ServicePrincipal

ただし上記は組織アカウント(xxx@テナント名.onmicrosoft.comのようなアカウント)を使った場合で、マイクロソフトアカウント(xxx@gmail.comとかxxx@yahoo.comとか、MS以外のアカウント)の場合、上記手順は使用できず、単純にLogin-AzureRmAccountで対話的にログインする必要がある。

ではマイクロソフトアカウントでAzureを契約(会社で契約しない限りそれが普通)した場合はどうなるか?以下のブログにある通り、最初にテナントを作成したのがマイクロソフトアカウントの場合、サブスクリプションもそれに紐づいているので、組織アカウントを共同管理者として設定する必要がある。

Azure PowershellMicrosoftアカウントを利用してのAdd-AzureAccountについて https://social.msdn.microsoft.com/Forums/ja-JP/fd253f40-539a-46c0-8fd2-0500f8712918/azure-powershellmicrosoftaddazureaccount?forum=windowsazureja

サイズ変更

仮想マシンのディスク サイズを Azure PowerShell から拡張する方法 - Japan Azure Technical Support Engineers' Blog https://blogs.technet.microsoft.com/jpaztech/2016/04/18/azure-vm-disk-resize/

Azure 仮想マシンPowerShellからスケールアップする - 浅草橋青空市場 http://asazure.hatenablog.jp/entry/2015/08/24/173456

を参照に

スケールアップ

$vmconfig = get-azurermvm -name [マシン名] -ResourceGroupName [RG名]
$vmconfig.HardwareProfile.VmSize = "Standard_A3"
$res = Update-AzureRmVM -ResourceGroupName [RG名] -VM $vmconfig
if($res.StatusCode -ne "OK") {"StatusCodeがOKではありません"}

スケールダウン

$vmconfig = get-azurermvm -name [マシン名] -ResourceGroupName [RG名]
$vmconfig.HardwareProfile.VmSize = "Basic_A0"
$res = Update-AzureRmVM -ResourceGroupName [RG名] -VM $vmconfig
if($res.StatusCode -ne "OK") {"StatusCodeがOKではありません"}

サイズ変更~マシン再起動までを実施するのでコマンド終了まで数分かかる。

余談:OS停止/起動

Azure PowerShell にて新ポータル (ARM) の VM を自動的に停止・開始・再起動する - Japan Azure Technical Support Engineers' Blog https://blogs.technet.microsoft.com/jpaztech/2016/02/23/vmstop-start-restart/

Stop-AzureRmVM -ResourceGroupName [RG名] -Name [マシン名] -Force
Start-AzureRmVM -ResourceGroupName [RG名] -Name [マシン名]
Restart-AzureRmVM -ResourceGroupName [RG名] -Name [マシン名]

メンバーサーバーなど使用しないとき以外はシャットダウンするマシンはこちらを使う

余談:OSデプロイ後の日本語化

OSデプロイ後は言語もタイムゾーンも全て英語で、細かい設定をいろいろ実施しなければいけないのですが…全てスクリプトで完結されている神がいました。ありがとうございます。

Azure IaaS 上に作成した Windows Server 2016 仮想マシンの UI を日本語化する | 焦げlog http://kogelog.com/2016/10/18/20161018-01/

Azure VM の日本語 UI を PowerShell で設定 at SE の雑記 http://blog.engineer-memo.com/2013/11/24/azure-vm-%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E-ui-%E3%82%92-powershell-%E3%81%A7%E8%A8%AD%E5%AE%9A/

余談:ADへの昇格

Windows Server 2016 で AD DS (Active Directory Domain Services) のセットアップ | blog.yottun8.com

Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools

AD DS のドメイン コントローラーへの昇格 | blog.yottun8.com

$password = ConvertTo-SecureString -String "[パスワード]" -AsPlainText -Force

Install-ADDSForest -DomainName "almea.jp" `
-DomainNetbiosName "ALMEA" `
-ForestMode "WinThreshold" `
-DomainMode "WinThreshold" `
-SafeModeAdministratorPassword $password `
-DatabasePath "C:\Windows\NTDS" `
-LogPath "C:\Windows\NTDS" `
-SysvolPath "C:\Windows\SYSVOL" `
-CreateDnsDelegation:$false `
-InstallDns:$true `
-NoRebootOnCompletion:$false `
-Force:$true

余談:AADCのインストー

Azure AD Connect: カスタム インストール | Microsoft Docs https://docs.microsoft.com/ja-jp/azure/active-directory/connect/active-directory-aadconnect-get-started-custom

O365でアプリケーション登録→APIアクセスの続き

認証コード取得の自動化を検討

認証コードは取得から一定時間経過すると無効になってしまうので定期的に取得したい。前回書いた通り

  1. 以下のフォーマットで認証エンドポイントにアクセス
  2. このようなレスポンスがあれば成功

と、やりたいのはレスポンス先のURL(リダイレクト先URL)に含まれる認証トークン文字列の取り出してある。

Invoke-WebRequestで取得を試みる

Invoke-WebRequest -url "https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&client_id=[クライアントID]&resource=https%3a%2f%2foutlook.office365.com%2f&redirect_uri={リダイレクトURL}"

を実行し戻り値にリダイレクト先のURLが含まれていないか調べたが、存在しなかった。

"リダイレクト先 url 取得"はどの言語でも話題になっており、例えばURLステータスコードが302だからURLを追跡するなどの方法が書いてあったが、上記アクセスは200で返ってくるので追いようがない(というかリダイレクト処理じゃないし)

で、気づいたのが、これはリダイレクト先のWebサイトで開発を行い、ブラウザからのアクセスが発生した場合、code=[認証トークン部分]を自動的に取り出すようなプログラムを実装する必要があるとわかった。今回、ローカルのPC環境から実行したいだけなので、まさかこれだけのためにローカルにWebサーバー立ててプログラム開発するのも面倒なので、手動取得する事にした。

※ 認証API v2.0 だと302で返ってくるらしい

ExchangeOnlineにアクセス

認証コードは手で取る事にして、前回のブログの「4. プログラムからアクセス」でaccess_tokenをゲットします。

$response = Invoke-RestMethod -uri $url -Method Post -Body $body -ContentType $ContentType
$response.access_token #> アクセストークン

このアクセストークンをヘッダーに含めてアクセスします。

$headers = @{
  "Accept" = "Application/json"
  "Authorization" = ("Bearer " + $response.access_token)
}
$ContentType = "Application/json"

例えば、受信トレイの最新10件を取得するスクリプト

Invoke-RestMethod -uri "https://outlook.office.com/api/v1.0/me/folders/inbox/messages?$top=10" -Method Get -ContentType $ContentType -Headers $headers

例えば、JSONファイルの中身の予定を登録するスクリプト(詳細は別エントリで書きます)

Invoke-RestMethod -Uri "https://outlook.office365.com/api/v1.0/me/events"  -Method Post -InFile ".\jsontest.json" -ContentType 'application/json' -Headers $headers

が実行できます。

こうなると、繰り返し処理していろいろやりたいところなのですが、アクセストークンには時限があるので定期的に再取得してやる必要があります。めんどくさ…。やっぱv2でアクセスしないといけないのか…。

O365でアプリケーション登録→APIアクセスしようとして

はまったわー

やりたいこと

  1. Office365を契約
  2. AzureADにアプリケーションを登録
  3. アプリケーションのアプリケーションID,秘密鍵を使ってアクセストークンを取得
  4. プログラムからアクセス

1. Office365を契約,AzureADにサインアップ

O365はE5を契約。

Office 365 Enterprise E5

サインアップ後、裏でデプロイされたAzureADにアプリケーション登録しようとAzureクラシックポータルにアクセスするが、AzureADサインアップ時にエラーになる。

パターン1. サインアップでエラー

電話による認証、クレジットカードによる認証を進めたところ、サインアップでエラーになった。原因不明。

パターン2. 電話による本人確認でエラー

そんな事を繰り返していたら、電話認証で番号を入れたタイミングで「アカウントを確認できませんでした。サポートにお問い合わせください。 」というエラーが出るようになった。想像だが、同じ電話番号で何度も認証していたらこのエラーが出るのではないか。証拠として、適当な電話番号を入力したときはエラーが出ずに認証コード入力画面になった(その番号の人、すいません)

2. AzureADにアプリケーションを登録

AzureADにアプリケーション登録をする手順は3つあるようです。

  1. Azureクラシックポータルから登録
  2. Azureポータル(以前、プレビューと言われていたものから登録)
  3. Office 365 ユーザーとエンタープライズ ユーザーのサインインを可能にする – Microsoft ID プラットフォームから登録

1.は今までのセオリーだったもの。

2について。最近、AzureクラシックポータルからAzureポータルへの機能移転が進んでおり、旧来Azureクラシックポータルでやっていたアプリ登録もAzureポータルから出来るようになったようです。

Microsoft Azure Portal

左ペインのAzure Active directory -> アプリの登録 -> +追加からアプリを登録。適切な権限を付与してキーを作成する。ただし、この機能はプレビュー版なので動作が怪しい可能性があります。(今回は大丈夫だったぽい)

んで、3はいったいなんなの?という話ですが、どうやらMSは商用のOffice365も私用のOutlook.comも同じコードで開発できるよう、RESTのエンドポイントを統一し、組織アカウントでログインすれば商用O365を、個人アカウントでログインすれば、Outlook.com側を触るようなAPIを実装しているらしい。

v2.0 endpoint の OAuth を使った Client 開発 (Azure AD と MSA への対応) – Tsmatz

そのアプリ登録のフロントエンドが、上記リンクの「Microsoft ID プラットフォーム」というわけ。ここからアプリ登録すると、裏側の仕組みとしてはログインした組織アカウントのAzureADにアプリ登録されるだけ。しかも、現状では「Microsoft ID プラットフォーム」画面からはGraph API関連の権限しか付与できず、outlook APIの権限はコントロールできない様子。

将来的に、製品個別のAPIがGraph APIに統一されるのを見越せば、本命は「Microsoft ID プラットフォーム」なんだろうけど、現時点では特別にこれを使う理由はなさそうです。

認証API v1.0 と v2.0について

よくわかってないです。

3. アプリケーションのアプリケーションID,秘密鍵を使ってアクセストークン(認証トークン)を取得

認証API v1.0での認証手順

Office 365 API 入門 – Tsmatz

  1. 以下のフォーマットで認証エンドポイントにアクセス
  2. このようなレスポンスがあれば成功

当初、リダイレクトURLとホームページURLを不一致としていたら、認証コードが取れなくてめちゃくちゃハマった。リダイレクトURLを"https://portal.office.com"に設定していたせいかもしれないが…。以下のようなレスポンスしか返ってこなかった。

https://www.office.com/1/?auth=2&home=1&from=PortalLanding&trial=1&client-request-id=bd26c05d-26aa-4b80-aaa2-6d79d770e88c

ひとまずマニュアル通り、https://localhost/myapp宛にリダイレクトする設定にした。ここでもハマって、どこかのサンプルでhttp://localhost/myappをリダイレクト先に指定していたのでコピペしたら、実はhttpsでないと全て無効なURLとなってしまうらしいことが分かった。どこにも書いてないんですが…。

認証API v2.0での認証手順

Get Started with the Outlook REST APIs - Outlook Dev Center

https://login.microsoftonline.com/common/oauth2/v2.0/authorize

  1. 以下のフォーマットで認証エンドポイントにアクセス

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=[クライアントID]&redirect_uri=[リダイレクトURL]]p&response_type=code&scope=[スコープ]]

スコープはこんな感じで指定する↓

v2.0 認証エンドポイント プレビューを使用した Office 365 API と Outlook.com API の認証 | MSDN

今回、自分で登録したカスタムアプリを認証API v2で認証しようとしたところ、ブラウザバーに

Application+[クライアントID]+is+not+supported+for+this+API+version.

という表記が返り、エラーとなってしまった。おそらく、アプリケーションにめちゃくちゃ権限を付与してしまい、その権限のうち1つが認証API v2ではノンサポだからではないか。…となると、認証APIのバージョンによって使える機能も違うという事?認証API 1.0専用の権限をアプリに付与してしまうと、認証API 2.0で許可されない?

ということで、認証API v1.0だけで進めることにします。

メモ:参考にした記事

v2が出て一年以内だからか、v1とv2が混在してるのでややこしい。

4. プログラムからアクセス

3.で取得した認証トークンを元に、postを投げてやる

$url = 'https://login.microsoftonline.com/common/oauth2/token'

$Body = @{
  "grant_type" = "authorization_code"
  "code" = [認証コード]
  "client_id" = [クライアントID]
  "client_secret" = [クライアント秘密鍵]
  "redirect_uri" = "https://localhost/myapp"
  "resource" = "https://outlook.office365.com/"
}

$ContentType = "application/x-www-form-urlencoded"

Invoke-RestMethod -uri $url -Method Post -Body $body -ContentType $ContentType

結果、

token_type     : Bearer
scope          : Calendars.Read Calendars.Read.All Calendars.Read.Shared Calendars.ReadWrite Calendars.ReadWrite.All Calendars.ReadWrite.Shared Contacts.Read Contacts.Read.All Contacts.Read.Shared Contacts.ReadWrite Contacts.ReadWrite.All Contacts.ReadWrite.Shared Directory.AccessAsUser.All Directory.Read.All 
                 Directory.ReadWrite.All email Exchange.Manage Files.Read Files.Read.All Files.Read.Selected Files.ReadWrite Files.ReadWrite.All Files.ReadWrite.AppFolder Files.ReadWrite.Selected full_access_as_user Group.Read.All Group.ReadWrite.All IdentityRiskEvent.Read.All Mail.Read Mail.Read.All Mail.Read
                 .Shared Mail.ReadWrite Mail.ReadWrite.All Mail.ReadWrite.Shared Mail.Send Mail.Send.All Mail.Send.Shared MailboxSettings.ReadWrite Notes.Create Notes.Read Notes.Read.All Notes.ReadWrite Notes.ReadWrite.All Notes.ReadWrite.CreatedByApp offline_access openid People.Read People.ReadWrite profile 
                 Reports.Read.All Sites.Read.All Sites.ReadWrite.All Tasks.Read Tasks.Read.Shared Tasks.ReadWrite Tasks.ReadWrite.Shared User.Read User.Read.All User.ReadBasic.All User.ReadWrite User.ReadWrite.All
expires_in     : 3600
ext_expires_in : 0
expires_on     : 1478335851
not_before     : 1478331951
resource       : https://outlook.office365.com/
access_token   : アクセストークン
refresh_token  : リフレッショトークン
id_token       : IDトークン

権限めっちゃついてるw 自分でつけたんだけど…。

注意

サンプルコードに"resource"の指定がなかったため抜かすと、

"error":"invalid_resource","error_description":"AADSTS50001: Resource identifier is not provided.\r\nTrace ID

みたいなエラーが出た。エラーコード"AADSTS50001"でググると以下のURLがヒット(ppt注意)

Cloud Authentication Troubleshooting and Recipes for Developers

結論としては、resourceの指定は必要でした。

疲れたので今日はここまで。

Microsoft Tech Summit 2016に行ってきたメモ

行ってきました。

Microsoft Tech Summit|Microsoft

月並みな表現だけどエキサイティングでした。地に足の着いた技術と未来の技術がセットになってて面白かったです。

Day1

キーノート

11:30-12:20 Office 365 で実現する一歩先の情報漏えい対策(SEC002)

  • 最近のクラウド時代の流行り→CASB:Cloud Access Security Broker
  • クラウドに侵入されたら検知したいけど、ふつーの環境だと平均200日くらい経ってから気づくのでやられたい放題
  • そこでOffice 365 Advabced Security Management
    • 怪しいOffice365ユーザーを見つけて、管理者に通報する機能
    • ありえない移動とか、大量のファイルのダウンロードなどを検知
  • 管理者がやることはたった3つ
    1. 高度なセキュリティの管理を有効にする
    2. アラートメールが来たらポータルで確認する
    3. 脅威と認められたらユーザーを制御
  • Cloud App Security
    • シャドウITの検出。サードパーティー製も含む、SaaSアプリケーションの監査
    • FWのログをアップロードすればIP分析して、facebookとかGoogle使ってるかを検知もできる
    • Demo:Boxで外部ファイル共有を行ったユーザーのアクティビティを検出し、ファイルの共有設定を削除する
      • このデモは違和感。会社がユーザーがBoxを使っている事を把握した前提じゃん?
      • 結局会社がマジで知らないSaaSアプリは管理できないんじゃ?
        1. FWのログをアップロードして、社員が使っているSaaSアプリを一覧化
        2. そもそもアクセスしちゃダメなSaaSアプリはブロック
        3. その他のアプリは制御
      • という感じ?
      • SRに聞いてみよう(★Todo1)
    • O365の対象はExOL,SPS,Sharepoint Activity API?って書いてたけど
    • O365 ASMはこれのO365部分だけを抜き出したもの、みたいな
  • ライセンス
    • Advanced Security Management:E5付属。単品で300円/人
    • Cloud App Security:EM+S E5付属。単品で売ってる?
      • 組織にE3とE5のユーザーが混在してたりする場合はどうするんだろう?
      • SRに略(★Todo2)
  • アクティビティログ:180日保持 アラート:永久保存
  • アクティビティログはエクスポート可能
  • 使用できるOffice365ライセンスはE5

12:45-13:35 Azure ネットワーク設計と運用のツボ(DEP005)

  • 多分このセッションはスライド資料の方が理解が深まる
  • パブリックIPなくても中から外に繋がる。
  • サブネットに対してNSGをつけられる。(仮装マシン個々につけてもいいがサブネットにつける方が自然
  • NSGないとつるつる
    • 絶対にNSGを削除しないでね
  • ユーザー定義ルート
    • サブネットの内側に定義できるルーティング設定
    • 複数NICマジ無駄。オンプレと違って倍速とかならない
  • リージョン間の距離
  • VNETピアリング
    • 複数のVNETを簡単に接続できる
    • 旧VNETと新VNETも繋げちゃう
      • なので旧でVNET組んだから移行できない…とかはない
    • 1GB一円
  • AXN
    • 超早い。40~50Gbps
    • そのうち全部のIaaSマシンに乗りそう
  • azure内の通信はMS内で閉じるが、CDN宛のものはインターネット出る
  • azureのipは毎週水曜日にリリースされている
  • VPNゲートウェイでBGPサポートしたから自由度増えた
  • インフラエンジニアもJSONでテンプレ作って展開しよう
    • そんでバージョン管理してInfrastructure as Code (IaC)
  • canary vm
  • ネットワークのサポートは絶対入ってね〜!!!

14:00-14:45 アイデンティティのMVPが語るAzureADとアプリ連携の勘所(SEC020)

  • ID管理を導入するにあたって注意すべき事
    1. 識別子
      • UPNは何か?(社員番号?)
      • ADのドメインは?(.local?)
    2. アプリケーションの認証プロトコル
    3. ネットワーク
      • 固定IPでFixできるのか?
    4. バイ
      • 会社でインベントリ管理できてる?
      • 個別で買ってきたもの使ってない?
  • 現実的な対応

    1. 識別子
      • アプリ向けの識別子属性をAzureADの拡張属性に保持し、カスタム属性マッピングを行う
      • 他の属性についてもマッピング(下部表1)
      • 注意:SAMLトークン属性について
        • アプリケーションが指定するフォーマットでSAMLのNameIDを返す必要がある。
      • もし要求に応じたフォーマットで値が返せず、自動的にUPNの名前が返ってしまう(下部表2)
      • SAMLに対応している」だけではダメ。
        • アプリケーションがtransientの場合、persistentの場合、そもそも対応していないのでマッピングが返せない。
      • おすすめ:firefoxアドオン:SAML tracer
    2. アプリケーションの認証プロトコル
      • OIDC/SAMLじゃないっす対応
      • 対応すまで待とう、は無理なので…
        • パスワードSSO
          • ブラウザにアドオンを入力し、ID/Passwordを代理入力
            • Chormeで自動でID/Pass覚えるのとあんま変わらん
          • ログインURLが静的じゃないとだめなど製薬あり
        • Azure AD WAP
          • Kerberosじゃないとだめ、などの制約
          • AzureADWAP + PingAccess連携(ヘッダー認証)
        • WAM連携
      • などに逃げる
      • WAN連携とヘッダー認証がよくわかってなかったので勉強する(★Todo3)
    3. ネットワークの問題
      • 拠点ネットワークを絞り込み、無理な場合は例外ユーザーとか作る。
        • マイナー拠点対応、偉い人対応、みたいな
    4. バイ
      • 聞きそびれた
  • 表1

AAD側 - アプリ側 -
UPN 123@foo.jp LoginID emp1234
displayname 山田太郎 displayname 山田太郎
ExtensionAttribute1 emp1234
  • 表2
属性 SAMLトークン属性
UPN nameid-fornat:unspecified
Mail nameid-fornat:unspecified
Onpremisessamaccountname nameid-fornat:WindowsDomainQualifiedName
ExtentionAttribute1-15 nameid-fornat:emailaddress
extractmailperfix() nameid-fornat:emailaddress

15:15-16:05 他と同じOffice365で満足ですか?Office365のAPIでオリジナルサービスに進化させる(APP009)

  • AzureADにアプリケーション登録
    1. 組織で開発中のアプリケーション
    2. クライアントID と クライアントキー取得
    3. アプリケーションのアクセス許可、デリゲートされたアクセス許可
    4. HTTP Request投げる → authコード取得
  • API叩けるよ
    • twitterやFBなど、最近メジャーなAPIの利用方法と同じ
  • 必要な権限だけ付与しないと、怪しいfb連携アプリみたいになっちゃうよ
  • 最近企業にウケるもの。Bot,AI,IoT。
  • Cognitive service,WebJob使って楽に面白く
  • APIでオリジナルサービスに進化させる
  • Exceed1の事例
    • 英単語勉強アプリ
    • Bossから来る英文メールの頻出単語をリストアップし、勉強できる
  • API利用のコツ
    • APIのスロットリングポリシーに気を付ける。エラーになったら時間を置く。
    • メールを操作する際にはGraphIDが頻繁に変更されるので、取りなおすのがよい。
      • ↑後からメモ見ると内容が分からんが、セッションを定期的に張りなおすとよい、と理解
  • Q1. outlook.とgraph.のAPIが混在している
    • A1. 今後graphに統一されるから特に理由なければgraph使ってね
    • 個人的にoutlookのv1がアプリ登録なしで叩けるので便利(twitterAPI 1.0みたいな)
  • Q2. SfBのドキュメントなくない?
    • A2 .ない。ってか分かりづらい。Skype Web SDKでやってね
    • 素のSkypeは企業向きじゃないんす
  • LUIS超楽
  • 関連:CogBot_CognitiveBotOverview_20161020 - Docs.com

16:30-17:20 AzureADでクラウドの認証基盤を統合したいけど、IDの安全性はどうする?(SEC008)

  • あんまりメモってない
  • 後でスライド期待

17:45-18:35 Cloud First、Mobile FirstにおけるID管理とは?-人(Identity)から始まるアクセス制御-(SEC004)

  • IDを分散させるとセキュリティが低下する
  • AzureADP使えばIP制限可能。アプリ毎にアクセス制御も可能
  • Intuneは進化中でiOSのIMEI登録して許可したデバイスからしかアクセスできないように出来る
  • すんませんあんまメモってない
  • ID系のセッションは後でまとめよう

Day2

9:00-9:30 PowerShellの新しい相棒 Visual Studio Code(APP017)

  • 'code .'でvscode起動
  • 拡張紹介
    • vscode-pandoc
    • PlantUML
      • UMP図を書く
  • デバッグにはlanuch.jsonというのが必要だが、自動で作成されるので意識しなくてもよい
  • PSISE開発チームメンバーとVScodeの開発チームメンバーが同じ
    • 日次でアップデートしてるよ
    • 日本からのフィードバック待ってるよ
      • SJIS開けないのどうにかしてほしい

9:55-10:25 お客様とパートナー様のOffice365導入・定着化を支援するFirstTrack Center(PRD013)

  • EOPとかATPにも対応している。Notesからの移行についても対応している(IMAPとは別で)
  • その他は知ってる事でした

10:50-11:40 Office365におけるID統合とアクセス制御のベストプラクティス(PRD004)

  • オンプレ組織とO365ディレクトリ同期のデザインパターンについて
  • 知ってる事だったけど、空ですらすら話せない(考えないと話せない)のでもうちょい浸透させよう
  • 利用リージョンが分かれるとき、最も近いデータセンターに接続される
    • 例えばO365日本テナントを米国で利用する場合、米国のCDNを引いて米国のO365フロントエンドにアクセスしバックエンドのMSネットワーク経由でデータを取り出す
    • よってインターネット帯域の消費はしない
    • ただし、O365ポータルとExOLのみ。SfB,SPOは近くのサイトに接続。
      • Onedriveはどうなんだろう…?
      • SRに(★Todo4)
  • Office365への他テナントへのアクセス制御もうすぐ来るぽい

12:00-12:45 [ランチ付き] Azure IaaS 応用編~実務で使えるVMとPaaSの組み合わせ~(SNR001)

  • ごめーん知ってる事ばっかりだった

13:10-14:00 プロトコルマニアックス~ OAuth 2.0/OpenID Connect/FIDO 2.0/SAML 2.0 違いと用途(SEC010)

  • SAML 2.0
    • RP Initiated
    • IdP Initiated
    • RP Initiatedがよく使われる。最初にAppにログイン試行する方法。
  • OAhth 2.0
    • facebook認証とかtwitter認証みたいなん
    • 表面上の話だと、アプリがIdPから取り出したい情報を定義できるのが大きい
    • OAuthの場合、必須情報以外はユーザーがアプリに渡さないことが出来る
    • アクセストークン:トークンを使ってユーザー情報を取り出す
    • リフレッシュトークン:トークンの有効期限が切れた時に、新しいトークンを発行する役割
  • SAMLとOAuthの違い
    • 情報を出すのがIdPか本人か
    • OAuthは認可をするプロトコルなので、アプリケーションは不安
  • OIDC
    • 2014年に登場
    • OAuthにユーザーの認証機能を組み込んだもの
    • OAuth2.0 + ID Token
  • 企業の話
    • 企業だからといって勝手にSAML2.0で個人情報出していいのか?OIDCで個人に確認を取って出すべきではないのか。
  • FIDO 2.0
    • 生体認証とかでサービスを使いたい
    • 「パスワード以外の選択肢」スライドが素晴らしい。
      • "パスワードはすぐ盗まれる"と言葉で言っても、こういうスライド1枚の破壊力
  • パスワードとPINの違い
    • ID(例:スマートカード)とPINの組み合わせ。物理デバイスに紐づくPINは1つであり、対応がマッチすればPC内で認証が完結する。
    • Trusted Platform Moduleに秘密鍵を保存する
    • ユーザーIDとPINを渡すと、TPMに保存されている秘密鍵にアクセスできる
    • 秘密鍵を利用して、サインイン要求に署名する。サーバー側で対応する公開鍵で複合する
  • まとめ
    • SAML 2.0よりOIDC 2.0
      • SAMLでユーザー認証すんじゃねぇ
    • ユーザー認証部分はFIDOが本命
    • FIDOでユーザー認証して、OIDCで認可(権限付与)する

14:25-15:15 クラウドで守る! Exchange Online の最新セキュリティ対策(PRD005)

  • EOP/ATPの話
    • だいたい知ってた
  • EOP新機能:Anti-spoofing protection
  • EOP新機能:Zero-hour Auto Purge: ZAP
    • EOPがスパムと認定した後でも、過去にユーザーが受信したメールをさかのぼって迷惑メールフォルダに移動する or 削除する
    • ただし未読のメールのみ
  • ATP
    • URL Trace機能
      • 現時点ではリストベースの判断。
        • マジかよ知らんかった
      • 今後は、実際に開いてページの中身を確認する(Sandbox)。動的であるので安全だが、ちょっと遅いかも?Linked Content Detonationというらしい
    • Dynamic Delivery
      • 今までだとATP通るのに5分~10分かかってしまう。これからは本文だけは送って添付ファイルは後から送る機能
        • これ欲しかった
  • ATPの拡張
    • ExOL以外にも広がってくよ~
      • 値段変わらないのかな?
  • DKIM署名対応
  • Q1. ATPって送信元によってATPする、しないを選べないの?
    • A1. 送信者が組織内のメールだとATPされない。それ以外だと問答無用でされる。

15:40-16:30 詳説 - Rights Management Services / Azure Information Protection(SEC016)

  • RMSの話
    • セルフサービスサインアップ
    • AAD使ってない個人が人から送られたRMSを読むために勝手にAAD登録すると、そのドメインがカスタムドメインとして登録されてしまう。
    • また、オンブレRMSがある環境だと、そのユーザーはオンプレとオンラインを同時に使えるようになってしまう。
      • が、メーカー非推奨なので、オンプレRMSが使えなくなったりするかもしれない。
    • これ、やばくねーか
  • それ以外は知ってる事でした

15:40-16:30 Xamarin と Azure で、超効率的にクラウドと繋がるモバイルアプリを作ろう!(APP005)

  • RMS途中退室してこっち
  • 人めっちゃいた
  • 楽しそうにデモしてるのが印象的でした
  • XamarinとAzure Mobile Appsでモバイルアプリ開発!

16:55-17:45 OMS Log Analytics によるビッグデータログの分析方法の解説と実演(DEP002)

  • 最近インフラやってないけどSCCMとOMSでこういう事出来たなら速攻導入したかった
  • Sandbox環境もあるので是非
    • URL忘れた

18:10-19:00 条件付きアクセスを徹底理解 - Azure Active Directory で実現する場所とデバイスの“条件付きアクセス制御”-(SEC007)

  • 他のID系のセッション出たので知ってる事ばかりだった

18:10-19:00 エバンジェリストが注目のこの人と語る IT キャリアの多様性と未来(SPL005)

  • コント…?
  • 面白かったです

参加したセッションまとめ

  • ID系
    • アクセス制御
      • Day1:16:30-17:20 AzureADでクラウドの認証基盤を統合したいけど、IDの安全性はどうする?(SEC008)
      • Day1:17:45-18:35 Cloud First、Mobile FirstにおけるID管理とは?-人(Identity)から始まるアクセス制御-(SEC004)
      • Day2:10:50-11:40 Office365におけるID統合とアクセス制御のベストプラクティス(PRD004)
      • Day2:18:10-19:00 条件付きアクセスを徹底理解 - Azure Active Directory で実現する場所とデバイスの“条件付きアクセス制御”-(SEC007)
    • デリバリ
    • 仕様
  • O365系
    • App
      • Day1:11:30-12:20 Office 365 で実現する一歩先の情報漏えい対策(SEC002)
      • Day2:14:25-15:15 クラウドで守る! Exchange Online の最新セキュリティ対策(PRD005)
      • Day2:15:40-16:30 詳説 - Rights Management Services / Azure Information Protection(SEC016)
    • Dev
      • Day1:15:15-16:05 他と同じOffice365で満足ですか?Office365のAPIでオリジナルサービスに進化させる(APP009)
      • Day2:9:00-9:30 PowerShellの新しい相棒 Visual Studio Code(APP017)
    • Ope
      • Day2:9:55-10:25 お客様とパートナー様のOffice365導入・定着化を支援するFirstTrack Center(PRD013)
  • Azure系
    • Day1:12:45-13:35 Azure ネットワーク設計と運用のツボ(DEP005)
    • Day2:12:00-12:45 [ランチ付き] Azure IaaS 応用編~実務で使えるVMとPaaSの組み合わせ~(SNR001)
  • その他
    • Day2:15:40-16:30 Xamarin と Azure で、超効率的にクラウドと繋がるモバイルアプリを作ろう!(APP005)
    • Day2:16:55-17:45 OMS Log Analytics によるビッグデータログの分析方法の解説と実演(DEP002)
    • Day2:18:10-19:00 エバンジェリストが注目のこの人と語る IT キャリアの多様性と未来(SPL005)

まとめ

  • はらへった
    • 近くにコンビニほしかった
  • 2日で6万円の元取るためにレッドブルとモンスター飲みまくった
    • 5本飲んだので1000円分
  • OneNoteっていうかSurfaceのペンをもっと使おうと思った
  • ID系出過ぎた
    • 全然関係ないセッションにもっと出ればよかった
  • 内容濃かったから腹落ちさせて整理展開しないとな~

関連