UiPath でローカル管理者権限が必要な処理を PowerShell で実行させる
<!>注意<!>
6月29~7月1日まで公開した情報は間違っていました。現在公開している内容は修正済のものです。
記事の概要
記事のタイトルのまんま。どうやればフローの中で管理者権限が必要な処理を PowerShell で実行できるかというお話。
どういう状況にあったのか
UiPath では UAC のウィンドウを操作できないし、かといってユーザアカウントまわりの設定をいじる権限もない。でも管理者権限で実行しないといけないコマンドを UiPath の中で実行しなくてはならない。
どうやら「Windows 資格情報」に対話型ログオンの情報があれば RunAs で PowerShell を実行してもパスワード入力が省略されるとのこと。とはいえ、言い換えればこれは「パスワードの入力なしで管理者としてコマンドを実行されてしまう」ことでもあるのでセキュリティ的に問題がある。
で、どうやって解決したの?
以下のような手順で処理を行うことで解決しました。
前準備として「Windows 資格情報」に(対話型ログオンのものではない資格情報として)ローカル管理者のユーザー名とパスワードを追加する
手順 1 で追加した資格情報を cmdkey で対話型ログオンの資格情報として設定する
手順 2 で設定した対話型ログオンの資格情報を用いて RunAs で PowerShell を起動する
処理が終わったら手順 2 で設定した対話型ログオンの資格情報を cmdkey で削除
具体的にはどんな感じ?
前準備の資格情報の追加は UiPath ではなく Windows の資格情報マネージャーで行います。「インターネットまたはネットワークのアドレス」は UiPath で呼び出す際に使用しますので、任意の文字列で問題ありません。ユーザ名とパスワードにはローカル管理者のものを設定しておきます。
続いて UiPath で GetSecureCredential で前準備で設定した情報を取得します。「インターネットまたはネットワークのアドレス」に設定した文字列を Target に(直接設定する場合は "" で括ることを忘れずに)設定すれば Output の Password と Username に資格情報が吐き出されます。このとき Password は SecureString 型で返却されます。
さて、ここで重要なのが「この時点で対話型ログオンの資格情報があってはならない」ことです。なぜなら次に行う RunAs コマンドを実行する際、パスワードの入力を要求されることを前提にしてしまった方が余計な分岐を考えずに済むのですが、何らかの理由で処理が中断されて資格情報が残ったままだとここで想定していない挙動が発生するためです。
ですので invokePowerShell のアクティビティに以下のようなコマンドを設定します:
Start-Process powershell 'cmdkey /delete:Domain:Interactive=$Env:COMPUTERNAME\[管理者のユーザ名]; RunAs /savecred /user:[管理者のユーザ名] powershell'
こうすることで PowerShell が立ち上がりパスワードを要求してくるので、既に取得してるパスワードを TypeSecureText で PowerShell に渡してから SendHotKey で Enter を押下すれば、管理者権限で PowerShell が立ち上がります。
あとは管理者権限を持った PowerShell に TypeInto でコマンドを送り SendHotkey で Enter を押下、という流れで目的は果たせるはずです。処理が終わったら以下のコマンドを設定した invokePowerShell アクティビティを配置しておけば、対話型ログオンの資格情報は削除されます:
cmdkey /delete:Domain:Interactive=$Env:COMPUTERNAME\[管理者のユーザ名]
実行したコマンドが成功したか失敗したかは
$? | Clip
を実行した結果をクリップボードに吐き出させてから GetFromClipboard で持ってこられると思うので各々良きに計らってください。ただし GetFromClipboard は既にクリップボードに値が存在する場合、それを吐き出して「ヨシ!」してしまうので、コマンドを実行させる前に SetToClipboard に "" を設定してクリップボードに空文字を設定しておきましょうネ。
この記事が気に入ったらサポートをしてみませんか?