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 00:07:50
mycomputername\SYSTEM 22.01.2016 00:07:09
mycomputername\LOCAL SERVICE 22.01.2016, 12:07:11
mycomputername\NETWORK SERVICE 22.01.2016, 12:07:10
mycomputername\ANONYMOUS LOGON 22.01.2016 0:08:03

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

2 ответа2

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 .)

0

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

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

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

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

query user

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

образ

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .