はじめに
テレワークで家のPCから社内ネットワークに接続する際、パスワード認証を2回通す必要があります。これが思いのほかめんどくさい…
始業時/休憩明けはもちろん、回線混雑で接続切れが起きる度に2回認証しないといけないので、これをワンクリックで出来るようにしてみようと思います。
まずは前段として、認証のために必要な処理を洗い出し、実装していきます。
認証に必要な処理の洗い出し
- IE起動
- IEをアクティブ化
- タグ(入力欄、リンク、ボタン)の取得
- ユーザー/パスワードの入力
- リンク、ボタンの押下
- ページ読み込み待ち
- frame/iframe構造ページ内のタグの取得
各処理の実装
IE起動
$URL = "https://www.hogehoge.com/login/"
# シェル取得
$shell = New-Object -ComObject Shell.Application
# IE起動
$ie = New-Object -ComObject InternetExplorer.Application;
# IE可視化
$ie.Visible = $true
# URLをオープン
$ie.Navigate($URL)
IEをアクティブ化
Add-Type -AssemblyName Microsoft.VisualBasic
# IEをアクティブにする
$window_process = Get-Process -Name "iexplore" | ? {$_.MainWindowHandle -eq $ie.HWND}
[Microsoft.VisualBasic.Interaction]::AppActivate($window_process.ID) | Out-Null
入力欄取得~値入力
Add-Type -AssemblyName System.Windows.Forms
$doc = $ie.Document
# 入力欄を取得
$input = [System.__ComObject].InvokeMember("getElementById",[System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, @( "input_id" ))
# 入力欄にファーカス
$input.focus()
# 入力欄に値を入力する
[System.Windows.Forms.SendKeys]::SendWait("user01")
ボタン取得~ボタン押下
$doc = $ie.Document
# ボタンを取得
$button = [System.__ComObject].InvokeMember("getElementById",[System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, @( "button_id" ))
# ボタン押下
$button.click()
ページ読み込み待ち
# ボタンが表示されるまで待機
while ($true) {
$doc = $ie.Document
# ボタンを取得
$button = [System.__ComObject].InvokeMember("getElementById",[System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, @( "button01" ))
# 表示された
if ($button -ne [System.DBNull]::Value) {
Write-Host "got button"
break
}
Write-Host "--- searching for button ---"
Start-Sleep -Milliseconds 500
}
frame取得~frame内リンク取得
# frameオブジェクトのリスト
$frames = $ie.document.frames
# 1番目のframeを取得
$doc = $frames.item(0).document
# リンクの取得
$link = [System.__ComObject].InvokeMember("getElementById",[System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, @( "linkInFrame" ))
iframe取得~iframe内ボタン取得
$doc = $ie.Document
# iframeタグを取得
$iframe = [System.__ComObject].InvokeMember("getElementById",[System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, @( "iframe" ))
# iframe内のHTMLドキュメントを取得
$iframeDoc = $iframe.contentWindow.document
# ボタンの取得
$button = [System.__ComObject].InvokeMember("getElementById",[System.Reflection.BindingFlags]::InvokeMethod, $null, $iframeDoc, @( "btnInIframe" ))
次回
次は、これらの処理を組み合わせて実際の認証を通してみようと思います。
コメント