以前、Power Automate Desktop(PAD)を定期実行する方法について記事を書きました。
PADの定期実行はなにかと便利で、私自身も日々の業務で活用しているのですが、たまに、
PADがいつの間にかログアウトされていて、フロー実行に失敗していることがありました。
そこで今回は、この現象の原因と対策についてまとめたいと思います。
原因と考えられるもの
PADがいつの間にかログアウトされている問題。
これが起こるのは、会社PCで定期実行を設定している場合のみで、自分のPCで運用しているものは今のところ起こっていません。
そこで、組織アカウントの設定に何か原因があるのではないかと思い調べてみました。
職場や学校ではアカウントが一律で管理されている
職場や学校ではセキュリティを確保するために、定期的にユーザーをサインアウトさせるポリシーを採用していることがあります。
PADのサインインは、ユーザーの資格情報を使用しAzure Active Directory(Azure AD)からトークンを取得しています。トークンには有効期限があり、いったんサインインしてから一定時間経過すると、再度サインインをする必要があります。
参考:セキュリティの拡張機能: ユーザー セッションとアクセス管理
なので結論、職場や学校などで設定されている内容に従ってログイン有効期間は設定されているため、もし組織アカウントの場合はPADがいつの間にかログアウトされている問題はどうしようもないということです。
対策
対策としては、定期実行をする際のPowerShellスクリプトに、ログアウトされていたらログインするという処理を追加します。
※なお、PADを起動するPowerShellの作成については、過去記事にて解説しています。過去記事で作成(というか引用させていただいた)スクリプトに以下を追加します。
参考にさせていただいた[Power Automate Desktop]名前を指定してフローを実行するPowerShellスクリプトの記事でいうと、以下の赤枠部分にスクリプトを追加します。
追加するPowerShellスクリプト
追加するPowerShellスクリプトは以下です。
「★ご自身のメールアドレス★」と「★パスワード★」はご自身のものに変更してください。
# 「サインイン」テキストが画面に表示されているか確認
$cndSignInText = New-Object $pcdn($uiAuto::AutomationIdProperty, "EnterEmailTextBox")
$elmSignInText = $elmPadWindow.FindFirst($tree::Subtree, $cndSignInText)
if ($elmSignInText -ne $null) {
Write-Host "ログアウトしています。Microsoftアカウントへのサインインを実行します。"
# メールアドレス入力
$valuePattern = [System.Windows.Automation.ValuePattern]::Pattern
$vpEmailTextBox = $elmSignInText.GetCurrentPattern($valuePattern)
$vpEmailTextBox.SetValue("★ご自身のメールアドレス★")
# サインインボタンクリック
$cndSignInButton = New-Object $pcdn($uiAuto::AutomationIdProperty, "SignInButton")
$elmSignInButton = $elmPadWindow.FindFirst($tree::Subtree, $cndSignInButton)
if ($elmSignInButton -ne $null) {
$ipSignInButton = $elmSignInButton.GetCurrentPattern($iptn)
$ipSignInButton.Invoke()
} else {
Write-Host "サインインボタンが見つかりませんでした。"
}
# "開くまで10秒待機"
Start-Sleep -Seconds 10
# パスワードの入力
Add-Type -AssemblyName System.Windows.Forms
# カーソルがアクティブなテキストボックスにテキストを入力
[System.Windows.Forms.SendKeys]::SendWait('★パスワード★')
# 「サインイン」をクリック
[System.Windows.Forms.SendKeys]::SendWait("{TAB}{TAB}{TAB}{TAB}")
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
exit
} else {
Write-Host "ログインされています"
}
上記を追加したスクリプトを、前回記事と同様にタスクスケジューラに登録しておきます。実行すると、サインアウトされているときのみログイン処理を行うようになります。
スクリプトの概要
「サインイン」ボタンが存在していればサインアウト状態、そうでなければすでにログイン済と判断しています。
上記画面で「サインイン」を押下すると、Microsoftのサインイン画面に遷移します。
以降の操作はInspect (Inspect.exe)でうまく要素をとれなかったので、単純にSendKeysでキー操作を行っています。
サインイン後、これまで通りフローを実行する流れとなります。
注意点
パスワード入力にカーソルが当たってないことがある
パスワード入力の画面なんですけど、まれにカーソルが当たった状態になってないことがあるんです。。。
この場合はフローが失敗します。この画面が開くまで10秒待機しているので、開ききってないということもないと思うのですが・・・対策は分かりません。。。
Microsoftサインイン画面が例と異なる場合
Microsoftサインイン画面が、例で説明したものと異なっていることがあるかと思います。
というか、たぶんデフォルトはコード入力で、登録されているメールアドレスにコードが送られてくるようになっていると思います。
いったん、「代わりにパスワードを使用する」を選択しておけば、次回開くときはパスワード入力になりますので、スクリプト実行前に事前に一度この画面まで操作して、パスワード入力にしておくと解決できるかと思います。
ただし、組織アカウントの場合このへんの画面も保持されず、毎回コード入力の画面になるかもしれません、その場合はSendKeysで「代わりにパスコードを使用する」を押すという処理の追加が必要になりそうです。
まとめ
今回は、Power Automate Desktop(PAD)がいつの間にかログアウトされていて、フロー実行に失敗する原因と、その解決方法について解説しました。
組織アカウントでたまにPADがログアウトされている件については、なんでだろう?と思いながらもその場しのぎで手動ログインしていたので、深く考えることはありませんでした。
今回、このような対策をしてみましたが、実際の運用でまだ使ったわけではないのでもしおかしな点やご指摘があればコメントか問い合わせからご連絡ください。
今後も日々の業務を少しでも楽にできるようなアイディアを投稿できるよう頑張ります。
コメント