Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

【Windows】リモートPCにログオン中のユーザーを確認する方法|PowerShell・qwinsta・PSLoggedOn活用ガイド

システム管理者なら、リモートのWindowsコンピュータに誰がログオンしているのかを素早く把握したい場面がよくあるでしょう。本記事では、リモートコンピュータ上のログオンユーザー名を取得できる便利なツールとPowerShellスクリプトをわかりやすく紹介します。

目次

  • PSLoggedOn と qwinsta でログオンユーザーを確認する
  • PowerShellでリモートコンピュータの現在のユーザーを取得する方法
  • 複数台のリモートPCのログオンユーザーを一括検索するPowerShellスクリプト

PSLoggedOn と qwinsta でログオンユーザーを確認する

MicrosoftのSysInternals PSToolsには、PSLoggedOn.exeというコマンドラインユーティリティが含まれています。このツールを使うと、リモートコンピュータにローカルログオンしているユーザーのほか、そのマシンのSMB共有リソースへネットワーク経由で接続しているユーザーの一覧も取得できます。

ツールをダウンロードして、次のように実行します。

psloggedon \\RemoteCompName

実行結果には、「Users logged on locally(ローカルにログオン中のユーザー)」と「Users logged on via resource shares(共有経由でアクセス中のユーザー)」が表示されます。

ローカルログオンユーザーだけを知りたい場合は、-lオプションを付けて実行します。

Psloggedon.exe \\pc1215wks1 -l

PSLoggedOnはリモートコンピュータのレジストリに接続してログオンユーザー名を確認するため、事前にRemoteRegistryサービスが起動している必要があります。サービスを自動起動に設定して開始するには、次のPowerShellコマンドを実行してください。

Set-Service RemoteRegistry -startuptype automatic -passthru
Start-Service RemoteRegistry

また、Windowsに標準搭載されているqwinstaコマンドでもリモートコンピュータのセッション一覧を取得できます。RDS(リモートデスクトップサービス)環境を管理している管理者にはおなじみのコマンドでしょう。リモートコンピュータのログオンユーザーセッション一覧を表示するには、次のコマンドを実行します。

qwinsta /server:be-rdsh01

このコマンドは、アクティブなセッションだけでなく、RDPタイムアウトなどで切断されたセッションも含めて一覧表示します。RDSサーバーはもちろん、複数RDP接続を許可したWindows 10/11のデスクトップ版でも利用可能です。

qwinstaでリモート接続時に「Error 5 Access Denied(アクセス拒否)」が発生する場合は、対象ホスト側でRPC経由のリモートユーザー管理が許可されているか確認してください。必要に応じて、次のコマンドまたはGPOでレジストリ値を有効化します。

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v "AllowRemoteRPC" /t "REG_DWORD" /d "1" /f

PowerShellでリモートコンピュータの現在のユーザーを取得する方法

PowerShellからWin32_ComputerSystemというWMIクラスを使えば、コンピュータにログオン中のユーザー名を簡単に取得できます。PowerShellコンソールを開いて、次のコマンドを実行してみましょう。

Get-WmiObject -class Win32_ComputerSystem | Format-List Username

このコマンドは、そのコンピュータにログオンしているユーザー名を返します。なお、ここで取得できるのはコンソールにログオンしているユーザーのみで、RDP経由のセッションユーザーは含まれない点に注意してください。

Get-WmiObjectコマンドレットには-ComputerNameパラメータがあり、これを指定するとリモートコンピュータのWMIオブジェクトにアクセスできます。次のコマンドで、リモートPCのログオンユーザー名を取得できます。

(Get-WmiObject -class Win32_ComputerSystem -ComputerName pc1215wks1).Username

ドメイン名を除いたユーザー名だけを取得したい場合は、次のように文字列を分割します。

$userinfo = Get-WmiObject -ComputerName pc1215wks1 -Class Win32_ComputerSystem
$user = $userinfo.UserName -split '\\'
$user[1]

また、Invoke-Commandコマンドレットを使ったPowerShellリモーティング(PSRemoting)でも同様の情報を取得できます。

最新のPowerShell Core(pwsh.exe)環境では、非推奨となったGet-WmiObjectの代わりにGet-CimInstanceコマンドレットを使用します。

Get-CimInstance -ComputerName pc1215wks1 -ClassName Win32_ComputerSystem | Select-Object UserName

または、次のような書き方もあります。

(Get-CimInstance -ComputerName pc1215wks1 -ClassName Win32_ComputerSystem).CimInstanceProperties | where{$_.Name -like "UserName"} | select value

