Comments 11
msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext.undo.aspx
msdn.microsoft.com/en-us/library/system.runtime.interopservices.safehandle.aspx
Это то, что лучше использовать вместо интеропов на CloseHandle и RevertToSelf.
return false в функциях, которые могут провалиться по множеству причин — это очень плохой дизайн. Лучше бросать исключения.
Почему LogonUserA, а не LogonUserW?
Если в процессе получения или дублирования токена произойдет асинхронное исключение — то у вас хендлы потеряются. Используйте блок try… finally. А еще лучше, если работаете с нативными хендлами — изучите принципы работы CER или работайте с обертками.
msdn.microsoft.com/en-us/library/system.runtime.interopservices.safehandle.aspx
Это то, что лучше использовать вместо интеропов на CloseHandle и RevertToSelf.
return false в функциях, которые могут провалиться по множеству причин — это очень плохой дизайн. Лучше бросать исключения.
Почему LogonUserA, а не LogonUserW?
Если в процессе получения или дублирования токена произойдет асинхронное исключение — то у вас хендлы потеряются. Используйте блок try… finally. А еще лучше, если работаете с нативными хендлами — изучите принципы работы CER или работайте с обертками.
Большое спасибо за качественный комментарий, большая редкость на хабре. Подправил по материалу из ссылок.
LogonUserA, а не LogonUserW потому что использую pinvoke.net при работе с WinAPI, и LogonUserW там нет.
LogonUserA, а не LogonUserW потому что использую pinvoke.net при работе с WinAPI, и LogonUserW там нет.
В таком случае, рекомендую разобраться в смысле совершенных вами действий. Работа с unmanaged-кодом требует определенной четкости выполния и понимания сути совершаемых телодвижений.
В частности, как же выполняется p/invoke и как настраивать маршалер.
В частности, как же выполняется p/invoke и как настраивать маршалер.
Если чего-то нет в pinvoke.net — самое время его туда добавить) В pinvoke оно все не само по себе взялось…
Вы немного напутали с типами в примерах кода:
Метод типа void, но потом вы делаете
public void ImpersonateUser(...)Метод типа void, но потом вы делаете
if (user.ImpersonateUser(USR, DOMAIN, PWD))А можно ли таким образом вывести во время работы программы диалог UAC и повысить таким образом привилегии программы, если она была запущена без администраторских прав?
Sign up to leave a comment.
Исполнение куска кода от имени конкретного пользователя