Credwrite возвращает код ошибки Win32 (error_invalid_function) «Неправильная функция».

StackOverflow https://stackoverflow.com/questions/2337672

  •  22-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь позвонить Credwrite, но он возвращается Error_invalid_function. Анкет я могу позвонить Credread Чтобы получить учетные данные из магазина паролей, и я могу хранить новые учетные данные, используя Cerruipromptforcredentials.

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

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

var
   Target, Username, Password: WideString;
begin
   Target := 'StackOverflowSomething';
   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
Это было полезно?

Решение

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

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

Я просто глуп.

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

Другие советы

Это очень старый, очень известная проблема с очень старой и довольно известной работой вокруг, чтобы избежать кэширования отдельных ссылок во вспышке.Вы просто добавляете мусор на конец URL с каждым вызовом.Например:

myUrlLoader.load(new URLRequest("http://sameOldSite.com/sameOldfile.mp3?" + new Date().toString() ));
.

Этот код непроверен, так что это может быть не точна, но вы получаете идею.Применив новую дату, вы получаете уникальную строку символов каждый раз, когда вы создаете новую дату () или перерабатываете один объект даты и продолжаете вызывать TOSTRING () или GetTime () или что угодно.Вы можете сделать то же самое с глобальным объектом таймера, я тоже полагаю.Эта строка дополнительного мусора отбрасывается, потому что она рассматривается как получаемая переменная и не используется.

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

Надеюсь, это поможет, с уважением, Том.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top