これまで数回にわたり、PowerShellからMicrosoft Edgeを操作する方法を取り上げてきた。今回からはこの機能を使って実際にどのような活用をしていくのかのサンプルを取り上げていく。まずは、ルータの管理WebページをPowerShellから操作する方法を紹介しよう。

→連載「PowerShell Core入門 - 基本コマンドの使い方」の過去回はこちらを参照。

ルータの管理用Webインタフェース

現在のネットワーク機器、例えばルータは管理用のWebインタフェースを提供しているものが多い。Webブラウザでルータにアクセスすると管理用のWebページが表示され、ここからルータの設定を行うことができる。

通常、ルータにはアカウントが設定されている。いくつかの方式があるが、次のスクリーンショットの場合、管理用のWebインタフェースはBasic認証でアクセス保護されている。Microsoft EdgeがBasic認証で必要となるユーザー名とパスワードの入力を求めていることがわかる。

  • Basic認証を使うルータの管理用Webインターフェース

    Basic認証を使うルータの管理用Webインタフェース

Basic認証のダイアログで「キャンセル」を選択すると、このルータの場合には次のように認証エラーのページが表示される。認証をクリアしていないので管理用のWebインタフェースにアクセスできない。

  • Basic認証をキャンセルすると管理用Webインターフェースに到達できない

    Basic認証をキャンセルすると管理用Webインタフェースに到達できない

先ほどのBasic認証ダイアログで適切なアカウントを入力すると、次のように管理用のWebインタフェースが表示される。

  • Basic認証をクリアして管理用Webインターフェースが表示されたところ

    Basic認証をクリアして管理用Webインタフェースが表示されたところ

このようにBasic認証をクリアして初めて、Webページにアクセスできる。システムによってはBasic認証の後に、さらに別のアカウントの入力を求められるものもある。

Webインタフェース経由でなければ提供されないデータがある

高級なネットワークアプライアンスになると、専用のAPIを経由したり、Webサービスを経由することでネットワークデバイスの各種データを取得したりと、操作自体が可能になることが多いのだが、コンシューマや小規模オフィス・ホームオフィス(SOHO: Small Office/Home Office)で使うようなレベルのネットワーク機器はWebインタフェースは提供していてもAPIやWebサービスは提供されていないことが多い。

この場合、人間がWebブラウザを操作する必要がある。

  • Microsoft Edgeで動作してログを確認する

    Microsoft Edgeで動作してログを確認する

しかし、である。こうした操作はルーティーン的であることが多く、そして創造的な仕事ではない。できればPowerShellで自動化して人の手がかからない状態で済ませるのがよい。

例えば、ルータのログデータを週に1回収集して動作を確認するとか、おかしなアクセスがないか確認するとか、不具合が発生していないか確認するとか、そういった操作は人じゃなくてもPowerShellで自動化できるような内容だ。そういったものはPowerShellで自動化して、人間はその結果だけをメール通知で確認するとか、そこまでシンプル化する方がよい。

Basic認証をクリアする

今回はまずBasic認証をクリアしてアクセスするところまで確認する。

いつも通り、PowerShellから操作するためのMicrosoft Edge WebDriverを起動する。スクリプトは付録として稿末に記載してあるので参考にしてもらえればと思う。

webdriver_edge_start.ps1
  • 起動してくるPowerShellから制御可能なMicrosoft Edge

    起動してくるPowerShellから制御可能なMicrosoft Edge

次にSet-SeUrlコマンドレットでルータの管理Webインタフェースを開く。

Set-SeUrl -Url http://192.168.1.1
  • Basic認証の入力が求められる

    Basic認証の入力が求められる

ここで適切なアカウントを入力すればよい。Microsoft Edgeの開発者ツールを起動して入力フィールドのXPathを取得しようとすると、取得できないことがわかる。

Basic認証のダイアログはMicrosoft Edgeが表示しており、Webコンテンツではない。このため、XPath経由で取得することができない。

  • Basic認証はXPath経由ではアクセスできない

    Basic認証はXPath経由ではアクセスできない

.NETの機能を使えばこのダイアログにアカウントの入力を行うことはできるのだが、Microsoft Edge WebDriverは一般的なBasic認証指定方法が機能するので、この方法を使うのが簡単だ。Set-SeUrlコマンドレットで指定するURLに、次のようなフォーマットでユーザー名とパスワードを含める。これでBasic認証ダイアログに入力と行ったのと同じ状態になる。

Set-SeUrl -Url http://ユーザー名:パスワード@192.168.1.1

これで次のように管理用Webインタフェースが表示される

  • Basic認証をクリアして管理用Webインターフェースにアクセスした状態

    Basic認証をクリアして管理用Webインタフェースにアクセスした状態

Basic認証は手軽な方法なので今でも使われているケースは多い。ここをクリアできないとそもそもPowerShellから操作にたどり着くことができない。最初にアクセスできるようにしておきたいところだ。

使いどころは慎重に

当然だが、このシンプルな方法はBasic認証のユーザー名とアカウントをPowerShellのコマンドレットに直接指定している。常用する場合はこれをPowerShellスクリプトにまとめることになるわけだが、要するにPowerShellスクリプトにユーザー名とパスワードを直書きすることになる。これではアカウントはダダ漏れであり、認証の意味がない。セキュリティが求められる場所ではこのようなPowerShellスクリプトを書いてはいけない。

