【UiPath】ログイン情報（ユーザーID/パスワード）の持たせ方

業務アプリケーションの操作を自動化する際に避けて通れないのが、
そのアプリケーションへのログイン情報（ユーザーID/パスワード）をどこから持ってくるか？、という話。

Unattended robotなら、Orchestrator内のCredential型Assetに持たせといて、
オートメーション内でGet credentialで取ってくればいいんだけど、Attended robotはそうもいかない。

- オートメーション起動時にダイアログ出して人間に入れさせる → ダサい。めんどくさい。
- ローカルファイルに書いといて、Read text file → ええっ、パスワードを平文ファイルに書くの？
- オートメーションのType intoのプロパティにべた書き → オートメーションが流出したら最悪。

というわけで色々悩んだのですが、UiPath AcademyでWindows資格情報の話が出たのをふと思い出しました。

# Windows資格情報に持たせる
Windowsには資格情報マネージャーという、ログイン情報をセキュアに保持する仕組みがあるので
そこに各アプリケーションのログイン情報を持たせておいて、オートメーションの中で取ってくるのが
今考えられるベストな方法だと思います。
これならPCにログインする人ごとにユーザーID/パスワードを変えられるしね。

というわけで、Windows資格情報を使ってQiitaにログインさせてみたいと思います。

### Windows（汎用）資格情報の設定
①コントロールパネル → 資格情報マネージャー
![Credential1.png](https://qiita-image-store.s3.amazonaws.com/0/255097/57ef397d-37d6-8470-01ab-8b64a68f47e5.png)

②Windows資格情報コンテナ → 汎用資格情報の追加
![Credential2.png](https://qiita-image-store.s3.amazonaws.com/0/255097/0118d642-acda-64e9-338c-7ced8e8fdea8.png)

③資格情報（ログイン情報）の入力
１行目は「インターネットまたはネットワークのアドレス」とありますが、別にURLである必要は無く、
わかりやすい任意の名前を付ければ良いです。UiPathはこの名前でログイン情報を取ってきます。
今回の例では、"Qiita-Login"とします。
![Credential3.png](https://qiita-image-store.s3.amazonaws.com/0/255097/7331ea03-20da-1fc6-ffe1-cc605026a06f.png)

④汎用資格情報として登録されました。
![Credential4.png](https://qiita-image-store.s3.amazonaws.com/0/255097/cf34b703-056d-5b8c-4425-b085ee9fd58e.png)

### Windows資格情報用パッケージのインストール
UiPathのデフォルト機能にはWindows資格情報を取ってくるアクティビティは含まれていないので、
Package ManagerからUiPath.Credentials.Activitiesを追加インストールします。
![Install.png](https://qiita-image-store.s3.amazonaws.com/0/255097/3bade64a-79ed-66f8-b74a-f431184a2d18.png)

インストールすると、System > Credentialsの下に専用アクティビティが追加されます。
![activities.png](https://qiita-image-store.s3.amazonaws.com/0/255097/61f506e3-5552-3e01-1535-12eeb0f3765e.png)

これで準備完了。
### オートメーションからログイン情報を取得
Windows資格情報からQiitaへのログイン情報を取得し、Qiitaにログインするところまでやってみます。
![Flowchart.png](https://qiita-image-store.s3.amazonaws.com/0/255097/ace9a1ec-9f62-b237-9251-9ecba8482cc9.png)

Windows資格情報を取得するアクティビティはGet "Secure" Credential。
（※似た名前でGet Credentialもありますが、こっちはAsset用で別物なので注意）
Targetには資格情報につけた名前を指定、ユーザーID/パスワードが返ってくるので、それぞれ変数に格納。
![GetCredential.png](https://qiita-image-store.s3.amazonaws.com/0/255097/7e6153d4-0105-fcbd-a558-290474ff07c0.png) ![Property.png](https://qiita-image-store.s3.amazonaws.com/0/255097/27e6757a-143f-878a-d4a4-42f682b0a118.png)

で、Type intoにそれぞれユーザーID/パスワードを設定すると、パスワード側で警告が出る。
![Sequence.png](https://qiita-image-store.s3.amazonaws.com/0/255097/16508251-c495-f981-1c59-109ae7c4cfff.png)

ええと、「'System.Security.SecureString'の値を'String'に変換できません」とな。
実はGet Secure Credentialから返ってくるパスワードはSecureStringという専用の型に入ってくるので、
そのままではType intoアクティビティが食えないのです。
![Variables.png](https://qiita-image-store.s3.amazonaws.com/0/255097/ef1a346e-a06b-50f1-4490-e6fb757032b8.png)

困った時はUiPath Communityを検索・・・[あったあった。](https://forum.uipath.com/t/how-to-pass-a-securestring-argument/656)
SecureString → Stringへの変換は
> new System.Net.NetworkCredential(string.Empty, パスワード変数).Password

でいいのか。strPassword.ToString()じゃダメらしい。

というわけで、変換したものをType intoに食わせて・・・
![Convert.png](https://qiita-image-store.s3.amazonaws.com/0/255097/78dc715a-d1ac-bff2-d651-be98a441da75.png)

実行。うんうん、うまくいった。
![execute.gif](https://qiita-image-store.s3.amazonaws.com/0/255097/a4fe2cf2-f68c-ad7c-f137-f05be6cec88b.gif)

---
今回はここまで。

2018/07/03 
SecureString → Stringへの変換ですが、[@hidecha](https://qiita.com/hidecha)さんのアドバイスにより、Type intoの代わりに
**Type Secure Text**アクティビティを使う事で、変換不要でそのままSecureString変数を入力できました。
こっちの方が全然楽ですね。いや恥ずかしい。
![TypeSecure.png](https://qiita-image-store.s3.amazonaws.com/0/255097/ba7102e6-ad31-6489-5bdf-deba94dadead.png) ![SecureProperty.png](https://qiita-image-store.s3.amazonaws.com/0/255097/29f2a4f3-a26d-6014-27af-00df4896d4d1.png)

@hidechaさんありがとうございました！