Попробуйте использовать функцию CheckElevation, экспортированную kernel32.dll. Это совершенно недокументированная функция, но вот что я смог перепроектировать:
ULONG CheckElevation(
__in PWSTR FileName,
__inout PULONG Flags, // Have a ULONG set to 0, and pass a pointer to it
__in_opt HANDLE TokenHandle, // Use NULL
__out_opt PULONG Output1, // On output, is 2 or less.
__out_opt PULONG Output2
);
Вам нужно будет поэкспериментировать, чтобы узнать, как правильно вызывать функцию. До сих пор мне удавалось понять, что если Output1 не равен 0, требуется повышение прав.