Quantcast
Channel: システム運用日記
Viewing all 215 articles
Browse latest View live

Zoomの録画データをPower Automateを使ってGoogleドライブへ保存する

$
0
0

Zoomの録画データをPower Automateを使ってGoogleドライブへ保存する

zoomの録画データをGoogleドライブに保存してみようと思いやってみました
完成した後に気づいたのですが、Power AutomateのHTTPコネクタでもってこれるデータが100MBまででした・・・
ので、長いミーティングの場合はエラーになりますので、素直にスクリプトをつくって対応したほうがいいかと思います
作る前に制限事項はちゃんと確認しようね!(でもやってみたかったんだYO!)
あとZoom側もSlackと同様に3秒以内に応答がないと失敗とみなされます。(素直にスクリ(ry

必要なもの

  • heroku(無料プランで可)
  • Power Automateプレミアムコネクタが利用可能なライセンス
  • Zoom有料プラン

なぜheroku?

ZoomのWebhookからの値をそのままPower Automateの受信要求に飛ばすとこんなエラーが表示されてしまいます

responseData: {
error: {
code: "DirectApiRequestHasMoreThanOneAuthorization",
message: "The request has both SAS authentication scheme and 'uEBQwPmSQGuiSVc7zM9OBw' authorization scheme. Only one scheme should be used."
}

ので、すんごい無駄なことしてるなーと思いつつPythonスクリプトで、受信してデータをそのままPower Automate側に受け渡しています
ここどうしたら解消されるのか誰か教えてください・・

Power Automateでフローを作成する

HTTP要求の受信時トリガー

  1. WebhookからのURLを受け取るため、「HTTP要求の受信時」トリガーを選択します
  2. 「要求本文のJSONスキーマー」に以下の内容を入力し保存します
    {
        "event": "string",
        "payload": {
            "account_id": "string",
            "object": {
                "id": "integer",
                "uuid": "string",
                "host_id": "string",
                "topic": "string",
                "type": "integer",
                "start_time": "string",
                "timezone": "string",
                "host_email": "string",
                "duration": "integer",
                "share_url": "string",
                "total_size": "integer",
                "recording_count": "integer",
                "recording_files": [
                    {
                        "id": "string",
                        "meeting_id": "string",
                        "recording_start": "string",
                        "recording_end": "string",
                        "file_type": "string",
                        "file_size": "number",
                        "play_url": "string",
                        "download_url": "string",
                        "status": "string",
                        "recording_type": "string"
                    }
                ]
            }
        }
    }
    
  3. 【新しいステップ】をクリックします

JSONの解析

次に受信したJSONファイルを解析します

  1. 【JSONの解析】アクションを検索しクリックします
  2. コンテンツにフォーカスをあわせ、表示される【本文】をクリックします
  3. スキーマーに以下の内容を入力します
    {
        "type": "object",
        "properties": {
            "event": {
                "type": "string"
            },
            "payload": {
                "type": "object",
                "properties": {
                    "account_id": {
                        "type": "string"
                    },
                    "object": {
                        "type": "object",
                        "properties": {
                            "uuid": {
                                "type": "string"
                            },
                            "id": {
                                "type": "integer"
                            },
                            "account_id": {
                                "type": "string"
                            },
                            "host_id": {
                                "type": "string"
                            },
                            "topic": {
                                "type": "string"
                            },
                            "type": {
                                "type": "integer"
                            },
                            "start_time": {
                                "type": "string"
                            },
                            "timezone": {
                                "type": "string"
                            },
                            "host_email": {
                                "type": "string"
                            },
                            "duration": {
                                "type": "integer"
                            },
                            "total_size": {
                                "type": "integer"
                            },
                            "recording_count": {
                                "type": "integer"
                            },
                            "share_url": {
                                "type": "string"
                            },
                            "recording_files": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "id": {
                                            "type": "string"
                                        },
                                        "meeting_id": {
                                            "type": "string"
                                        },
                                        "recording_start": {
                                            "type": "string"
                                        },
                                        "recording_end": {
                                            "type": "string"
                                        },
                                        "file_type": {
                                            "type": "string"
                                        },
                                        "file_size": {
                                            "type": "integer"
                                        },
                                        "play_url": {
                                            "type": "string"
                                        },
                                        "download_url": {
                                            "type": "string"
                                        },
                                        "status": {
                                            "type": "string"
                                        },
                                        "recording_type": {
                                            "type": "string"
                                        }
                                    },
                                    "required": [
                                        "meeting_id",
                                        "recording_start",
                                        "recording_end",
                                        "file_type",
                                        "download_url"
                                    ]
                                }
                            },
                            "password": {
                                "type": "string"
                            }
                        }
                    }
                }
            },
            "download_token": {
                "type": "string"
            }
        }
    }

リダイレクトされていた・・・

テストで作成したHTTPコネクタが失敗してるなと思い見てみると302が返ってきていました
そのため、フローにリダイレクト後URL取得用変数を追加します

  1. 【新しいステップ】を追加します
  2. 【変数を初期化する】アクションをクリックします
  3. 以下のような形で変数を初期化します(名前は自由にきめてください)

配列処理をしダウンロードURL等を取得する

Zoomの設定にもよりますが、Zoomでは以下のようにそれぞれを録画することができます
ここでチェックを入れた分だけの録画ファイルが作成されてきます。

そのため、配列に入ってくるので、Apply to eachアクションを追加します

  1. 「以前の手順から出力を選択」に「recording_files」を選択します
  2. 動画ファイルだけを今回は対象にしたいので、条件アクションを追加します
  3. 以下のような条件を設定します
    file_typeが次の値に等しい MP4

  4. 「はい」の場合に、「HTTP」アクションを追加します
  5. 以下のように設定します
    ヘッダーはなくても大丈夫かも
    方法 GET
    URI @{items(‘Apply_to_each’)?[‘download_url’]}?access_token=@{body(‘JSON_の解析’)?[‘download_token’]}
    ヘッダー Content-Type application/octet-stream

  6. 「変数の設定」アクションを追加します
    (このアクションを追加する前にHTTPステータスコードが302であるならばという条件を入れたほうがいいかもしれません)
  7. 以下のように設定します
    名前 事前に設定した変数の名前を選択
    @{actions(‘HTTP’).outputs.headers.Location}

  8. 3つの点アイコンをクリックします
  9. 【実行条件の構成】をクリックします
  10. 「に失敗しました」「スキップされます」にチェックをつけて【完了】をクリックします
    (HTTPがアクションが302を返すとそこでアクションが停止してしまうため、失敗してもそのままフローを実行しろという設定にしています)
  11. HTTPアクションを追加します
  12. 以下のように設定します
    方法 GET
    URI @{variables(‘RedirectURL’)}

  13. Google Driveの【ファイルの作成】アクションを追加します
  14. 保存したいGoogleドライブにアクセスできるアカウントでログインします
  15. 保存したいフォルダを選択します
  16. その他の設定についは以下のようにしてみました。お好みで変更してください
    ファイル名 @{body(‘JSON_の解析’)?[‘payload’]?[‘object’]?[‘host_email’]}_@{body(‘JSON_の解析’)?[‘payload’]?[‘object’]?[‘topic’]}_@{body(‘JSON_の解析’)?[‘payload’]?[‘object’]?[‘start_time’]}_@{items(‘Apply_to_each’)?[‘recording_type’]}.@{items(‘Apply_to_each’)?[‘file_type’]}
    ファイルコンテンツ @{body(‘HTTP_2’)}

