CredWrite возвращает код ошибки Win32 2 (ERROR_INVALID_FUNCTION) "Неверная функция".

Я пытаюсь вызвать CredWrite, но он возвращает ERROR_INVALID_FUNCTION. я могу вызвать CredRead для получения учетных данных из хранилища паролей, и я могу хранить новые учетные данные, используя CredUIPromptForCredentials.

Но я не могу понять, как заставить работать CredWrite.

Код, который я использую:

var
   Target, Username, Password: WideString;
begin
   Target := 'StackruSomething';
   Username := 'IanBoyd'; 
   Password := 'password69';

   ZeroMemory(@Credentials, SizeOf(Credentials));

   Credentials.TargetName := PWideChar(Target);
   Credentials.Type_ := CRED_TYPE_GENERIC;
   Credentials.UserName := PWideChar(Username);
   Credentials.Persist := CRED_PERSIST_ENTERPRISE;
   Credentials.CredentialBlob := PByte(Password);
   Credentials.CredentialBlobSize := 2*(Length(Password));
   Credentials.UserName := PWideChar(Username);

   if not CredWriteW(@Credentials, 0) then
      RaiseLastWin32Error;

И GetLastError возвращает 1 (ERROR_INVALID_FUNCTION)

Эта функция неверна? Это даже не возвращение ERROR_INVALID_PARAMETER, это возвращает "Неверная функция". Что неверно?

Есть ли пример кода, который вызывает CredWrite?

Заметки

  • я пытался вызвать версию Ansi (CredWriteA), тот же результат
  • я пытался использовать CRED_PERSIST_SESSION а также CRED_PERSIST_LOCAL_MACHINE, в дополнение к CRED_PERSIST_ENTERPRISE

3 ответа

Решение

Неважно, я понял это.

И это не вина вызова API или моих параметров.

я просто тупой

И я хочу дуться, не говоря, что я сделал:(

Мне любопытно, это для смарт-карты, верно? и вы храните пин-код "нет" на смарт-карте, может быть, приложение / драйвер не загружен для работы с credwrite? Возможно, со стандартным аппаратным / программным обеспечением для смарт-карт, используемым в Windows, активируется функция CredWrite, и я предполагаю, что CredWrite пытается что-то связать (возможно, общий вызов API стандартной функции в оборудовании смарт-карт?)... просто мои мысли...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Не должно ли это

 Credentials.Type_ := CRED_TYPE_GENERIC;

Будь это вместо этого?

 Credentials.Type := CRED_TYPE_GENERIC;
Другие вопросы по тегам