Как расшифровать буфер аутентификации, полученный с безопасного рабочего стола - PullRequest
5 голосов
/ 19 января 2012

Я пытаюсь попросить пользователя ввести учетные данные на защищенном рабочем столе , но я не могу найти способ расшифровки полученного буфера аутентификации:

Полномочия получены с:

CREDUI_INFO cui = new CREDUI_INFO()
{
    cbSize = (uint)Marshal.SizeOf(typeof(CREDUI_INFO)),
    pszMessageText = "MyMessage",
    pszCaptionText = "MyCaption",
};

bool save = false;
uint authPackage = 0U;
IntPtr authBuffer;
uint authBufferSize;

uint error = CredUIPromptForWindowsCredentials(
                ref cui,
                0U,
                ref authPackage,
                IntPtr.Zero,
                0U,
                out authBuffer,
                out authBufferSize,
                ref save,
                CREDUIWIN_SECURE_PROMPT);

Учетные данные распакованы с:

uint userBufferSize = CREDUI_MAX_USERNAME_LENGTH;
uint domainBufferSize = CRED_MAX_STRING_LENGTH;
uint passwordBufferSize = CREDUI_MAX_PASSWORD_LENGTH;
StringBuilder userBuffer = new StringBuilder((int)userBufferSize);
StringBuilder domainBuffer = new String((int)domainBufferSize);
IntPtr passwordBuffer = Marshal.AllocCoTaskMem((int)passwordBufferSize);

bool success = CredUnPackAuthenticationBuffer(
                CRED_PACK_PROTECTED_CREDENTIALS,
                authBuffer, authBufferSize
                userBuffer, ref userBufferSize,
                domainBuffer, ref domainBufferSize,
                passwordBuffer, ref passwordBufferSize);

Если я укажу CREDUIWIN_SECURE_PROMPT в CredUIPromptForWindowsCredentials, как в примере выше, CredUnPackAuthenticationBuffer завершится неудачно с ERROR_NOT_CAPABLE. Если я использую CREDUIWIN_GENERIC вместо защищенного рабочего стола , это будет успешно.

Как я могу получить имя, домен и пароль из таких зашифрованных учетных данных с защищенного рабочего стола? Или как вообще их использовать, если это невозможно?

...