Delphi Могу ли я иметь AutoLogin для общих карт на сервере с помощью TOpenDialog - PullRequest
1 голос
/ 07 октября 2019

Программа, работающая на компьютере "A", хочет загрузить файл "F" на карте "M" с компьютера "B". Я использую следующие приготовления:

  dlgSelectImportFile.InitialDir := '\\192.168.1.59';
  dlgSelectImportFile.Options :=[ofOldStyleDialog];

Поскольку компьютер "B" требует авторизации, я получаю Windows-Security-диалог. Я хочу избежать этого, предоставляя правильное имя пользователя и пароль автоматически. Я думаю, что в API этого диалога есть что-то, что могло бы помочь здесь, но я ничего не нашел.

1 Ответ

1 голос
/ 07 октября 2019

Вы можете сохранить учетные данные в хранилище учетных данных, вот пример кода (использует Jedi Apilib ):

procedure StoreCredentials(const Server: String; const Username: String; const Password: String);
var
  CredTargetInfo: CREDENTIAL_TARGET_INFORMATION;
  Creds: CREDENTIAL;
  CredType: DWORD;
  bRes: Boolean;
  LastError: DWORD;
begin
  CredType := CRED_TYPE_DOMAIN_PASSWORD;

  ZeroMemory(@CredTargetInfo, sizeof(CredTargetInfo));
  CredTargetInfo.TargetName := PChar(Server);
  CredTargetInfo.CredTypeCount := 1;
  CredTargetInfo.CredTypes := @CredType;

  ZeroMemory(@Creds, sizeof(Creds));
  Creds.TargetName := PChar(Server);
  Creds.Type_ := CRED_TYPE_DOMAIN_PASSWORD;
  Creds.CredentialBlobSize := ByteLength(Password);
  Creds.CredentialBlob := PByte(PChar(Password));
  Creds.UserName := PChar(Username);
  Creds.Persist := CRED_PERSIST_ENTERPRISE;

  bRes := CredWriteDomainCredentials(@CredTargetInfo,@Creds, 0);
  if bRes then
  begin
    DbgOut('Successfully stored %s Credentials for %s', [Username, Server]);
  end
  else begin
    LastError := GetLastError;
    DbgOut('CredWriteDomainCredentials failed with %d (%s)', [LastError, SysErrorMessage(LastError)]);
  end;
end;

Вот пример того, как удалить сохраненные учетные данные:

procedure DeleteCredentials;
var
  Count: DWORD;
  Creds: PPCredentialArray;
  i: Cardinal;
  bRes: Boolean;
begin
  DbgOut('Deleting Old Credentials');
  if not CredEnumerate(nil, 0, Count, PCREDENTIAL(Creds)) then
    Exit;

  DbgOut('Found %d old credentials', [Count]);

  try
    for i := Count-1 downto 0 do
    begin

      bRes := CredDelete(Creds^[i]^.TargetName, Creds^[i]^.Type_, 0);
      DbgOut('Deleting credential %d (%s to %s) returned %s', [i, Creds^[i]^.UserName, Creds^[i]^.TargetName, BoolToStr(bRes, True)]);
    end;

  finally
    CredFree(Creds);
  end;
end;

Примечание: пример кода копируется / вставляется из старого проекта, поэтому такие вещи, как DbgOut, могут быть просто удалены. Пример кода предназначен для случая использования домена Active Directory, для ситуации, не связанной с доменом, могут потребоваться некоторые изменения.

...