Хотелось бы узнать, как можно определить текущий уровень UAC для процесса. Т.е. есть такая ситуация: Требуется записать кое какие данные в реестр. Сначала проверяется наличие прав админа (через UserInfo->usri1_priv & USER_PRIV_ADMIN), если они есть то идет попытка записи в HKLM, если нет прав админа или попытка записи в HKLM провалилась, то пишется в HKCU. Под XP всё норм. А вот под Win 7 начинаются проблемы, а именно: Даже при правах админа, нет доступа к HKLM из-за UAC. Но это не проблема, потому что всё равно запись идет потом в HKCU, но из-за попытки записи в HKLM без прав UAC после завершения программы выскакивает окно, что программа возможно работает не корректно так как ей требуются права админа. Именно по этому и хочется узнать как определить права которые есть в процесса и чтобы это не порождало того сообщения.
Проще всего так: достать токен процесса чере OpenProcessToken(), запросить его elevation через GetTokenInformation() с классом TokenElevation или TokenElevationType, ну и дальше там всё понятно. Если правильно помню, то ещё можно так: извлекаешь SACL процесса через GetKernelObjectSecurity() с классом LABEL_SECURITY_INFORMATION, затем ищешь ACE типа SYSTEM_MANDATORY_LABEL_ACE_TYPE и проверяешь значение RID в записанном в него SID (см. здесь).
А можно ли как-то запросить повышение прав после запуска? SetTokenInformation(TokenElevationTypeFull) завершается ошибкой ERROR_INVALID_PARAMETER. Или может можно перезапустить себя с запросом на повышение привилегий?