Как служба С# может определить текущее имя пользователя для входа на сервер служб терминалов?

Как служба С# может получить идентификатор (имя входа) пользователя терминального сервера, который ее вызывает?

Я написал службу С#, которая прослушивает HTTP-запрос и возвращает текущего пользователя для входа в систему. Запрос инициализируется javascript, который запускается в браузере. До сих пор это работало хорошо, но не работает на терминальном сервере, где может быть несколько пользователей, подключенных одновременно. В настоящее время я запрашиваю идентификатор процесса «explorer», а затем использую «GetOwner», чтобы получить имя пользователя для входа в систему.

Есть ли у службы способ идентифицировать пользователя, сгенерировавшего для нее http-запрос? Могу ли я как-то получить сеанс http и идентифицировать пользователя, которому он принадлежит? Мне нужно вернуть в качестве ответа идентификатор пользователя.

Спасибо, Джей Джей.


person user1283002    schedule 15.01.2013    source источник


Ответы (1)


Вам нужно будет получить порт, который HTTP-запрос использует на стороне клиента, сопоставить его со списком активных исходящих TCP-соединений на машине и определить идентификатор процесса браузера (например, через GetExtendedTcpTable). Оттуда вы можете получить идентификатор сеанса процесса (например, с помощью Process.SessionId), а затем найдите имя пользователя, связанное с сеансом (например, с помощью WTSQuerySessionInformation или Кассия). Или вы можете вызвать OpenProcess и GetSecurityInfo, чтобы получить SID пользователя из идентификатора процесса, как объясняет этот ответ. Этот последний подход, вероятно, лучше, поскольку могут быть процессы, работающие от имени разных пользователей в одном сеансе (например, с использованием запуска от имени).

Хотя все это кажется настоящей болью. Не могли бы вы просто использовать аутентификацию Windows в браузере?

person Dan Ports    schedule 18.01.2013
comment
Спасибо за исчерпывающий ответ (и комментарий на форуме Cassia). - person user1283002; 20.01.2013
comment
Большое спасибо за ваш подробный ответ (и комментарий на форуме Cassia). Это действительно большая боль, но мне это нужно, так как мне нужно автоматически получить имя пользователя без каких-либо действий от его имени. Есть ли шанс, что вы можете указать мне образцы кода? Я начинающий разработчик С#. - person user1283002; 20.01.2013