この手軽な方法は信頼できる環境で処理を手軽にするために使う方法であって、信頼できない状態や、それなりのセキュリティが求められる状況ではほかの方法を検討する必要がある。まずは使いやすさと動作することを確認していきたいので、この方法での実装方法を取り上げていく。

付録

webdriver_edge_start.ps1

#!/usr/bin/env pwsh

#========================================================================
# Microsoft Edge WebDriverを起動する
#========================================================================

#========================================================================
# 動作しているMicrosoft Edge WebDriverをすべて終了
#========================================================================
webdriver_edge_stop.ps1

#========================================================================
# Seleniumモジュールがない場合にはインストール
#========================================================================
if (-Not (Get-InstalledModule -Name Selenium 2> $Null)) {
    'Seleniumモジュールをインストールします。'
    Install-Module -Name Selenium -AllowPrerelease -Force
    Get-InstalledModule -Name Selenium
}

#========================================================================
# Microsoft Edge WebDriverを起動
#========================================================================
'Microsoft Edge WebDriverを起動します。'
$Size = '1200,800'
if  (-Not (Start-SeDriver -Browser Edge -Size $Size 2> $Null 3> $Null))
{
    #================================================================
    # Microsoft EdgeとMicrosoft Edge WebDriverのバージョンが一致して
    # いないためにドライバが動作しなかった可能性がある。
    #================================================================

    #================================================================
    # 不要なドライバプロセスを終了
    #================================================================
    webdriver_edge_stop.ps1

    #================================================================
    # Microsoft Edgeのバージョン番号
    #================================================================
    $EdgeDir='C:\Program Files (x86)\Microsoft\Edge\Application\'
    $EdgeVersion=(  Get-ChildItem -Name $EdgeDir                    | 
                    Where-Object { $_ -NotMatch "[a-zA-Z]+" }       |
                    Select-Object -First 1                          )
                    # ↑ 【Select-Object -First 1の理由】
                    # 更新前のバージョンと更新後のバージョンが同時に
                    # 存在するタイミングがあるので、更新後のバージョン
                    # のみを取得するためにSelect-Objectを実行している。

    #================================================================
    # Microsoft Edge WebDriverダウンロードURLとデプロイ先パス
    #================================================================
    $DriverURL="https://msedgedriver.azureedge.net/$EdgeVersion/edgedriver_win64.zip"

    $SeModVer=(Get-InstalledModule -Name Selenium).Version -replace "-.+$",""
    $DriverDir="$env:HOME\Documents\powershell\Modules\Selenium\$SeModVer\assemblies"
    $DriverDownloadDir="$DriverDir\_download"

    #================================================================
    # WebDriverダウンロード用の一時ディレクトリを作成
    #================================================================
    New-Item        $DriverDownloadDir -ItemType Directory -Force

    #================================================================
    # Microsoft Edgeと同じバージョンのMicrosoft Edge WebDriverを
    # ダウンロード
    #================================================================
    "Microsoft Edge WebDriver version $EdgeVersion をダウンロードします。"
    curl            -get                                            `
                    -o      $DriverDownloadDir\edgedriver_win64.zip `
                    $DriverURL

    #================================================================
    # Microsoft Edge WebDriverをデプロイ
    #================================================================
    "Microsoft Edge WebDriver version $EdgeVersion をインストールします。"
    Expand-Archive  -Path $DriverDownloadDir\edgedriver_win64.zip   `
                    -Destination $DriverDownloadDir                 `
                    -Force

    Copy-Item       -Path $DriverDownloadDir\msedgedriver.exe       `
                    -Destination $DriverDir\msedgedriver.exe        `
                    -Force

    #================================================================
    # WebDriverダウンロード用の一時ディレクトリを削除
    #================================================================
    Remove-Item     $DriverDownloadDir -Recurse -Force

    #================================================================
    # Microsoft Edge WebDriverを起動する
    #================================================================
    if      (-Not (Start-SeDriver -Browser Edge -Size $Size 2> $Null 3> $Null)) 
    {
            #========================================================
            # 原因不明の起動不能
            #========================================================

            #========================================================
            # 不要なドライバプロセスを終了
            #========================================================
            webdriver_edge_stop.ps1

            Exit
    }
}
'Microsoft Edge WebDriverの起動処理完了。'

webdriver_edge_stop.ps1

#!/usr/bin/env pwsh

#========================================================================
# Microsoft Edge WebDriverを終了する
#========================================================================

#========================================================================
# WebDriverプロセスを終了
#========================================================================
if  (Get-Process -Name msedgedriver 2> $Null) 
{
    '動作しているMicrosoft Edge WebDriverを終了します。'
    Get-Process -Name msedgedriver 2> $Null

    # Microsoft Edge WebDriverを終了
    Stop-SeDriver 2> $Null

    # まだ動作しているほかのMicrosoft Edge WebDriverを終了
    if      (Get-Process -Name msedgedriver 2> $Null) 
    {
            Get-Process -Name msedgedriver 2> $Null | Stop-Process
    }

    '動作しているMicrosoft Edge WebDriverの終了処理完了。'
}