About
このページで学習出来る事
以前、[powershell]で作成した、端末にログインしているユーザ(コンソール&リモート)を調べる「Furd」を公開しましたが、今回はその内容の解説をしたいと思います。
学習内容
-
IPアドレス格納用の配列作り
-
[Test-Connection]を使用した[ping]による疎通確認
-
[qwinsta /server:]を使用したログインユーザの確認
-
エラー処理
-
CSVと出力表示処理
NAME Furd-- [PowerShell]で作成した、コンソールやリモートなどで、端末にログインしているユーザを調べるツール 作成日:2020/12/24更新日:2020/12/24動作環境:[PowerShell 有効[…]
サンプルコード[PowerShell]
Set-StrictMode -Version 2.0
$objArrayIPAddress = New-Object System.Collections.ArrayList
$objArraySysName = New-Object System.Collections.ArrayList
$objArrayTemp = New-Object System.Collections.ArrayList
#-----------------------------------------------------------------------------
#ここを修正、追記する事で調査対象を編集する事が来ます。
$objArrayIPAddress.Add("192.168.1.1")
$objArraySysName.Add("リモート用サーバ 1号機")
$objArrayIPAddress.Add("192.168.1.2")
$objArraySysName.Add("リモート用サーバ 2号機")
#-----------------------------------------------------------------------------
##
[int]$count = 0
##
[string]$strIPAddress = ""
[string]$result = ""
[string]$str = ""
[string]$csv = ""
@(1..1) | foreach {
$count = 0
foreach($strIPAddress in $objArrayIPAddress){
try {
$objTestConnection = Test-Connection $strIPAddress -count 1 -ErrorAction Stop
$result = "○"
qwinsta /server:$strIPAddress |
ForEach-Object {
$str = $_.Trim() -replace "\s+",","
$objArrayTemp = $str.Split(",")
$csv = $result + "," + $strIPAddress + "," + $objArraySysName[$count] + "," + $objArrayTemp[1] + "," + $objArrayTemp[3]
$csv | ConvertFrom-Csv -Header @("Result", "TargetIP", "SystemName", "UserID", "Active")
}
} catch [Exception] {
$result = "×"
}
$count = $count + 1
}
} | Out-GridView -Title "[Furd] - 端末にログインしているユーザ"
コードの解説 変数宣言部分
‘Test-Connectionの実行結果を取り込むオブジェクトを宣言します。
$objTestConnection = New-Object System.Management.ManagementObject
‘IPアドレスを格納する配列を宣言します。
$objArrayIPAddress = New-Object System.Collections.ArrayList
‘ホスト名やシステム名を入れる配列を宣言します。
$objArraySysName = New-Object System.Collections.ArrayList
コードの解説 IPアドレス入力部分
‘IPアドレス用の配列に[ping]を実行したいアドレスを入力します。
$objArrayIPAddress.Add(“192.168.1.1”)
‘実行結果を分かりやすくするために、実行先のホスト名やシステム名を入力します。
$objArraySysName.Add(“リモート用サーバ 1号機”)
コードの解説 エラー処理部分
‘[-ErrorAction Stop]とはエラーが発生した場合、処理を止めて次へ進めるという内容です。
‘今回の処理で言うと、[ping]の応答がない場合に処理を止めてエラーとして処理する。すなわち[catch]に処理を移すという記述となります。
try {
#何かの処理 -ErrorAction Stop
} catch [Exception] {
#エラー処理
}
この[-ErrorAction Stop]を使ったエラー処理の書き方は、[PowerShell]でよく使いますので、覚えておくと便利です。
コードの解説 [ping]実行部分
‘今回は[Test-Connection]を用いて[ping]コマンドを実行します。
‘[Test-Connection]のシンプルな実行方法は以下の通りです。
$objTestConnection = Test-Connection “192.168.1.1”
‘ただし今回は[ping]処理を早く行いたいため、エコー確認回数を[-count 1]として1回に変更しています。
‘デフォルト値のエコー確認回数は、4回になります。
$objTestConnection = Test-Connection $strIPAddress -count 1 -ErrorAction Stop
‘エコーが帰ってこなかった場合に[-ErrorAction Stop]にて処理を止め、[catch]側に処理を移しています。
コードの解説 [qwinsta /server:]実行部分
‘ログインしているユーザを確認する方法に[qwinsta /server:]を実行して調べます。
‘[qwinsta /server:]のシンプルな実行方法は以下の通りです。
qwinsta /server:192.168.1.1
‘ログインしているユーザを確認する方法に[qwinsta /server:]を実行して調べます。
‘実行結果は半角スペース区切りにて返ってきますので、末尾の改行を削り、カンマ区切りに置き換えます。
$str = $_.Trim() -replace “\s+”,”,”
$objArrayTemp = $str.Split(“,”)
‘※最終的にはCSV出力をするため、この様な処理を間に挟んでいます。
コードの解説 出力表記部分
‘実行結果を[,]区切りとして、[CSV]表記にしています。
‘[$objArraySysName[$count]]でIPアドレスと対となるシステム名を表示しています。
$csv = $result + “,” + $strIPAddress + “,” + $objArraySysName[$count] + “,” + $objArrayTemp[1] + “,” + $objArrayTemp[3]
‘[ConvertFrom-Csv]を用いて上記で取得した[CSV]を処理しています。
‘この状態ですと、[CSV]上にヘッダーがありませんで、[-Header]オプションにて付与しています。
$csv | ConvertFrom-Csv -Header @(“Result”, “TargetIP”, “SystemName”, “UserID”, “Active”)
‘最後にパイプ処理でつなげ[Out-GridView]で表形式の表示を行っています。
| Out-GridView -Title “[Furd] – 端末にログインしているユーザ”
何らかの処理結果を表形式で表示したい場合は、以下の様な手順で進めると綺麗に表示されます。
・結果を[CSV]形式でまとめる
・[ConvertFrom-Csv -Header]で、[CSV]データにヘッダーを加える
・[Out-GridView]で表示する。
最後に
以上で[PowerShell]から端末にログインしているユーザを調べる方法の説明になります。
[qwinsta /server:]コマンド以外でもログインユーザを調べることは出来ますが、これが一番簡単そうだったので、今回はこれを用いてみました。