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;