私は、Windowsコンピューターで現在のログオンセッションを取得する機能の1つであるプログラムを作成しています。ログオンタイプ2(対話型)、ログオンタイプ10(リモート対話型)、およびログオンタイプ11(キャッシュされた対話型)の現在のセッションについてWMIにクエリを実行します。私が持っているコードは、私が今気づいたことを除いて、問題なく動作します。仕事用ドメイン環境でテストしていたときは、すべて問題ありませんでしたが、家にいて仕事用ネットワークの外部でログオンしたため、セッションがまったく取得されていません。キャッシュされた対話型セッションとしてのログオンセッション。
だから私は このウェブサイト から取られたこのPSコードでそれをテストしました:
$computername = "mycomputername"
Get-WmiObject -Class Win32_LogonSession -ComputerName $computername |
foreach {
$data = $_
$id = $data.__RELPATH -replace """", "'"
$q = "ASSOCIATORS OF {$id} WHERE ResultClass = Win32_Account"
Get-WmiObject -ComputerName $computername -Query $q |
select @{N="User";E={$($_.Caption)}},
@{N="LogonTime";E={$data.ConvertToDateTime($data.StartTime)}}
}
これは単にallログオンセッションを取ります。繰り返しになりますが、まったくログオンしていないようです。
ユーザーLogonTime
---- ---------
mycomputername\IUSR 2016年1月22日12:07:50 AM
mycomputername\SYSTEM 1/22/2016 12:07:09 AM
mycomputername\LOCAL SERVICE 2016年1月22日12:07:11 AM
mycomputername\NETWORK SERVICE 2016年1月22日12:07:10 AM
mycomputername\ANONYMOUS LOGON 2016年1月22日12:08:03 AM
私の実際のユーザー名は表示されません...なぜそうなるのでしょうか?ログオンセッションを表示するにはどうすればよいですか?
このMicrosoftブログ投稿 によると、ドメインにアクセスできない場合、クエリはドメインユーザーのアカウントに関する情報を取得できません。これは、Win32_Account
に、入力するためにドメインコントローラーからの情報を必要とするプロパティがあるためです。したがって、Win32_Account
インスタンスの構築は失敗し、関連するエントリは結果に表示されません。
本当に悲しい状況ですが、ドメインと通信できないときにアカウントの名前を確実に取得するには、Win32_LoggedOnUser
クラスのAntecedent
文字列を解析する必要があります。 Name="
の出力に示されているように、アカウント名は"
とgwmi -class Win32_LoggedOnUser
の間にあります。正規表現を使用するともっとうまくいくと思いますが、これはすべてのログオンセッションのユーザー名だけを印刷する私の手っ取り早い方法です。
gwmi -Query "select * from win32_loggedonuser" | ForEach-Object { (($_.Antecedent -Split "Name=`"")[1] -Split "`"")[0] }
(ここでは実際のコンソールセッションとは相関関係がないため、DWM-1
のようなルーズなフェイクユーザーが2人います。)
ターミナルサーバーコマンドを使用することもできます [〜#〜] query [〜#〜] :
クエリユーティリティは、リソースの現在の割り当てやシステムステータスなど、システムに関する現在の情報を表示するために使用されます。 queryコマンドは、クエリユーティリティのいずれかを呼び出すことができます。コマンドライン形式は次のとおりです。
query [appservers | object | process | session | user] [/?]
このコマンドは、ログオンしているすべてのユーザーのリストを取得します。
query user
ローカルログオンの結果は次のようになりますが、リモートログオンの場合も確認しました。