橋渡し用Pythonスクリプトを作成する

  1. 以下の内容でPythonスクリプトを作成します.
    responderを利用しているので、pipコマンドでインストールしてください pip3 install responder
    GitHubにも置いておいたので、ご自由にお使いください
    import os
    import json
    from pprint import pprint
    import responder
    import requests
    
    api = responder.API()
    
    PA_URL = os.environ['PA_URL']
    
    @api.route('/')
    async def index(req,resp):
        if req.method == "get":
            resp.text = "Zoom"
    
        if req.method == "post":
            req_data = await req.media()
            print(req_data)
            headers = {'content-type': 'application/json'}
            response = requests.post(PA_URL, data=json.dumps(req_data) ,headers=headers)
    
    
    
    if __name__ == '__main__':
        api.run(address='0.0.0.0',debug=True)
  2. herokuにアップロードしておきます。

Power Automateに送信するURLを確認する

  1. 作成したフローの一番上にあるトリガーを開きます
  2. HTTP POSTのURL横にあるコピーボタンを押しURLをコピーします
  3. herokuの環境変数設定にて、コピーしたURLを定義しておきます

ZoomでWebhookを定義する

  1. https://marketplace.zoom.us/ にアクセスしログインします
  2. 右上の「Develop」→【Build App】をクリックします
  3. Webhook Onlyの【Create】をクリックします
  4. アプリ名を入力し、【Create】をクリックします
  5. 必要なフィールドに値を入力し、【Continue】をクリックします
  6. Event Subscriptionsを有効化します
  7. 【Add new event subscription】をクリックします
  8. 好きな名前を入力し、Event notification endpoint URLにはheroku側のURLを設定します
  9. 【Add events】をクリックします
  10. 「Recording」を選択し、【All Recordings have completed】にチェックを入れます
  11. 【Save】をクリックします
  12. 【Continue】をクリックします
  13. 完了画面が表示されます

Zoomミーティングを開始しテストしてみる

適当なミーティングをつくり、Zoomミーティングを開始します。
ビデオを有効にしたり、画面共有等をしミーティングを終了させます
しばらくするとWebhookが動作し、Power Automateが動き出すことを確認します

Webhookログを確認する

  1. 右上の【Manage】をクリックします
  2. 「Call Logs」→「Webhook Logs」タブをクリックします
  3. 作成したアプリ名をクリックします
  4. Statusコード等が表示されるので、詳細を確認したい行の右にある>をクリックし内容を確認します
  5. 必要応じてスクリプトやフローを修正します

共有ドライブには保存できない

現状のPower AutomateのGoogleドライブコネクタは共有ドライブに対応していないので、
共有ドライブにファイルを保存することができません(対応してほしい)
そのため、個人ドライブを開いたときにサムネイルで見えてしまいます。
これを回避するためにはAPIで、ファイルを保存しにいかせるしか今のところ手はないかもしれません

 

色々と制限があるので、あまり使い物にはならないかもしれませんが
GUIでポチポチやるだけでできあがるのは便利です。
Power Automateでできるところはまかせて色々とやってみたいですね


Dynamics365 プロセスのステージカテゴリを追加する

$
0
0

プロセスのこの部分のカテゴリ内容を編集する方法です
この部分

新しいエクスペリエンスUIの場合は、既定のソリューションから「ステージ カテゴリ」で検索します

ステージカテゴリをクリックし、オプションセットの編集画面を表示します
【新しい項目の追加】をクリックし、追加したいカテゴリ名を追加します

プロセス編集画面にいき、ステージカテゴリで、追加したカテゴリが選択できることを確認します

 

 

 

Dynamics365 javascriptでオプションセットのテキスト名を取得する

$
0
0

Javascript to get Optionset Text from Value

以下のような形で取得すると、整数値が返ってきてしまいます

var purpose = formContext.getAttribute("new_field").getValue();

結果
100000002

そのため下記のように変更することでテキストの内容を取得することができます

var purpose = formContext.getAttribute("new_field").getText();

結果
目的1

 

Power BIでDynamicsのオプションセットの値を取得できるようにする手順

$
0
0

タイトルだけだとわかりづらいかと思いますが、
Dnamicsのオプションセットの値(Value)をPower BIで使えるようにする方法です。
こういうやつです↓

単純にカラム指定すればもってこれるんじゃないの?
って私も思ってましたが、Power BIでDynamicsのデータをみにいくと、数字しか入っていませんでした

どこかに値を持っていてリレーションで定義すればとれるだろうと思っていたのですが、まったく値が入っているところをみつけられず調べていたところ以下の手順でそれようのテーブルを定義する必要がありました。

XRMToolBoxを利用する

  1. こちらのページから、XRM ToolBoxをダウンロードし解凍します
  2. XrmToolBox.exeをダブルクリックして起動します

Power Query Builderのインストール

  1. Power Query Builderを選択し、【Install】をクリックします
  2. 【OK】をクリックします

Dynamics環境へ接続する

  1. 「Configuration」→【Manage connections】をクリックします
  2. 「New connection」をクリックし、【Connection Wizard】をクリックします
  3. URL等を入力し、ウィザードを進めていきます
  4. 登録が完了したら、「Connect」→接続したい環境名を選択し、【Connect】をクリックします
  5. パスワードを求められるので、ログイン可能なユーザーでログインします

Power Query Builderツールを起動する

私はここで、はて??と考え込んでしまいました。
この画面だけ出るんですが、どこから起動するの???と・・・
メニューバーを触りまくっても起動できそうな箇所がない・・・

