ImpersonateLoggedOnUser даёт ошибку 6 (ERROR_INVALID_HANDLE)
От: ruslanv США  
Дата: 30.12.09 04:05
Оценка:
Ребята, подскажите как можно передать security token из одного процесса в другой ? По идее же это объект ядра и работать должно.

У меня два приложения UI и Windows Service, пишу на C#, но в принципе я думаю код будет понятен всем. В UI приложении получаю token так:

        private static bool GetImpersonationToken(out IntPtr token)
        {
            token = IntPtr.Zero;
            IntPtr tempToken;
            if (OpenProcessToken(GetCurrentProcess(), TokenImpersonate | TokenQuery | TokenDuplicate, out tempToken))
            {
                var sa = new SecurityAttributes { bInheritHandle = false };
                sa.Length = Marshal.SizeOf(sa);
                sa.lpSecurityDescriptor = (IntPtr)0;

                // duplicate the token (this is necessary to convert the impersonated token to a primary token)
                return DuplicateTokenEx(
                    tempToken,
                    0x000f01ff /* all access */,
                    ref sa,
                    /* ImpersonationLevel = SecurityImpersonation */2,
                    /* TokenType = TokenImpersonation */ 2,
                    ref token);
            }

            return false;
        }


полученный token перекидываю по named pipe в мой Windows сервис который крутится под пользователем Local System и пытаюсь вызвать на него ImpersonateLoggedOnUser. Получаю ошибку 6, что мой HANDLE корявый. Я пробовал вызвать ImpersonateLoggedOnUser на полученный токен сразу же в том же UI приложении, оно работает.

Заранее спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.