Это то, что лучше использовать вместо интеропов на CloseHandle и RevertToSelf.
return false в функциях, которые могут провалиться по множеству причин — это очень плохой дизайн. Лучше бросать исключения.
Почему LogonUserA, а не LogonUserW?
Если в процессе получения или дублирования токена произойдет асинхронное исключение — то у вас хендлы потеряются. Используйте блок try… finally. А еще лучше, если работаете с нативными хендлами — изучите принципы работы CER или работайте с обертками.
В таком случае, рекомендую разобраться в смысле совершенных вами действий. Работа с unmanaged-кодом требует определенной четкости выполния и понимания сути совершаемых телодвижений.
В частности, как же выполняется p/invoke и как настраивать маршалер.
А можно ли таким образом вывести во время работы программы диалог UAC и повысить таким образом привилегии программы, если она была запущена без администраторских прав?
Исполнение куска кода от имени конкретного пользователя