27 June, 2012

How to detect is UAC enabled or not?

There are at least three ways to detect UAC (User Access Control) is active or not:

  • Check the registry value EnableLUA at HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System. However, there is the one problem: the value can be changed at any time, but it won't be used by OS until the computer reboot. So, this way is possible, but it isn't good.
  • Call GetTokenInformation() with TokenElevationType and TokenElevation. It doesn't work in all situations. It's impossible to detect UAC when an application runs under conventional user (TokenElevationType returns TokenElevationTypeDefault and TokenElevation returns FALSE).
  • Call private API method (valid only for Windows Vista and later):
    #pragma comment(lib, "ntdll.lib")
    #define ELEVATION_UAC_ENABLED                 0x1
    extern "C"
            DWORD* pFlags);
    Unfortunately, there is no declaration of this method in Windows Driver Kit (WDK), but ntdll.lib from WDK contains it.

24 June, 2012

This blog change the language today

Hi everybody. Today I decided to change the language of this blog. So, next messages will be in English. I promise to translate old messages from Russian to English in future.

23 June, 2012

Запуск non-elevated процесса из под elevated

Неожиданно возникла проблема, что некоторые API в Windows 8 работают только из под non-elevated пользователя и только когда UAC включен. Соответственно встал вопрос как прикинуться non-elevated пользователем, если программа запущена под elevated пользователем. Сразу скажу, мы не знаем пользователький пароль.

12 June, 2012

Репортаж из песочницы

S-1-15-2-1 (ALL_APP_PACKAGES) - это магический SID позволяет достучатся к любому файлу или каталогу из WinRT песочницы.

Update: Этот же SID помогает установить соединение через named pipe из песочницы наружу.

Update: Этот же SID помогает достучаться до реестра.