LsaLookupAuthenticationPackage возвращает 0xc00000fe

#windows #authentication

#Windows #проверка подлинности

Вопрос:

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

  HRESULT RetrieveNegotiateAuthPackage(ULONG * pulAuthPackage)
  {
    HRESULT hr;
    HANDLE hLsa;
  
    NTSTATUS status = LsaConnectUntrusted(amp;hLsa);
    if (SUCCEEDED(HRESULT_FROM_NT(status)))
    {
  
      ULONG ulAuthPackage;
      LSA_STRING lsaszKerberosName;
      LsaInitString(amp;lsaszKerberosName, NEGOSSP_NAME);
  
      status = LsaLookupAuthenticationPackage(hLsa, amp;lsaszKerberosName, amp;ulAuthPackage);
      if (SUCCEEDED(HRESULT_FROM_NT(status)))
      {
        *pulAuthPackage = ulAuthPackage;
        hr = S_OK;
      }
      else
      {
        hr = HRESULT_FROM_NT(status);
      }
      LsaDeregisterLogonProcess(hLsa);
    }
    else
    {
      hr= HRESULT_FROM_NT(status);
    }
  
    return hr;
  }
 

Когда я вызываю API LsaLookupAuthenticationPackage, он возвращает 0xc00000fe (ошибка). Вот значения параметров, которые я получил от отладки:

 hLsa (it can vary each time)     0x00391c60
lsaszKerberosName                L"Negotiate"
 

Кто-нибудь знает, что может быть причиной этого? И что делать, чтобы это исправить? Спасибо 🙂

Комментарии:

1. L"Negotiate" это ошибка — должно быть NEGOSSP_NAME_A

2. тогда код очень не оптимальный. вам не нужно разделять HRESULT hr и ULONG ulAuthPackage иметь, не нужно использовать несколько раз HRESULT_FROM_NT , но только один раз при возврате

Ответ №1:

согласно документу ms api, параметр имени пакета определяется следующими макросами:

 MSV1_0_PACKAGE_NAME

MICROSOFT_KERBEROS_NAME_A

NEGOSSP_NAME_A
 

макрос определяет тип пакета проверки подлинности, который вы хотите использовать
, и, кроме того, вы должны использовать тип ascii вместо unicode
https://docs.microsoft.com/en-us/windows/win32/api/ntsecapi/nf-ntsecapi-lsalookupauthenticationpackage