Kompira Enterprise から Windows GUI アプリケーションを操作する

運用の中で既に利用されているアプリケーションを自動化することができれば、運用効率の向上が期待できます。しかし、そのアプリケーションのインターフェースが GUI しか存在しない場合、それを自動化することは容易ではありません。

そこで本稿では、「Kompira Enterprise からWindows GUI アプリケーションを操作する」方法を紹介します。
具体的には、Windows アプリケーション操作ライブラリ Friendly を用いて、Windows の代表的なアプリケーションの「メモ帳」を操作するプログラムを作成し、そのプログラムを Kompira Enterprise から実行命令を出す形で実現します。


動作確認環境

ソフトウェア バージョン
Kompira Enterprise 1.4.10.post10
OS CentOS 6.10

または

ソフトウェア バージョン
Kompira Enterprise 1.5.5.post11
OS CentOS 7.8.2003

または

ソフトウェア バージョン
Kompira Enterprise 1.6.2.post4
OS CentOS 7.8.2003

また、操作対象の Windows サーバーの環境は以下の通りです。

ソフトウェア バージョン
Windows 10 21H1
Windows Server 2019 (バージョン1809)
WinRM 3.0

Windows アプリケーションの自動操作

Windows アプリケーションを自動操作する方法には、以下の2種類の方法が考えられます。

・マウスやキーボードをエミュレートする
・ボタンやテキストボックスなど UI 要素にアクセスし操作する

本稿では、時刻や内部データに応じて UI の表示量や表示順が変わる場合でも、確実に操作できる「UI 要素にアクセスし操作する」方法を取り上げます。

Friendly

Friendlyとは、Codeer 社が開発した Windows アプリケーション操作用ライブラリです。Friendly を使用することで、対象アプリケーションに別のプロセスからアタッチし、操作することができます。

Friendly によるメモ帳の操作

以下は、「メモ帳」の編集欄に任意の文字列を入力するコンソールアプリケーションの C# コードです。

このコードを操作したいアプリケーション (今回は、メモ帳) のある Windows サーバー上に作成し、実行ファイル化しておいてください。

※ 今回は後で GUI 操作の自動化が成功したか確認するために、書き込んだメモ帳を閉じないようにコーディングしてあります。

using System.Diagnostics;
using System.Threading;

using Codeer.Friendly.Windows;
using Codeer.Friendly.Windows.Grasp;
using Codeer.Friendly.Windows.NativeStandardControls;

namespace Kompira
{
    class Program
    {
        static void Main(string[] args)
        {
            WindowsAppFriend app_notepad = new WindowsAppFriend(Process.Start("notepad.exe"));
            WindowControl main_window = WindowControl.FromZTop(app_notepad);
            NativeEdit txt_edit = new NativeEdit(main_window.IdentifyFromDialogId(15));

            // 引数で指定した任意の文字列をメモ帳に書き込み
            string test_txt = args[0];
            txt_edit.EmulateChangeText(test_txt);
        }
    }
}

※ Friendly は NuGet から事前にプロジェクトにインストールしておいてください。インストールするライブラリは、Codeer.Friendly.Windows 、Codeer.Friendly.Windows.Grasp 、Codeer.Friendly.Windows.NativeStandardControls です。

プロセスへアタッチ及び構成要素へのアクセッサ取得

メモ帳は、以下のように、「編集欄」と「ステータスバー」から構成されます。

メモ帳アプリケーション を指定し、メモ帳のプロセスへアタッチします。

また編集欄の ID (今回は15) を指定し、アクセッサ (txt_edit) を取得します。

これらは、上のコンソールアプリケーションのコードにおける以下の部分です。

WindowsAppFriend app_notepad = new WindowsAppFriend(Process.Start("notepad.exe")); 
WindowControl main_window = WindowControl.FromZTop(app_notepad); 
NativeEdit txt_edit = new NativeEdit(main_window.IdentifyFromDialogId(15));

※ 構成要素の ID を取得するためにはアプリケーションの解析が必要ですので、Inspect や TestAssistant 等のツールを用いて事前に取得しておいてください。

編集欄への書き込み
取得したアクセッサを使い、引数に指定した文字列を編集欄へ書き込みます。

これは、上のコンソールアプリケーションのコードにおける以下の部分です。

string test_txt = args[0];
txt_edit.EmulateChangeText(test_txt);

PsExec の導入

先程作成したコンソールアプリケーションを外部から実行するために、本稿では PsExec というツールを利用します。PsExec はマイクロソフト純正の無償ツールであり、リモートからのコマンド実行を可能にします。

この PsExec を自動操作したいコンソールアプリケーションがある Windows サーバー上に配置してください。また、PsExec は初回起動時のみ使用許諾ダイアログが表示されるので、Kompira Enterprise 経由で実行する前に一度 Windows サーバー側で起動しておき、[Agree] ボタンを押下しておいてください。

PsExec で実行するコマンド

以下は、PsExec でコンソールアプリケーションを実行する例です。

> PSTools\PsExec64.exe -u {ログインユーザー名} -p {ログインパスワード} -i 1 {コンソールアプリケーションの絶対パス} {メモ帳に書き込みたい任意の文字列}

お使いの環境ごとに PsExec の配置されている場所は異なると思いますので、PSTools\PsExec64.exe はお使いの環境に応じて適宜変えてください。

-i 1 は、セッション ID の 1 を指定しています。

このセッション ID は、Windows サーバー上で以下のコマンドをコマンドプロンプトまたは PowerShell で実行することにより確認できます。

> query session

以下は、出力結果の例です。> の部分が現在のセッションを表しています。

セッション名 ユーザー名 ID 状態 種類 デバイス
services 0 Disc
> console user 1 Active

Windows アプリケーションを自動操作するジョブフロー

以下は、Windows アプリケーションを自動操作するジョブフローの例です。

| txt = 'hoge' | // メモ帳に入力したい任意の文字列
 
[
    __host__ = '{ホスト名}',
    __port__ = '5985',
    __user__ = '{ログインユーザー名}',
    __password__ = '{ログインパスワード}',
    __conntype__ = 'winrs'
    
] ->
["PSTools\PsExec64.exe -u $__user__ -p $__password__ -i 1 {コンソールアプリケーションの絶対パス} $txt"]

ジョブフロー中の txt パラメータを任意の文字列に変更することで、メモ帳に任意の文字列を自動入力することができるようになります。

以下の画像から、このジョブフローを実行すると、Windows 画面でメモ帳が起動し、”hoge” という文字列が入力されていることがわかります。

まとめ
本稿では、Kompira Enterprise から Friendly を用いてメモ帳を操作する方法を紹介しました。この方法を応用することで様々な Windows GUI アプリケーションを自動的に操作することができます。

TOP