Get-CimInstanceはWinRM経由でリモートコンピュータに接続するため、あらかじめ対象マシンでWinRMを有効化しておく必要があります。GPOで一括設定するか、各コンピュータで次のコマンドを実行してください。

WinRM quickconfig

複数台のリモートPCのログオンユーザーを一括検索するPowerShellスクリプト

多数のコンピュータからログオンユーザー情報を収集したい場合は、次のPowerShell関数が便利です。コンピュータ名のリストを渡すだけで、各マシンのログオンユーザー名を一括取得できます。

function Get-LoggedUser
{
[CmdletBinding()]
param
(
[string[]]$ComputerName
)
foreach ($comp in $ComputerName)
{
$output = @{'Computer' = $comp }
$output.UserName = (Get-WmiObject -Class win32_computersystem -ComputerName $comp).UserName
[PSCustomObject]$output
}
}

使い方はシンプルです。調べたいコンピュータ名をカンマ区切りで指定して実行します。

Get-LoggedUser pc1215wks1,pc1215wks2,mun-dc01

結果としてUserNameが空欄になったコンピュータは、誰もログオンしていないことを意味します。

Active Directoryドメイン内のすべてのコンピュータを対象にすることも可能です。Get-ADComputerコマンドレットでドメイン内のコンピュータ一覧を取得し、それを関数に渡します。下記の例では、特定のOU配下にある有効なコンピュータに対してログオンユーザーを確認しています。処理速度を上げるため、実際にWMI接続する前にTest-NetConnectionコマンドレットでICMP pingによる疎通チェックを行い、オフラインのマシンをスキップするようにしています。

function Get-LoggedUser
{
[CmdletBinding()]
param
(
[string[]]$ComputerName
)
foreach ($comp in $ComputerName)
{
if ((Test-NetConnection $comp -WarningAction SilentlyContinue).PingSucceeded -eq $true)
{
$output = @{'Computer' = $comp }
$output.UserName = (Get-WmiObject -Class win32_computersystem -ComputerName $comp).UserName
}
else
{
$output = @{'Computer' = $comp }
$output.UserName = "offline"
}
[PSCustomObject]$output
}
}
$computers = (Get-AdComputer -Filter {enabled -eq "true"} -SearchBase 'OU=Berlin,DC=woshub,DC=com').Name
Get-LoggedUser $computers |ft -AutoSize

さらに便利なテクニックとして、ログオンユーザー名をADのコンピュータオブジェクトのプロパティに記録しておく方法もあります。ログオンスクリプトでSet-ADComputerを使ってユーザー情報を書き込んでおけば、全端末をスキャンせずともActive Directoryへの簡単なクエリだけで、特定ユーザーがどのコンピュータにログオンしているかを即座に特定できます。

$user='m.smith'
$user_cn=(Get-ADuser $user -properties *).DistinguishedName
Get-ADComputer -Filter "ManagedBy -eq '$user_cn'" -properties *|select name,description,managedBy|ft

  1. Windows 10でリモートデスクトップがコンピューターを検出できない問題を解決する方法

    リモートデスクトップでコンピューターが見つからない、同じネットワーク上の別のPCに接続できない——そんなお困りの方は、この記事が役立ちます。いくつかの対処法を実行するだけで、この問題は簡単に解決できます。 Windowsのリモートデスクトップは、同じネットワーク上にある他のPCやシステムへリモート接続できる非常に便利なアプリです。しかし、リモートデスクトップの使用中に相手のPCが見つからない場合は、以下のトラブルシューティングの手順を試してみてください。 Windows 10で「リモートデスクトップがコンピューターを検出できない」問題を解決する方法 それでは、順番に見ていきましょう。 1.

  2. パソコンに誰が・いつログインしたのかを調べる4つの方法【Windows監査ログの使い方】

    信じがたいかもしれませんが、あなたの周りには詮索好きで好奇心旺盛な人が潜んでいるものです。「誰かに勝手にパソコンを使われたような気がするのに、犯人を特定できない」といった経験はありませんか? それは親友かもしれませんし、気の合わないルームメイト、あるいは何でも知りたがる兄弟姉妹かもしれません。プライバシーを守るためにも、疑念が正しいかどうか確かめたいなら、誰があなたのマシンに干渉したのかを必ずチェックしておきましょう。「パスワードを設定しているから誰もログインできない」と思っている方は要注意です。実は他にもさまざまな手段でデバイスにログインし、悪意のある操作を行ったり、あなたのアカウントから不