2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

リモートホストのログイン中ユーザー名を取得する

Last updated at Posted at 2021-05-28

カレントユーザー名を取得したい

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にログイン中のユーザー名を取得.ps1
$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でお好きに
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?