Некоторые API Windows возвращают первичный токен, а некоторые возвращают токен олицетворения. Для некоторых API требуется первичный токен, в то время как другим требуется токен олицетворения.
Например, LogonUser
обычно возвращает первичный токен, кроме случаев использования LOGON32_LOGON_NETWORK
в качестве типа входа (dwLogonType
):
В большинстве случаев возвращаемый дескриптор является основным маркером, который можно использовать при вызовах функции CreateProcessAsUser. Однако, если вы укажете флаг LOGON32_LOGON_NETWORK, LogonUser вернет маркер олицетворения, который вы не можете использовать в CreateProcessAsUser, если вы не вызываете DuplicateTokenEx, чтобы преобразовать его в первичный токен.
SetThreadToken
требуется токен олицетворения, а ImpersonateLoggedOnUser
, который, похоже, делает почти то же самое, что и один.
CreateProcessAsUser
и CreateProcessWithTokenW
оба требуют первичный токен и оба примечания: первичный токен может быть получен из маркера олицетворения, вызвав DuplicateTokenEx
, но что означают типы токенов значит
В глоссарии говорится следующее:
Маркер доступа содержит информацию о безопасности для сеанса входа в систему. Система создает маркер доступа, когда пользователь входит в систему, и каждый процесс, выполняемый от имени пользователя, имеет копию токена. Токен идентифицирует пользователя, группы пользователей и пользовательские привилегии. Система использует токен для управления доступом к защищаемым объектам и для управления способностью пользователя выполнять различные системные операции на локальном компьютере. Существует два типа токена доступа, первичная и олицетворение.
Маркер доступа, который обычно создается только ядром Windows. Он может быть назначен процессу для представления информации о безопасности по умолчанию для этого процесса.
Токен доступа, созданный для захвата информации о безопасности клиентского процесса, позволяющий серверу "выдавать" процесс клиента в операциях безопасности.
Но это не совсем полезно. Похоже, что кто-то хотел использовать большие слова мальчика, такие как "ядро", но это только помогает поднимать больше вопросов, таких как то, что еще (кроме того, что назначено процессу) может использоваться первичный токен и кто еще, кроме ядра, может создавать доступ жетоны?
(Они подразумевают смысл Microsoft, в котором ядро является частью только того, что работает в режиме ядра, а также исполнительного и т.д., или они означают, что код пользовательского режима также может создавать токены? Независимо от того, даже если код пользовательского режима может создавать токены, которые он должен будет выполнить с помощью системного вызова, как и с любым объектом Object Manager, поэтому токен будет фактически создан в режиме ядра в любом случае.)
В любом случае, это не отвечает на фундаментальный вопрос: какая разница между типами токенов? Не, для чего они могут использоваться или как они обычно.