UiPathでOrchestratorを使ってログイン情報を安全に保存する方法 (アセット)

# 概要
RPAで本番環境でシステムを運用する場合、よくあるのが連携するシステムへのログオン作業です。この際、アカウント情報を安全なところに保持しておき、必要な時に情報をひっぱってきて利用する、という運用が望ましいです。間違ってもローカルPCに情報を保管したり、ボットのコードの中に埋め込んだりしてはなりません。

UiPathではOrchestratorを導入すると「[アセット](https://docs.uipath.com/orchestrator/lang-ja/docs/about-assets)」の機能で実現できるので、これを使ってみました。
>:warning: UiPathを使っている場合、ロボットにハードコードしたり、ローカルPC内のExcel/テキストファイルに保存したり、ローカルPCのWindows資格情報に保存したり、という事例が多いですが、いずれも**誰でもアクセス可能な危ない場所で補完されている、中央で集中管理できない、など、大事なアカウント情報が危険にさらされてしまう**ので、UiPathでシステムへのログインを行うロボットを作成する際にはUiPath Orchestratorの導入を強くお勧めします。

対象

* [UiPath Orchestrator Community Edition](https://platform.uipath.com/) v19.12.20-release 43
* UiPath Studio Community Edition v2019.12.0-beta61

# UiPath Orchestratorとは
UiPathロボットの展開や管理を一元的に行うサーバー機能です。Community Editionはクラウドでホストされており、インストールが不要ですので始めやすくなっています。

UiPath Orchestrator Community Editionのサインアップ/ログイン画面
https://platform.uipath.com 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/2217d176-97aa-302d-37d3-0c542752fc79.png)

UiPath Orchestrator Community Editionのログイン直後の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b37439f0-ffcd-2013-25da-67197eda5abe.png)

UiPath Orchestrator Community Editionへのサインアップと初期設定の方法は以下の記事が詳しいので参照してください。あらかじめ、UiPath OrchestratorとStudioをセットアップしたうえで両者を接続してOrchestratorにマシンとロボットを登録して、StudioへのライセンスをOrchestratorから提供している状態にしておいてください。

* 『[UiPath Orchestrator Community Edition へのサインアップからHelloWorldまで。](https://qiita.com/masatomix/items/096de223e05511a1166c)』 by @masatomix さん

# アセットの利用のしかた
Orchestrator上で**管理者が**あらかじめ設定しておいた値をStudioから「Orchestrator」-「アセット」のアクティビティで参照することができます。アクティビティで読み取りをリクエストしたアセットと、Orchestrator のデータベースに格納されているアセットの名前が同じで、かつ、そのロボットが読み取れる権限を持っている (グローバル値、またはそのロボット用の固有値)なら、値の取得が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e79e57e4-bac9-b585-7b08-f6a98f73e288.png)

* [アセットを取得/認証情報を取得](https://docs.uipath.com/orchestrator/lang-ja/docs/about-assets)
* アセットを設定/資格情報を設定

# 事前準備: アセットと資格情報の準備

### アセットとは？資格情報とは？その概念
「アセット」とは、UiPath Orchestratorで保持している共有変数または共有の資格情報のことです。いわば共通の「**資産管理台帳**」です。この "台帳" で管理できるのは、Text、Bool、Integer型の変数と、ユーザー名/パスワードの対で資格情報ストアに保存されるCredentialです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/45be5aaa-a8dd-a4a7-c298-c989f360120c.png)
それぞれのアセットはロボット共通の "グローバル" に共通な値の設定ができます。もしくは、ロボットごとの個別の設定を持つこともできます。グローバル値は、特定の値がロボットに割り当てられていない限り、すべてのロボットが受け取る既定値です。

|オブジェクト|説明|
|:--|:--|
|アセット (Asset)|Text、Bool、Integer型もしくは資格情報のこと。グローバル値 (Global Value) とロボット毎の値 (Value Per Robot) の2種類を持つことができる。|
|資格情報 (Credential)|大事なユーザー名とパスワードが対になった情報。|

>注: アセットの設定画面はクラシックフォルダーとモダンフォルダー (Orchestratorでいまベータで機能拡張中のプロファイル設定)で異なるようですが、この記事では従来のクラシックフォルダーの設定を前提とします

### 想定される管理シナリオ
アセットの管理シナリオには、大きく分けて2つのパターンが存在します。どちらのパターンも**管理者が**あらかじめ設定します。

|アセット|アセット適用範囲|説明|
|:--|:--|:--|
|管理者が登録|グローバル値|集中管理された万人共通の1種類のユーザー名/パスワードを使って複数のロボットでサインインしてもらうパターン。|
|管理者が登録|ロボット毎の値|管理者がそれぞれのロボット用のユーザー名/パスワードをを登録して、それぞれのロボットが各資格情報でサインインしてもらうパターン。|

>注: ロボットの実行中にロボット毎の値を設定するアクティビティもあるようですが、これは実用性があるのか...

### Orchestratorでの管理画面
資格情報を設定するには、OrchestratorのDefaultサービスの中の「オートメーション」-「アセット」画面を開いて、右側の⊕ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/20dd1a16-fbd1-cee3-73a7-db4c83ef1a52.png)
まず「アセット名」に入力します。("SAPuser" と入力してみましょう) 次に「型」のドロップダウンを「Credential」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/97f71c61-e8a1-9faa-da14-00013a1bdb2c.png)
全ロボットに共通の値を設定する場合は「グローバル値」をONにしたままにします。その場合、すぐ下の「ユーザー名」「パスワード」には共通の値を入れます。そうでない場合は、⊕ボタンをクリックして個別の値を指定します。(グローバル値と個別の値を両方設定することもできます。その場合、個別の値が設定されているロボットでは個別の値が優先されます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/952606c6-0b5b-18c1-397b-e25342996351.png)
個別の値を設定するようにした場合は、ドロップダウンから登録済みのロボットを選択して、「ユーザー名」「パスワード」の値を個別に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/df80af8c-875f-61b7-753a-c7993c4aa5f8.png)
最後に「作成」ボタンをクリックすると、アセットの一覧にアセットが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a0482682-1a9c-83ae-20fa-6bdf4ebc5bb3.png)

# サンプル: Orchestrator への自動ログインボットでのアセットの利用
Orchestratorで設定したアセットを読み出すロボットをStudioで作成してみましょう。

以下のようなシーケンスを作成してみます。

* 「資格情報を取得」アクティビティを最初に持ってくる。アセット名には "SAPUser" と指定 (ダブルクオートで囲うこと)。
* 変数として、"User" (System.String型)、初期値指定なし、"Password" (System.Security.SecureString型)、初期値指定なし、を作成して、「資格情報を取得」アクティビティの出力部分に指定。
* 「資格情報を取得」アクティビティの後ろにメッセージボックスアクティビティを置いて、「`User+" "+Marshal.PtrToStringUni(Marshal.SecureStringToBSTR(Password))`」という式を表示。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7d65d976-9757-00e0-df55-eb4a0b38107b.png)


実行結果:
Orchestratorで先ほど指定した「ユーザー名」が空白の前に表示されたと思います。グローバル値とロボット毎の値を両方指定している場合は、ロボット毎の値が表示されたはずです。パスワードの値は先ほどのおまじない的なコマンドによって、復号化されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a3c28f3a-09ef-9fd3-005d-69aa0ab151e9.png)