リモートのWindowsマシンからログインしているユーザーの情報を取得するのは、基本的に少し面倒な作業です。
リモートのWindowsマシンにログインしているユーザーを素早く特定する必要があった経験のある人なら、それが必ずしも簡単ではないことをご存知でしょう。特に、多数のサーバーやデスクトップを管理している場合は、ローカルであれRDP経由であれ、実際に誰がログインしているかを素早く確認できる方法が必要です。一般的なGUIツールは使いすぎだったり、利用できない場合もあります。そんな時こそ、スクリプトやコマンドラインツールが役立ちます。ここでの目標は、特にリモートシステム上で、ログインしているユーザーを手間をかけずに確認できる、確実で優れた方法を実現することです。Windowsは当然のことながら、あらゆる操作を本来あるべきよりも少し複雑にする必要があるからです。
PSLoggedOnやqwinstaなどのツールを使ってログインしているユーザーを確認する方法
PSLoggedOn.exe の使用
SysInternals PSToolsスイートのこの便利なツールを使えば、ローカルおよびリモートマシンのSMB共有経由でログインしているユーザーを確認できます。レジストリとネットワークセッションを利用できるので便利です。重要なのは、ターゲットマシンでRemoteRegistryサービスが稼働していることを確認することです。稼働していないと、レジストリを参照してユーザー情報を取得できません。PowerShellを使って、RemoteRegistryサービスを起動するか、自動で起動するように設定できます。
Set-Service RemoteRegistry -StartType Automatic -PassThru | Start-Service
整理したら、次のコマンドを実行します:
psloggedon \\RemoteCompName
これにより、ローカルにログオンしているユーザー名とSMBセッションが出力されます。ローカルユーザーのみが必要な場合は、-lフラグを追加してください。
Psloggedon.exe \\pc1215wks1 -l
設定によっては、ツールが最初の試行で情報を取得できない場合があります。正しい情報を取得できない場合は、リモートPCの再起動やサービスの再起動が必要になる場合があります。ただし、通常は、すべてを適切に設定すれば問題なく動作します。特に複数のサーバーやワークステーションを管理している場合、簡単なチェックに便利です。
セッション情報にqwinstaを使用する
組み込みのqwinstaコマンドは、リモートデスクトップ環境を管理する人なら誰でも知っている定番のコマンドです。サーバーまたはデスクトップマシン上のアクティブなRDPセッションと切断されたRDPセッションを表示します。以下のように実行します。
qwinsta /server:be-rdsh01
これにより、セッションID、ユーザー名、セッション状態が出力されます。ただし、「エラー 5: アクセス拒否」が表示された場合は、アカウントに適切な権限がないか、ターゲットホストがリモートRPC管理を許可するように設定されていない可能性があります。この問題を解決するには、レジストリの調整(または次のコマンドの使用)が必要になる場合があります。
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v "AllowRemoteRPC" /t REG_DWORD /d 1 /f
これにより、qwinsta が依存する RPC 管理をリモートから実行できるようになります。ただし、有効にするには再起動またはポリシーのプッシュが必要になる場合があります。
PowerShell を使用してリモート マシン上の現在のユーザーを取得する方法
もう一つの方法は、PowerShellのWMIクラス、特にWin32_ComputerSystemを使うことです。少し奇妙ですが、一部の設定では、コンソールにログインしているユーザーのみが表示され、RDP経由でログインしているユーザーは表示されません。これを行うには、PowerShellを開いて以下を実行します。
Get-WmiObject -Class Win32_ComputerSystem | Format-List UserName
このコマンドはユーザー名を返しますが、これも物理コンソールセッションからのみ取得されます。リモートコンピューターをターゲットにするには、-ComputerNameパラメータを追加します。
(Get-WmiObject -Class Win32_ComputerSystem -ComputerName pc1215wks1).UserName
注: 場合によっては、RDPセッションではなく、ローカルの対話型セッションのみが表示されることがあります。これを回避するには、PowerShellリモート処理を使用できます。必要に応じて、スクリプトブロックを指定したInvoke-Commandを使用してください。また、PowerShell Core(経由)を使用している場合はpwsh、Get-CimInstanceコマンドレットがGet-WmiObjectに代わり、WinRMを使用してリモートシステムに接続します。
Get-CimInstance -ComputerName pc1215wks1 -ClassName Win32_ComputerSystem | Select-Object UserName
すべてのリモートホストでWinRMが有効になっていることを確認してください( を実行してくださいWinRM quickconfig)。有効になっていないと、この方法は機能しません。理由は定かではありませんが、ファイアウォールルールやGPO設定を再確認する必要がある場合があります。
複数のコンピュータにログインしているユーザーのリストを取得する
ドメイン全体を管理している場合、各マシンを手動でチェックするのは面倒です。PowerShellを使ってスクリプトを作成し、複数のシステムをスキャンすることができます。例えば、コンピューターのリストに対してpingとクエリを実行する簡単な関数などです。
function Get-LoggedUser { param([string[]]$ComputerName) foreach ($comp in $ComputerName) { if ((Test-NetConnection $comp -WarningAction SilentlyContinue).PingSucceeded) { try { $user = (Get-WmiObject -Class Win32_ComputerSystem -ComputerName $comp).UserName [PSCustomObject]@{ Computer = $comp UserName = $user } } catch { [PSCustomObject]@{ Computer = $comp UserName = "Error or no data" } } } else { [PSCustomObject]@{ Computer = $comp UserName = "Offline" } } } } # Usage: $computers = (Get-ADComputer -Filter * -SearchBase "OU=Berlin, DC=woshub, DC=com").Name Get-LoggedUser -ComputerName $computers | Format-Table -AutoSize
こうすることで、各マシンを手動で確認することなく、誰がどこにログオンしているかを確認できます。WMIをブロックしたり、ファイアウォールが設定されているマシンもあるため、完璧とは言えませんが、確実なスタートを切るには十分です。さらに、スクリプトを拡張して他の情報を追加したり、スケジュールされたタスクで実行したりすることも可能です。
まとめ
これらのオプションはすべて完璧ではありませんが、組み合わせることで、リモートWindowsシステムに誰がログインしているかを調べるための優れたツールキットとなります。qwinsta、PSLoggedOnなどの組み込みツール、あるいはWMI/CIMを使ったスクリプトなど、権限、環境、そして本当に必要な情報の量に応じてアプローチを調整できます。ただし、リモートレジストリやRPC管理の有効化が必要になる場合があるので、通常は初期設定が必要です。
まとめ
- PSLoggedOn を使用してローカル セッションとネットワーク セッションをチェックし、RemoteRegistry サービスが有効になっていることを確認します。
- qwinsta 経由でセッション情報を取得しますが、権限とレジストリ設定に注意してください。
- リモート ユーザー情報に PowerShell の WMI および CIM コマンドを活用するには、WinRM を有効にします。
- 複数のマシンの場合は、Test-NetConnection、Get-AdComputer、WMI を使用したスクリプトによってチェックを自動化できます。
最後に
ユーザーのログイン情報をすぐに確認したいときに、これで数時間短縮できるはずです。複数のリモートマシンの管理は常に少し面倒ですが、これらの方法を使えば、常に先手を打つことができるはずです。