PowerShell で Redmine にログインして画面キャプチャを取得したのちログアウトする

特定のサイト(今回はRedmine)にログインし、キャプチャを取得したいので、PowerShellで実現してみた。

前提条件

  • Windows 10 Professional
  • $PSVersionTable PSVersion=5.1.15063.1387
  • ファイルを選択し右クリック → PowerShell で実行
  • IE のバージョンによっては保護モードを無効にする必要有り

IE_control.ps1

# IE起動
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("{RedmineのURL}")
$ie.Visible = $true

# 読込待ち
while($ie.Busy) { Start-Sleep -milliseconds 100 }

# ログイン
$doc = $ie.Document
$elements = @([System.__ComObject].InvokeMember("getElementsByName", [System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, "username"))
$elements[0].value = "{username}"
$elements = @([System.__ComObject].InvokeMember("getElementsByName", [System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, "password"))
$elements[0].value = "{password}"
$elements = @([System.__ComObject].InvokeMember("getElementsByName", [System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, "login"))
$elements[0].click()

# 読込待ち
while($ie.Busy) { Start-Sleep -milliseconds 100 }

# リンクをクリック
$as = @([System.__ComObject].InvokeMember("getElementsByTagName", [System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, "a"))
foreach($a in $as) {
    if ($a.textContent -eq "{テキスト内容}") {
        $a.click()
        break
    }
}

# 読込待ち
while($ie.Busy) { Start-Sleep -milliseconds 100 }

# IEをアクティブ化
Add-Type -AssemblyName Microsoft.VisualBasic
$window_process = Get-Process -Name "iexplore" | Where-Object { $_.MainWindowHandle -eq $ie.HWND }
[Microsoft.VisualBasic.Interaction]::AppActivate($window_process.ID) | Out-Null

# キャプチャ
Add-Type -AssemblyName System.Drawing
$bitmap = new-object Drawing.Bitmap($ie.Width, $ie.Height)
$graphics = [Drawing.Graphics]::FromImage($bitmap)
$graphics.CopyFromScreen($ie.Left, $ie.Top, 0, 0, $bitmap.Size)
$format = "jpeg"
$fileName = "Capture_" + (Get-Date -UFormat "%Y-%m-%d %H%M%S") + ".jpg"
$filePath = "C:\" + $fileName
$bitmap.Save($filePath, $format)
$bitmap.Dispose()

# ログアウト
$logout = @([System.__ComObject].InvokeMember("getElementsByClassName", [System.Reflection.BindingFlags]::InvokeMethod, $null, $doc, "logout"))
$logout[0].click()

# IE終了
$ie.quit()

余談

最終的に、タスクスケジューラに設定して、バックグラウンド処理として自動でキャプチャしたいが、画面描画がない状態でキャプチャしても、真っ黒な画像になるだけでした。
当然っちゃ当然ですが。