Почему я не получаю сеанс входа по запросу WMI?

3

Я пишу программу, одной из функций которой является получение текущих сеансов входа в систему на компьютере Windows. Он запрашивает WMI для текущих сеансов с типом входа 2 (интерактивный), тип входа 10 (удаленный интерактив) и тип входа 11 (кэшированный интерактив). Код у меня работает хорошо, за исключением одной вещи, которую я только что заметил. Когда я тестировал его в моей рабочей среде, все было хорошо, но теперь, когда я дома и вошел в систему за пределами нашей рабочей сети, я вообще не получаю никаких сессий - и я думал, что получу сеанс входа в систему в качестве кэшированного интерактивного сеанса.

Итак, я проверил это с помощью этого кода 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)}}            
}         

который просто берет все сеансы входа в систему. И снова, как будто я не вошел в систему вообще:

Пользователь LogonTime
------------
mycomputername \ IUSR 22.01.2016, 12:07:50
mycomputername \ SYSTEM, 22.01.2016, 12:07:09
mycomputername \ LOCAL SERVICE 1/22 / 2016 12:07:11
mycomputername \ NETWORK SERVICE 22.01.2016 0:07:10
mycomputername \ ANONYMOUS LOGON 22.01.2016 0:08:03

Мое действительное имя пользователя не отображается ... Почему это может быть? Что я могу сделать, чтобы увидеть мой сеанс входа?

Михал Масны
источник

Ответы:

2

Почему это не работает?

Согласно этому сообщению в блоге Microsoft , ваш запрос не может получить информацию об учетной записи пользователя домена, когда домен недоступен. Это потому, что Win32_Accountимеет свойства, которые требуют информацию от контроллера домена для заполнения. Поэтому создание Win32_Accountэкземпляра завершается неудачно, и соответствующие записи не отображаются в ваших результатах.

Что можно сделать?

Это действительно печальное положение вещей, но вам нужно проанализировать Antecedentстроку Win32_LoggedOnUserкласса, чтобы надежно получить имя учетной записи, когда вы не можете общаться с ее доменом. Имя учетной записи находится между Name="и ", как вы можете видеть на выходе gwmi -class Win32_LoggedOnUser. Я уверен, что вы могли бы добиться большего успеха с помощью регулярных выражений, но это мой быстрый и грязный способ печати только имен пользователей всех сеансов входа в систему:

gwmi -Query "select * from win32_loggedonuser" | ForEach-Object { (($_.Antecedent -Split "Name=`"")[1] -Split "`"")[0] }

(Так как я не коррелирую с реальными консольными сессиями здесь, будет пара свободных фальшивых пользователей, таких как DWM-1.)

Бен Н
источник
Ах я вижу. Я думал об использовании свойства antecedent, но win32_account выглядел намного чище. Ну что ж. Большое спасибо за информацию, я поменяю код и все будет хорошо, все будет хорошо! (Надеюсь, вы не возражаете, если я на некоторое время оставлю награду открытой - скорее всего, это не повредит.)
Михал Масни
0

Можно также использовать команду сервера терминалов QUERY :

Утилиты запросов используются для отображения текущей информации о системе, такой как текущее распределение ресурсов и состояние системы. Команда query может вызвать любую из утилит запроса. Формат командной строки:

query [appservers | object | process | session | user] [/?]

Эта команда получит список всех вошедших в систему пользователей:

query user

Результат может выглядеть следующим образом для локального входа, но я также проверил его для удаленного входа:

образ

harrymc
источник