カレントユーザー名を取得したい
WindowsPCでリモートホストに現在ログオンしているユーザー名、が必要になることがある。(カレントユーザーって呼び方でいいんだろうか?) ユーザーのデスクトップになんか置いたり消したり、プロファイル内の特殊フォルダにフルパスでアクセスしたり。
query user /server:Hostname
ですぐ出せるから調べること自体に困難はないのだけれど、何度も何度も同じ操作して書き写していると微ストレスが溜まり原体力ポイントが下がっていく気がする。自動化しよう。
query user
古いコマンドだが、代替はあるか?
昔ながらのquery
コマンド。PowerShellで使うにふさわしい代替はないのかな?って探したが、これ使えば一発という代替は無いらしい。世界中どこでも同じような質問があって、こんな方法でどう?があれこれ紹介されているものの、どれもケースに合わせた工夫があって真似るのがめんどくさい。ただユーザー名があればいいだけなのだが…あれば後で好きに加工して使うんで…
しかたがないので、query user /server:Hostname
の結果を切り貼りしてユーザー名だけ取り出すことにする。
query user の出力
# query user /server:Hostname の結果
アイドル
ユーザー名 セッション名 ID 状態 時間 ログオン時刻
mogura rdp-tcp#1 1 Active . 2021/05/27 13:00
目的の箇所を切り出す
PowerShellでquery user
を使うと、結果は文字列で返ってきて一行ずつ配列に入る。ユーザー名が入っている5行目を取り出せばいい。ホストは普通のWindowsPCなのでユーザーは1人しかおらず、行ズレの心配はない。
文字列は半角空白(の連続)で区切られているので、-split
演算子で分割してやる。
$HostName = "Hostname"
$Query = "query user /server:${HostName}"
$Array = Invoke-Expression $Query
$Array[4]
# mogura rdp-tcp#1 1 Active . 2021/05/27 13:00
$Username = ($Array[4] -split " ")[1]
# mogura
応答がない場合の対処
query
コマンド投げてリモートホストの応答がないと20秒くらい待たされて気分が悪い。待ち時間を短く設定するオプションはないようだ。
実行前にping
投げて応答なければ中断するようにする。安定したイントラ内なので1回届くか届かないかで構わない。
Test-Connection
は応答が無い場合4秒でfalseになる。この時間を変更するオプションは無いようだ。残念。
# 応答無い場合4秒でタイムアウト 変更不可
$isPingResp = Test-Connection -Quiet -ComputerName $HostName -Count 1
if($isPingResp -eq $False){
Write-Host "Ping応答無し"
Read-Host "[ENTER]で閉じる"
exit
}
できあがり
$HostName = Read-Host "Hostname"
# 応答チェック
$isPingResp = Test-Connection -Quiet -ComputerName $HostName -Count 1
if($isPingResp -eq $False){
Write-Host "Ping応答無し"
Read-Host "[ENTER]で閉じる"
exit
}
$Query = "query user /server:${Hostname}"
$Array = Invoke-Expression $Query
$UserName = ($Array[4] -split " ")[1]
# 後は$HostNameと$UserNameでお好きに