Toolsタブをダブルクリックすると、下記画面が表示されます(初見でわからんよこれ・・・)
ツールを選択できる画面になったの手順に進みます

  1. FilterにPower等入力し、Power Query Builderを選択します
  2. Power Query Builderをダブルクリックすると、タブが増えます
    (何回もダブルクリックすると、タブがどんどん増えます(笑 )
  3. タブが増えたらToolsウインドウを閉じます
    閉じる方法は、タイトルバーをダブルクリック・・・

Power Query Builderを利用して、クエリを自動生成する

  1. またどうするの?ってなるんですが、Power Query Builderタブをダブルクリックします
  2. 【Load Entities】をクリックします
  3. Entityが表示されます
  4. 今回は、取引先企業エンティティにある、関係内容のオプションセットで試してみます
    検索ボックスに入力し、取得したいフィールドを選択します
  5. 「関係内容」を選択し、=>をクリックします
  6. 【Generate OptionSets】をクリックします
  7. 表示された内容をコピーします

Power BIにコピーしたクエリを登録する

すでにPower BIのデータソースとしてDynamicsへ接続済みであることを前提として進めます

  1. 「データを取得」→【空のクエリ】をクリックします
  2. 【詳細エディタ】をクリックします
  3. Power Query Builderでコピーした内容を貼り付けます
  4. そのまま「完了」を押すと以下のエラーが表示されます
  5. 張り付けたクエリの中に、ServiceRootURLという箇所があるのでこちらを修正します
    ここの内容はDynamics365の、「カスタマイズ」→「開発者リソース」→「サービスのルートURL」にあるURLに置き換えます
  6. 問題なくクエリが実行されると以下のような表ができあがります
  7. 【閉じて適用】をクリックします

 

以上で完了です

あとはこのテーブルと他をリレーションでつなぐことでPower BIから扱うことができます

 

 

Dynamics365 今日の日付をフィールドにセットする

$
0
0

ビジネスルールを利用して、今日の日付を設定したかったのですが、
ビジネスルール単体では計算式が利用できないため実現できませんでした。
フィールドの計算式であれば、取得することはできますが保存時にしか値が入ってくれないので要件を満たせませんでした。
そのため今回は下記手順で実現しています

  1. JavaScriptを利用してフォームロード時に、「今日の日付」というフィールドに日付を設定
  2. ビジネスルールを利用して、「今日の日付」フィールドを指定したフィールドへコピー

フォームに今日の日付フィールドを追加する

追加したいエンティティのフォームに日付のみでフィールドを追加してください。
こんな感じですね
追加したフィールドをフォームの適当なところに配置します

今日の日付を取得するスクリプトを作成する

以下のスクリプトを作成して保存します(フィールド名をnew_today_dateとかしてるところはご愛敬w)

function today_date(executionContext){
    var formContext = executionContext.getFormContext();
    var dt = new Date();
    
    formContext.getAttribute("new_today_date").setValue(dt);

}

Webリソースとして、保存したJSファイルを登録します

こんな感じで登録

ファイルの選択をクリックし、作成したJSファイルをアップロードします。
上書き保存後、公開をクリックします

フォームロード時に実行されるよう設定する

  1. 「詳細設定」→「カスタマイズ」→「システムのカスタマイズ」を開きます

  2. フィールドを追加したエンティティのフォームを開きます(クラッシックビューで開いてください)

  3. 【フォームのプロパティ】をクリックします
  4. イベントタブの、フォームライブラリ→【追加】をクリックします
  5. 追加JSファイルを検索し、【追加】をクリックします
  6. イベントハンドラー欄で、コントロール「フォーム」、イベント「OnLoad」を選択し、追加アイコンをクリックします
  7. ライブラリから追加JSファイルを選択し、関数に定義した関数名を入力します
    パラメータの「実行コンテキストを最初のパラメータとして渡す」にチェックをつけ【OK】をクリックします
  8. フォームを保存し、公開をクリックします
  9. 今回設定したフォームを開き、今日の日付に正常に日付が入っていることを確認します

 

 

ビジネスルールを利用して今日の日付をコピーする

今日の日付をフィールドに設定することができたので、ビジネスルールを利用して条件に応じてこの日付を利用したいフィールドへコピーする設定を行えばOKですね

 

 

ビジネスルールのフィールド値設定で計算式が使えるようになってほしいものですね

AzureADを利用して、Mist管理コンソールへSAMLログインを設定する

$
0
0

AzureADを利用して、Mist管理コンソールへSAMLログインを設定する

Mist側で設定情報を確認する

  1. Mistの管理コンソールへログインします
  2. 「Organization」→Single Sign-onにある【Add IDP】をクリックします

  3. Nameに適当な名前を入力し、【Add】をクリックします。(今回はAzureADとしました)
  4. 下記画面が表示されるので、ACS URL、Single Logout ULRを控えておきます

 

AzureAD側の設定

いつも通りの手順ですが、エンタープライズアプリケーションから新規アプリケーションを追加します

  1. 「すべてのアプリケーション」→【新しいアプリケーション】をクリックします
  2. 【ギャラリー以外のアプリケーション】をクリックします
  3.  名前に「Mist」と入力し、【追加】をクリックします
  4. 「シングルサインオン」→【SAML】をクリックします
  5. 基本的なSAML構成を下記のように設定します
    識別子(エンティティID) https://saml.mist.com
    応答URL 事前に控えたACS URLの内容を張り付け
    ログアウトURL 事前に控えたSingle Logout URLの内容を張り付け
  6. ユーザー属性とクレームの【編集】をクリックします
  7. 一意のユーザー識別子をクリックします(メールアドレスをUPNとしている場合は変更しなくてもOKです)
    Exchangeを利用している場合には、こちらをuser.mailに変更します(UPN=メールアドレスの場合はどちらでもOK)
  8. 【新しいクレームの追加】をクリックします

  9. 下記内容を定義し、【保存】をクリックします
  10. 証明書(Base64)をダウンロードし、保存します
  11. SAML署名証明書項目の【編集】をクリックします
  12. 署名オプションを「SAML応答とアサーションへの署名」に変更します
  13. アプリのフェデレーションメタデータURLをコピーし控えておきます
  14. AzureAD識別子の内容をコピーし控えておきます

 

Mist側設定

  1. ダウンロードした証明書ファイルをテキストエディタ等で開き内容をコピーします
  2. コピーした内容を、「Certificate」欄に貼り付けます
  3. 「Issuer」欄に、事前に控えたAzureAD識別子の内容を貼り付けます
  4. 「SSO URL」欄に、事前に控えたアプリのフェデレーションメタデータURLの内容を貼り付けます

  5. 必要に応じてRoleを作成します
    作成したRole名と同じ形でAzureAD側にもRoleを作成してください
    AzureAD側には初期値でUserロールが定義されているので、Mist側でUserロールを作成してください
    そのまま管理者権限とする場合には下記のようにMist側にて定義しておきます

  6. Roleを作成するにはマニフェストのJSONを編集する必要があります

 

SSOをテストする

  1. アプリケーションにユーザーとロールを割り当てます

  2. Roleを作成している場合にはRoleも必ず選択してください
  3. 割り当てたユーザーでMist管理コンソールにアクセスできることを確認します

 

Apple Configurator2を利用してiPhoneをDEP化する〜Intune編〜

$
0
0

iPhoneの電源が入らなくなり、Apple Storeにて本体交換となったiPhoneが誕生
当然ながらABMの登録が外れてしまいます(とうより本体交換だから別物)
ABMに登録しようとしても、会社と交換された端末が紐付いていないため登録できませんでした・・・

そこで、Apple Configurator2を利用して、DEP化する方法を記載しておきます
(結構迷ったので・・・)

必要なもの

  • mac本体
  • Apple Configurator 2 (AppStoreからインストール)
  • MDM(今回はIntuneを利用します)
  • iPhone

IntuneにDEP化させたい端末のシリアルを登録

プロファイルの作成

  1. まずDEP化させたい端末のシリアル番号を確認します。
    以下のようなCSVファイルを作成します
    シリアル番号,詳細(上限128文字)例ですが、以下のような感じです
    XXXXXXXXXX,資産番号XXXX
  2. Microsoft Endpoint Manager admin centerへログインします
  3. 「デバイス」→【デバイスの登録】をクリックします
  4. 「Apple登録」→【Apple Configurator】をクリックします
  5. 「プロファイル」→【作成】をクリックします
  6. ウィザードに従いプロファイルを作成します
  7. プロファイルが作成されたことを確認します

CSVを作成し、Intuneへ登録する

  1. 「デバイス」→【追加】をクリックします
  2. 適用させるプロファイルを選択し、「デバイスのインポート」欄から作成したCSVファイルを選択し、【追加】をクリックします
  3. デバイスが登録されたことを確認します

 

サーバーURLを控える

  1. 「Apple登録」→「Apple Configurator」→「プロファイル」→作成したプロファイル名をクリック→【プロファイルのエクスポート】をクリックします

  2. 「プロファイルURL」をコピーし控えておきます

Apple Configurator 2の準備

Apple Configurator2を起動します

組織の作成

  1. 「Apple Configurator 2」→【環境設定】をクリックします

  2. 「組織」タブをクリックし、「+」アイコンをクリックします
  3. 【次へ】をクリックします
  4. ABMにログインできるアカウントでログインします
  5. 新規の場合は表示されないかもしれませんが、下記選択肢が表示された場合にはどちらを利用するかを選択し、【完了】をクリックします
  6. 組織情報が登録されたことを確認します

 

サーバの設定

  1. 「サーバ」タブをクリックし、「+」アイコンをクリックします
  2. 【次へ】をクリックします
  3. 以下の情報を入力し、【次へ】をクリックします
    名前 適当なわかりやすい名前(今回はIntuneとしておきました)
    ホスト名またはURL プロファイルエクスポートで控えたURLを入力



  4. サーバが登録されたことを確認します

 

DEP化

  1. DEP化したいiPhoneをApple Configurator2を起動させているMacにUSBケーブルで接続します
  2. 管理したいデバイスを選択肢、【準備】をクリックします

  3. 「手動構成」を選択し、【次へ】をクリックします

  4. 事前に作成したサーバ名を選択し、【次へ】をクリックします

  5. 組織を選択し、【次へ】をクリックします
  6. 設定アシスタントで表示させたい項目にチェックをいれ、【次へ】をクリックします
  7. このタイミングで適用しておきたい構成プロファイルがある場合には、構成プロファイルを登録します
  8. 【準備】をクリックします
    ※iPhoneのデータはすべて消去されるので問題ないかを確認してください

  9. すでに設定済みのデバイスの場合はダイアログが表示されるので、問題なければ【消去】をクリックして進めます

iPhoneの初期化が完了し、設定アシスタントを進めてください
設定完了すると監視モードとなるはずです。
設定アプリを起動すると、
「このiPhoneは******によって監理/管理されています」
と表示されているはずです

 

 

UniFiコントローラーのアップデート方法

$
0
0

UniFiコントローラーのアップデート方法

コントローラにRaspberry Piを利用しています

データベースを最適化する

  1. UniFi Networkコントローラへログインします
  2. 歯車アイコン→「メンテナンス」→【コンパクトデータベース】をクリックします
  3. 処理が完了するまで待ちます

バックアップを取得する

  1. 歯車アイコン→「バックアップ」→【DOWNLOAD FILE】をクリックします
  2. ファイルを保存します

コントローラーのパッケージをインストールする

  1. 新しいバージョンのコントローラパッケージをダウンロードします
    https://www.ui.com/download/unifi/
  2. 以下のコマンドで、パッケージをインストールします
    sudo dpkg -i パッケージ名.deb
  3. バックアップとった?と聞かれるので問題なければ【はい】を選択します
  4. しばらくするとアップデートが完了します
  5. コントローラにログインし、バージョンが上がっていることを確認します


Jamf Proを利用してESET for Macをアンインストールする

$
0
0

ESETから別な製品に乗り換えるためESETをアンインストールを自動でできるようにします。

スクリプトを作成する

ESET AntiViriusとESET Remote Admin Agentをアンインストールするためのスクリプトを作成します。

  1. 歯車アイコン→「コンピュータ管理」→【スクリプト】をクリックします
  2. 【新規】をクリックします
  3. 以下の内容で2つのスクリプトを登録します

ESET AntiVirusアンインストール用

#!/bin/sh

cd /Applications/ESET\ Endpoint\ Antivirus.app/Contents/Helpers/Uninstaller.app/Contents/Scripts
/bin/sh uninstall.sh

exit $?

ESET Remote Admin Agent削除用

#!/bin/sh

cd /Applications/ESET\ Remote\ Administrator\ Agent.app/Contents/Scripts/
/bin/sh Uninstall.command

exit $?

 

ポリシーを作成する

  1. 「ポリシー」→【新規】をクリックします
  2. 「スクリプト」→【Configure】をクリックします
  3. 先ほど登録したスクリプトを追加します
  4. 「Scope」タグを選択し、アンインストールさせる端末またはグループを定義します
    ※必要応じてSelfService等を設定します
  5. 【保存】をクリックします

ESETのアンインストールテストする

指定したマシンを起動し、SelfServiceやコマンドラインから作成したポリシーを実行し、
正常にアンインストールされるかを確認します

 

 

 

Jamf Proでの各種トークン(VPP,ADB(旧DEP),APNs証明書)の更新手順

$
0
0

1年に1度の作業なので、忘れないように作業メモ
失敗すると、全端末のMDMが入れ直しになるかもしれない恐怖の作業ですね(笑)

1年に一度更新が必要になります。
しかも3つ、VPPトークン、DEPトークン、プッシュ証明書の更新が必要という

Jamf Proの場合更新日が近づくとアラートでお知らせしてくれます。とても便利ですね!
APNs証明書は証明書を発行したAppleID宛に更新日が近づいてくるメールが届きます

Push Notification証明書の更新方法

  1. 上の画像の「ここでPush Notification証明書を更新」をクリックします
  2. 「Download signed CSR from Jamf Nation」を選択し次へ進みます
  3. Jamf Nationのアカウント情報を入れ次へ進みます
  4. CSRファイルをダウンロードし、保存します
  5. 表示される手順に従ってプッシュ証明書を作成します

Apple Push Certificate Portalへログインし、証明書を取得する

  1. Apple Push Certificate Portalにログインします。
    作成したときと同じAppleIDを利用してログインしてください
  2. 今回はJamf Pro用に利用している証明書を更新したいので、Jamfとなっている行の【Renew】をクリックします
  3. Jamf Proからダウンロードしたplistを選択し、【Upload】をクリックします
  4. 【Download】をクリックし、証明書を保存します
  5. Jamf Proに戻り【アップロード】をクリックします
  6. 【ファイルを選択】をクリックし、先ほどダウンロードした証明書ファイルを選択し、【アップロード】をクリックします
  7. 「完了」表示がでれば完了です

ADE用(旧DEP)トークンを更新する

  1. ABMにログインします
  2. 「設定」→MDMサーバにある対象のMDMサーバを選択→【トークンをダウンロード】をクリックします
  3. 【サーバトークンをダウンロード】をクリックします
  4. Jamf Pro側右上の歯車アイコンをクリックします
    「一括管理」→【自動デバイス登録】をクリックします
  5. 定義してある名称をクリックします
  6. 右下にある【編集】をクリックします
  7. 【サーバトークンファイルのアップロード】をクリックし、ダウンロードしたトークンファイルを選択し【保存】をクリックします
  8. ダウンロードしたトークンファイルを選択し、【アップロード】をクリックします
  9. 【保存】をクリックします
  10. 「トークン有効期限日」が更新されたことを確認します

VPP用トークンの更新

ABMからサーバトークンのダウンロード

  1. ABMにログインします
  2. 「設定」→「Appとブック」→更新する対象のサーバトークン名称横にある【ダウンロード】をクリックします
    ※MDMごとに場所を分けている理由については以前の記事を参考にしてください
  3. トークンを保存します

Jamf Proでの更新作業

  1. 右上の歯車アイコンをクリックします
  2. 「一括管理」→【Volume Purchasing】をクリックします
  3. トークンを更新する名称をクリックします
  4. 右下にある【編集】をクリックします
  5. 【Renew Service Token】をクリックします
  6. ダウンロードしたトークンを選択し、【アップロード】をクリックします
  7. サービストークン有効期限日が更新されたことを確認します

Intuneでの各種トークン(VPP,ADE(旧DEP),APNs証明書)の更新手順

$
0
0

1年に1度の作業なので、忘れないように作業メモ
失敗すると、全端末のMDMが入れ直しになるかもしれない恐怖の作業ですね(笑)

1年に一度更新が必要になります。
しかも3つ、VPPトークン、DEPトークン、プッシュ証明書の更新が必要という

Push Notification証明書の更新方法

  1. Microsoft Endpoint Manager admin center(以下MEMA)にログインします
  2. 「デバイス」→【デバイスの登録】をクリックします
  3. 【Apple登録】をクリックします
  4. 【Apple MDMプッシュ通知証明書】をクリックします
  5. 【CSRのダウンロード】をクリックし、CSRファイルを保存します

Apple Push Certificate Portalへログインし、証明書を取得する

  1. Apple Push Certificate Portalにログインします。
    作成したときと同じAppleIDを利用してログインしてください
  2. 今回はIntune用に利用している証明書を更新したいので、Microsoft Corporationとなっている行の【Renew】をクリックします
  3. MEMAからダウンロードしたCSRファイルを選択し、【Upload】をクリックします
  4. 【Download】をクリックし、証明書を保存します
  5. MEMA側に戻り、プッシュ通知証明書の作成に使用したAppleIDを入力し、ダウンロードした証明書ファイルを選択し、【アップロード】をクリックします
  6. 有効期限を更新されたことを確認します

ADE用(旧DEP)トークンを更新する

  1. ABMにログインします
  2. 「設定」→MDMサーバにある対象のMDMサーバを選択→【トークンをダウンロード】をクリックします

  3. 【サーバトークンをダウンロード】をクリックします

  4. 「デバイス」→「デバイスの登録」→「Apple登録」→【Enrollment Programトークン】をクリックします
  5. 更新対象のトークン名をクリックします
  6. 【トークンを更新する】をクリックします
  7. ABMからダウンロードしたトークンを選択し、【次へ】をクリックします
  8. トークンの状態が「アクティブ」になったことを確認します

VPP用トークンの更新

ABMからサーバトークンのダウンロード

  1. ABMにログインします
  2. 「設定」→「Appとブック」→更新する対象のサーバトークン名称横にある【ダウンロード】をクリックします
    ※MDMごとに場所を分けている理由については以前の記事を参考にしてください

Intuneでの更新作業

  1. 「アプリ」→【電子書籍】をクリックします。(なんでこの場所なんでしょうね・・・)
  2. 「Apple VPNトークン」→更新したい対象名をクリックします
  3. 基本横にある【編集】をクリックします
  4. ダウンロードしたVPPトークンを選択し、【レビューと保存】をクリックします
  5. 【保存】をクリックします
  6. 有効期限が更新されたことを確認します

JumpCloudでパスワード有効期限が迫っているMacローカルユーザーに通知を表示する方法

$
0
0

JumpCloudは10人まで無料で利用できるので、小さな企業等だと便利ですよね
RAIDUS機能もあるので使われている方も多いのではないでしょうか。

今回はJumpCloudでパスワードの有効期限が迫っているユーザーに対して期限がきれますよ。
という通知を表示させる方法です。
(パスワードに期限をつけるなんてナンセンスと思われそうですが、
現行(2020年10月現在)のPCI DSSではパスワードの定期更新が求められるため、設定しなければいけない企業もあるということです)

前提

  • Macに対してJumpCloudを設定し、ログインするように設定している
  • パスワード期限の7日前からダイアログを表示させ、パスワード変更方法を記したページURLを自動的に開くようにする

APIキーの取得

  1. JumpCloudの管理ポータルへAPIキーを発行するユーザーでログインします
  2. 右上のログイン名をクリックし、【API Settings】をクリックします
  3. 表示されたAPIキーを控えておきます

スクリプト作成

以下のようなスクリプトを作成します。
JCAPIKeyには、事前に控えたAPIキーを貼り付けます

#!/bin/bash

## Populate below variable before running command
JCAPIKey=''

## alertDaysThreshold set to '7' by default.
## Users whose passwords will expire in 7 days or less will receive a prompt to update.
## Update the value of the variable alertDaysThreshold=''to modify the threshold.
alertDaysThreshold='7'

#------- Do not modify below this line ------
user=$(ls -la /dev/console | cut -d " " -f 4)

passwordExpirationDate=$(
    curl -s \
        -X 'POST' \
        -d '{"filter":[{"username":"'${user}'"}],"fields" : "password_expiration_date"}' \
        -H 'Accept: application/json' \
        -H 'Content-Type: application/json' \
        -H 'x-api-key: '${JCAPIKey}'' \
        "https://console.jumpcloud.com/api/search/systemusers"
)

regex=':".*T'
if [[ $passwordExpirationDate =~ $regex ]]; then
    unformattedDate1="${BASH_REMATCH[@]}"
    unformattedDate2=$(echo "${unformattedDate1:2}")
    expirationDay=${unformattedDate2%?}
    echo "${user} password_expiration_date: ${expirationDay}"
else
    echo "Could not locate the password expiration date for user ${user}."
    echo "Is ${user} enabled for password_never_expires?"
    echo "If so users enabled with password_never_expires have no password expiration date."
    exit 1
fi

Today="$(echo $(date -u +%Y-%m-%d))"

daysToExpiration=$(echo $((($(date -jf %Y-%m-%d $expirationDay +%s) - $(date -jf %Y-%m-%d $Today +%s)) / 86400)))
echo "${user} password will expire in ${daysToExpiration} days"

if [ "$daysToExpiration" -le "$alertDaysThreshold" ]; then
    echo "${daysToExpiration} within alertDaysThreshold of ${alertDaysThreshold} prompting user"

    userPrompt=$(sudo -u $user osascript -e '
        display dialog "パスワードの期限が残り'"${daysToExpiration}"'日で切れます。\n OKをクリックし表示された手順に従いパスワードを更新してください。" buttons {"OK","Cancel"} default button 1 with title "パスワード有効期限通知" with icon file "Applications:Jumpcloud.app:Contents:Resources:AppIcon.icns"
        set tmp to result
        set btn to button returned of tmp
    ')
    echo "$userPrompt"

    if [ $userPrompt = "OK" ]; then
        `sudo -u $user /usr/bin/open -a '/Applications/Safari.app' "https://パスワード変更手順を記したWikiなどのURL"`
    fi


else
    echo "${daysToExpiration} NOT within alertDaysThreshold of ${alertDaysThreshold} NOT prompting user"

fi

exit 0

JumpCloudにスクリプトを登録する

PowerShellで登録する方法もありますが、管理ポータルか登録させていきます

  1. 管理ポータルにログインし、「Commands」→【+】アイコンをクリックします
  2. 各種内容を入力します
    NAME わかりやすい名前
    RUN AS root
    COMMAND 事前に作成したスクリプトの内容を貼り付け
    EVENT Run as Repeating
    Day
    Repeat every 1 days
    Run at :実行したい時間

  3. 対象のグループやシステムを選択し、【save command】をクリックします
    今回Macを対象としているので、Macグループを指定しています
    (事前にグループに対してマシンを紐付ける必要があります)
  4. 実行されると、command resultの欄に実行結果が表示されてきます
  5. 結果をクリックすると、標準出力の結果等を確認することができます

Mac側での表示のされ方

Mac側でパスワードの期限切れが近づいており、設定したタイミングでスクリプトが実行されると以下のようなダイアログが表示されます
OKをクリックすると、指定したURLが開きます

JumpCloudアプリでパスワードを変更する

FileVaultの絡みがあるので、JumpCloudのアプリから変更するのが無難かと思います

  1. メニューバーにあるJumpCloudアイコンをクリックし、【Update Now】をクリックします
  2. 表示された内容に従ってパスワードを変更します
  3. 下記画面が表示されてパスワード変更は完了です

Dynamics 365 Marketingの既定コンテンツ設定レコードエラーを解消する

$
0
0

Dynamics365 Marketingを利用し、マーケティング電子メールをテストしている際にはまってしまったので備忘録

前提

  • サブスクリプションセンターは定義済

現象

マーケティング電子メールを作成し、「エラーの確認」を押したところ下記エラーが表示される

「既定のコンテンツ設定レコードが含まれていません。」
(若干うろ覚えですがこんな感じのメッセージでした)

対応方法

コンテンツ設定をする

  1. 「マーケティングテンプレート」配下にある【コンテンツ設定】をクリックします
  2. 必要箇所を入力し、保存します。
    各国の法規制に対応するために住所等は必須です

既定値の変更

  1. 左下にあるマーケティングをクリックし、【設定】をクリックします
  2. 【既定のマーケティング設定】をクリックします
  3. とりあえずデフォルトで作成されていた、名前をクリックします。
    新規で作ってもよいかと思います
  4. 既定のコンテンツ設定欄を選択し、事前に「コンテンツ設定」で設定した名前を選択し、保存します

マーケティング電子メールを再設定し、エラーの確認をクリックしてエラーが表示されなくなったことを確認します
これでライブ状態へ移行可能となったので、顧客体験等で利用できるようになります

JamfとIntuneを連携させる手順 jamf intune integration

$
0
0

Jamfで管理されているマシンをIntuneへ連携させ、AzureADの条件付きアクセスをMacOSに対しても適用させることができます。
そのためには、JamfとIntuneの連携作業が必要になります
Jamfのバージョンアップによりとても簡単になりました。

Jamf Intune連携の設定(条件付きアクセス)

  1. 右上の歯車アイコンをクリックします
  2. 「一括管理」→【条件付きアクセス】をクリックします
  3. 「macOS Intune統合を有効にする」にチェックを入れます
    接続タイプは「クラウドコネクター」を選択し、【保存】をクリックします
  4. Azureのページへリダイレクトされるので、画面の指示に従ってMicrosoftから要求された権限を付与します
  5. アプリケーションIDが表示されるので、【Copy and open Microsoft Endpoint Manager】をクリックします。
  6. 「JamfのAzure Active DirectoryアプリIDを指定します」欄へコピーしたアプリケーションIDを入力し保存します
  7. Jamfへ戻り、【Confirm】をクリックします
  8. 「登録リクエストが許可されました」と表示されます。
    接続が確立するまでしばらく待ちます
  9. Jamf側の画面が下記のようになればOKです。
  10. Intune側は下記のように状態が変化します
  11. AzureADのアプリケーションに以下が追加されます
    Jamf Native macOS Connector

Mac用ポータルサイトアプリをインストールするポリシーを作成する

Jamf Intune連携を利用するためには当然ですがIntuneエージェントが必要になります。
Mac版は、下記からダウンロードすることができます
https://go.microsoft.com/fwlink/?linkid=853070

手動インストールしてもいいのですが、JamfがあるのでJamfから配布するようにします。
ポータルサイトアプリもバージョンがあがるので、常に最新版を取得して新規インストールするようにしています。

ポータルサイトアプリインストール用スクリプトを作成する

  1. 歯車アイコン→「コンピュータ管理」→【スクリプト】をクリックします
  2. 【新規】をクリックします
  3. 以下のようなスクリプトを作成します
    #/bin/sh
    pkgFile="companyPortal.pkg"
    url="https://go.microsoft.com/fwlink/?linkid=862280"
    
    echo "Creating working directory '$tempDirectory'"
    workDirectory=$( /usr/bin/basename $0 )
    tempDirectory=$( /usr/bin/mktemp -d "/private/tmp/$workDirectory.XXXXXX" )
    
    # change directory to temporary working directory
    echo "Changing directory to working directory '$tempDirectory'"
    cd "$tempDirectory"
    /usr/bin/curl -L $url --silent -o $pkgFile
    /usr/sbin/installer -pkg "$pkgFile" -target /
    
    # remove the temporary working directory when done
    /bin/rm -Rf "$tempDirectory"
    echo "Deleting working directory '$tempDirectory' and its contents"
    
    exit $?

ポータルサイトインストールJamfポリシーを作成する

  1. 「コンピュータ」→「ポリシー」→【新規】をクリックします
  2. 「スクリプト」→【Configure】をクリックします
  3. 先ほど登録したスクリプトを追加します
  4. 「Scope」タグを選択し、インストールさせる端末またはグループを定義します
    ※必要応じてSelfService等を設定します
  5. 【保存】をクリックします

ポータルサイトがインストールされている端末のSmart Computer Groupsを作成する

ポータルサイトがインストールされていないと、Jamf Intune連携ができないため、ポータルサイトがインストールされている端末一覧のSmart Computer Groupsを作成します

  1. 「コンピュータ」→【Smart Computer Groups】をクリックします
  2. 【新規】をクリックします
  3. 表示名にわかり易い名前をつけておきます
    Criteriaで以下の条件式を追加します
    Application Title is Company Portal.app
  4. 【保存】をクリックします
  5. 【表示】をクリックし、対象デバイスが表示されることを確認します

Intune統合用ポリシーを作成する

デバイスをIntuneに登録するためのポリシーを作成していきます

  1. 「コンピュータ」→「ポリシー」→【新規】をクリックします
  2. Generalカテゴリの表示名にわかり易い名前を入力します。(ここではRegister Device for Complianceとしています)
  3. 「macOS Intune統合」カテゴリを選択します。
  4. 【Configure】をクリックします
  5. 「Azure Active Directory(Azure AD)コンピュータ登録」にチェックをつけます
  6. 「Scope」タブを選択します。
    選択された展開ターゲットの【追加】ボタンをクリックします
  7. 「Computer Groups」を選択し、事前に作成したSmart Computer Groupsを選択します
  8. 「Self Service」タブを選択します
  9. 「Self Service」でポリシーを使用可能にするのチェックを入れます
  10. ボタンの名称もInstallだと違和感があるので、「Register Device」に変更しました
  11. 少し下にスクロールし、「カテゴリ」にある「デバイスコンプライアンスカテゴリにポリシーを含める」にチェックをつけます
  12. 【保存】をクリックします

Mac端末をIntuneへ登録する

ここまで設定してようやく、Mac端末をIntuneへ統合させることができるようになります。

  1. Self Serviceアプリを起動します
  2. 「デバイスコンプライアンス」カテゴリを選択します
  3. 【Register Device】をクリックします
  4. ポータルサイトアプリが起動してくるので、【サインイン】をクリックします
    ※ポータルサイトアプリを直接起動してサインインはしないでください。デバイスコンプライアンスのボタンから必ず起動します
  5. Mac端末を利用するユーザーのAzureAD情報を利用してサインインします
  6. サインイン完了後少したつと下記画面になるので、【完了】をクリックします
  7. 以下のようなダイアログが表示されたら【Continue】をクリックします
    ※Jamfのバージョンアップによりどうもここの挙動が変わったようです
  8. ブラウザが開き、再度AzureADのログインが求められるので、同様にログインします。

  9. 途中キーチェインへの保存のためにMacのローカルログインパスワードを聞かれますので、ローカルログインパスワードを入力し【常に許可】をクリックします

  10. 【続行】をクリックします

AzureAD側の登録を確認する

登録が完了するとAzureAD側にデバイスとして表示されてきます。

  1. Microsoft Endpoint Manager admin center へログインします
  2. 「デバイス」→【すべてのデバイス】をクリックします
  3. 登録したデバイス名で検索します。
  4. 以下のような形で登録されていることがわかります
  5. デバイス名をクリックすると詳細ページに遷移します
  6. コンプライアンスポリシーを定義している場合には、そのデバイスがポリシーに準拠しているかの確認をすることができます
    ここで準拠していない端末の場合には条件付きアクセスで、アクセスを拒否させたりすることが可能になります

運用時の注意点

端末をリカバリする際には、Intune側からデバイスレコードの削除処理が必要になります。
これを忘れてて再度Intune連携させようとすると同じデバイス名のレコードが2つになったりして混乱するのと
デバイス準拠がうまく判定されなかったりすることがあるようです。
MDMでの運用はどれも似たような感じになるとは思いますが、MDM側から一度データを削除するまたはワイプして
アンマネージド状態にしてから再登録するのがいいかと思います。

Dynamics365 営業案件ページに同一顧客の他営業案件を表示する方法

$
0
0

Dynamics365の営業案件ページに、同じ顧客で今動いている案件が他にあるかすぐ見れるようにしてほしいとの要望を受けて調べた結果以下のやり方で実現しました。
その際の手順をまとめます

やり方

  1. オープンされている営業案件一覧ビューを確認する
  2. ビューをサブグリッドとして、営業案件フォームに配置する
  3. JavaScript(以下JS)を利用して、ビューの検索条件を変更する

ビューのフィルタ作成だけでできれば一番簡単でよかったのですが、
営業案件から、現在開いている営業案件フォームの取引先をフィルタにすることができなかったのでJSを利用しビューのフィルタ条件を変更するようにしました

営業案件フォームのカスタマイズ

営業案件フォームにサブグリットを配置し、ビューを設定する

デフォルトで「オープンされている営業案件」というビューが存在していると思いますので
そちらのビューを利用して設定します

  1. 詳細設定から、営業案件エンティティを開き、営業案件メインフォームをカスタマイズ画面を開きます
  2. サブグリッドを選択し、配置したい場所にドラッグ&ドロップします(今回はタイムラインの上にしています)
  3. テーブルを「営業案件」、既定のビューを「オープンされている営業案件」に設定し、【完了】をクリックします
  4. ラベルを「その他営業案件」、名前を「subGrid_SalesList」としました
    ここでの名前をJS内で利用しますので、名前を違うものに設定シた場合にはJSのコードもあわせて修正してください
  5. この状態で、フォームを保存→公開します

JSをD365に登録する

以下のスクリプトを用意します
後ほどアップロードできるようにファイルで保存しておきます

function FetchSalesList(executionContext) {

    var formContext = executionContext.getFormContext();
    var parentaccountid = formContext.getAttribute("parentaccountid").getValue()[0].id;

    console.log("fetch parentaccountid: " + parentaccountid);

    var fetchXml = '<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">' +
    '<entity name="opportunity">' +
      '<attribute name="name" />' +
      '<attribute name="estimatedvalue" />' +
      '<attribute name="estimatedclosedate" />' +
      '<attribute name="ownerid" />' +
      '<attribute name="parentaccountid" />' +
      '<attribute name="opportunityid" />' +
      '<order attribute="estimatedvalue" descending="true" />' +
      '<order attribute="estimatedclosedate" descending="false" />' +
      '<filter type="and">' +
        '<condition attribute="statecode" operator="eq" value="0" />' +
        '<condition attribute="parentaccountid" operator="eq" value="' + parentaccountid + '" />' +
      '</filter>' +
    '</entity>' +
  '</fetch>';

    var subGrid_SalesListControl = formContext.getControl("subGrid_SalesList");
    console.log(subGrid_SalesListControl);
    if(subGrid_SalesListControl) {
        subGrid_SalesListControl.setFilterXml(fetchXml);
        subGrid_SalesListControl.refresh();

        sleep(5, function() {
            var rowCount = subGrid_SalesListControl.getGrid().getTotalRecordCount();
            console.log("rowCount: " + rowCount);
        });
    }else {
        setTimeout(FetchSalesList(),2000);
        console.log("No GridContorl");
    }
}

function sleep(waitSec, callbackFunc) {
    var spanedSec = 0;
    var waitFunc = function () {
        spanedSec++;
        if (spanedSec >= waitSec) {
            if (callbackFunc) callbackFunc();
            return;
        }
        clearTimeout(id);
        id = setTimeout(waitFunc, 1000);
    };
    var id = setTimeout(waitFunc, 1000);
}

  1. 「新規」→「その他」→【Webリソース】をクリックします
  2. 以下のように設定し、【ファイルの選択】をクリックし、事前に作成したJSファイルを選択します
    名前 new_fetchsubgridClassicUIAndUCI.js(当時なぜこういうファイル名にしたのかは不明・・・w)
    表示名 任意でわかりやすい表示名をいれてください
    説明 任意でいれてください
    種類 スクリプト(JScript)
    言語 日本語

  3. 【上書き保存】をクリックし、【公開】をクリックします

フォームロード時にJSが動作するよう設定する

  1. 「詳細設定」→「カスタマイズ」→「システムのカスタマイズ」を開きます
  2. 営業案件エンティティの営業案件メインフォームを開きます(クラッシクビューで開いて下さい)
  3. 【フォームのプロパティ】をクリックします
  4. イベントタブの、フォームライブラリ→【追加】をクリックします
  5. 追加JSファイルを検索し、【追加】をクリックします
  6. イベントハンドラー欄で、コントロール「フォーム」、イベント「OnLoad」を選択し、追加アイコンをクリックします
  7. ライブラリから追加JSファイルを選択し、関数に定義した関数名を入力します
    パラメータの「実行コンテキストを最初のパラメータとして渡す」にチェックをつけ【OK】をクリックします
  8. フォームを保存し、公開をクリックします

動作を確認する

オープンしてる営業案件が複数ある顧客の営業案件を開きます
タイムラインの上に、その顧客の他のオープン状態の営業案件一覧が表示されることを確認します
JSの動作が完了するまですこし時間がかかるので、一瞬何十件か見えますが、フィルタが適用されると表示が切り替わります。

以上です


Oktaで組織ロゴを変更する方法

$
0
0

Oktaで組織ロゴを変更する方法メモです。
とりあえず見た目からということでロゴを変えたいなと思い立ってやってみました(笑)

  1. Okta管理画面にログインします
  2. 「Settings」→【Appearance】をクリックします
  3. 下のほうにある「Organization Logo」にある【Upload Logo】をクリックします
  4. 組織ロゴデータを選択し、【Upload Logo】をクリックします
  5. ユーザー画面のロゴが変わったことを確認します

設定した後に、元に戻そうと思ったのですが戻す場所がわかりませんでした(笑)
どうやってロゴを初期値に戻すんでしょうか?どなたか教えてください

 

Oktaを利用して、DocuSignへのSAMLログインを設定する

$
0
0

Oktaを利用して、DocuSignへのSAMLログインを設定する

AzureADとDocuSignへのSAML連携はやまぐちさんのQiita記事がとても詳しいのでそちらを参照しましょう

OktaとDocuSignともにDeveloperライセンスでテストしています

DocuSign側の設定

組織の追加

組織を作成していない場合には、上部に組織作成の案内が表示されていると思いますので、そちらから組織を作成してください。
組織を詳細を入力し、作成した組織に紐付けたいアカウントを関連付けます

ドメインの追加

  1. DocuSignに管理者ユーザーでログインし、【設定】をクリックします
  2. 【切り替え】をクリックします
  3. 【DocuSign管理】をクリックします
  4. 【ドメイン】をクリックします
  5. 【ドメインの申請】をクリックします
  6. ドメイン名を入力し、【申請】をクリックします
  7. テキストトークンをコピーします

DNSへTXTレコード追加

  1. コピーしたテキストトークンの内容を該当ドメインのTXTレコードに追加します

TXTレコード検証

  1. TXTレコードへ追加し、DNSが伝播されたことを確認した後に、「アクション」→【検証】をクリックします
  2. ステータスが「アクティブ」になったことを確認します

 

Okta側での設定

  1. Okta管理画面へログインします
  2. 【Applications】をクリックします
  3. 【Add Application】をクリックします
  4. 検索ボックスにDocuSignと入力し、表示されたDocuSignを選択します
  5. 【Add】をクリックします
  6. 【Next】をクリックします
  7. 「SAML2.0」を選択し、【View Setup Instructions】をクリックします。
    (初見でここがボタンだとわからずどこだよ!!ってなったのは内緒です(笑))
  8. 別タブで情報が表示されるので控えておきます
  9. Identity Provider CertificateのURLをクリックし、証明書ファイルをダウンロードし保存します
  10. SAVEをクリックし保存します

DocuSignに情報を入力する

表示された内容をもとにDocuSignに情報を入力していきます。

  1. 管理画面ホームから【IDプロバイダー】をクリックします
  2. 【IDプロバイダーの追加】をクリックします
  3. 以下のように入力します。
    名前 任意の名前(ここではOktaとしました)
    IDプロバイダーの発行者 Oktaで表示された「Identity Provider Issuer」の値をコピーして貼り付け
    IDプロバイダープロバイダーのログインURL Oktaで表示された「Identity Provider Login URL/Redirect URL」の値をコピーして貼り付け
    IDプロバイダーのログアウトURL Oktaで表示された「Identity Provider Logout URL/Portal URL」の値をコピーして貼り付け
    認証要求の送信 POSTを選択
    ログアウト応急の送信 POSTを選択

  4. カスタム属性マッピングを下記のように設定します
    フィールド 属性名
    surename surename
    givenname givenname
    emailaddress emailaddress

  5. 【保存】をクリックします

 

証明書ファイルの追加

  1. 保存された名前をクリックし、編集画面を再度開きます
  2. 編集画面を下までスクロールし、【証明書の追加】をクリックします
  3. 事前にダウンロードした証明書ファイルを選択します
  4. 【保存】をクリックします
  5. 証明書のステータスが「有効に」なったことを確認します
  6. 「アクション」→【エンドポイント】をクリックします
  7. エンドポイントが表示されるので、下記2つのURLを控えておきます
    ・サービスプロバイダーの発行元URL
    ・サービスプロバイダーのアサーションコンシューマーサービスのURL

Okta側へURLを登録する

  1. Oktaへ登録済のDocuSignを開きます。
  2. 「General」→「App Settings」→【Edit】をクリックします
  3. Assertion Consumer Service URLとService Provider Issuer URLにDocuSignからコピーしたURLを貼り付け、【SAVE】をクリックします
    Okta側項目 DocuSign値
    Assertion Consumer Service URL サービスプロバイダーのアサーションコンシューマーサービスのURL
    Service Provider Issuer URL サービスプロバイダーの発行元URL
  4. 【SAVE】をクリックします

Oktaに追加したアプリにユーザーをアサインする

  1. 「Assignments」→「Assign」→【Assign to People】をクリックします
  2. 追加したいユーザー横にある【Assign】をクリックし、UserNameを入力する画面へ遷移するので、【Save and Go Back】をクリックします。
    【Done】をクリックします

Oktaからログインできるかテストする

  1. Oktaにアサインしたユーザーでログインします。
  2. 割り当てられたアプリが表示されているので、追加した【DocuSign】をクリックします
  3. DocuSignにログインできることを確認します
  4. トップ画面が表示されればOKです

 

AzureAD設定禁止パスワードを指定する

$
0
0

いつも忘れてしまうのでメモです
禁止パスワードを指定して、指定したパスワードをユーザーが設定できないようにします

Azure Active Directoryを開いて、【セキュリティ】をクリックします

 

パスワード保護→カスタム禁止パスワード欄にある、カスタムリストの適用を「はい」にします
カスタムの禁止パスワードの一覧に禁止パスワードを入力し、【保存】をクリックします

 

Dynamics 365 顧客体験のタイムゾーン既定値をJSTに変更する

$
0
0

デフォルト設定だと顧客体験の新規作成時にタイムゾーンがGMTで設定されてしまいます。
タイムゾーンを手動で修正することはもちろんできるのですが、別タブにあるため見落としがちです
そして、一度ライブにしてしまうとこのタイムゾーンを変更することができません・・・
そのため既定値としてタイムゾーンをJSTに設定しておきます

既定のマーケティング設定の変更

  1. 「設定」→「詳細設定」→【既定のマーケティング】をクリックします
  2. 「DefaultMktSettings」をクリックします
  3. 「顧客体験」タブをクリックし、既定のタイムゾーンをGMT+09:00に変更し、【上書き保存】をクリックします

顧客体験の新規作成

  1. 「顧客体験」→【新規】をクリックします
  2. 「全般」タブをクリックします
  3. タイムゾーンがGMT+09:00になっていることを確認します

 

AzureADの情報をjamf proインベントリに利用する

$
0
0

AzureADの情報をjamf proインベントリに利用する

jamf pro 10.27からクラウドアイデンティティプロバイダーとしてAzureADが利用できるようになりました。
今まではGoogleのセキュアLDAPのみでしたが、AzureADが対象となったことで選択肢が広がりました

jamf docsに書いてあるとおりですが、画像付きにしてみます(笑)

jamf proクラウドアイデンティティプロバイダにAzureADを設定

  1. Jamf Pro管理画面右上の歯車をクリックします
  2. 「システム設定」→【クラウドアイデンティティプロバイダ】をクリックします
  3. 「Azure」を選択し、【次へ】をクリックします
  4. 下記ダイアログが表示されるので、【OK】をクリックします

    10.27にアップグレードしてもらったばかりだったからか、当初はここで下記エラーが表示され進めなくなってしまいました

    1日時間を開けたら問題なくMSページへリダイレクトされるようになってました
    解決しない場合にはJamfサポートへ連絡するといいかと思います
  5. アクセス許可を求められるので、【承諾】をクリックします
  6. 「サーバ接続」ページが表示されるので、表示名を入力します
  7. 「マッピング」タブをクリックします
  8. M365E3やE5をメインで利用している場合には、標準設定のままでいいのですが、
    EMSライセンスだけで運用している場合 mail 属性に値が入らない という仕様(ほんとこれどうにかしてほしい)のためEメールのマッピングを「userPrincipalName」に変更し【保存】します
    (マッピング組織の運用に応じて変更してください)
  9. 検証ステータスが「成功」になれば接続が完了です

インベントリ情報にAzureAD情報を使ってみる

  1. コンピュータのインベントリを検索し、適当なマシンのインベントリ情報を開きます
  2. 「ユーザと位置」→【編集】をクリックします
  3. ユーザ名にuserPrincipalNameの値を入力し、【検索】をクリックします
  4. 氏名やEメールアドレス等AzureAD側に設定している情報が取得できればOKです。
    検索後必ず右上の【保存】をクリックして情報を保存してください

AzureADグループ情報も取得できるのですが、どこで使えるのかまだよくわかってません(笑)
エンロールメント時にAzureADサインインさせることで、インベントリに情報が自動設定されるか等はこれから試してみたいと思います

よいjamf proライフを!

 

 

Viewing all 215 articles
Browse latest View live