PowerShell-qwinsta

[PowerShell]で作る、端末にログインしているユーザを調べるツールの作り方

このページで学習出来る事

 以前、[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:]コマンド以外でもログインユーザを調べることは出来ますが、これが一番簡単そうだったので、今回はこれを用いてみました。