1

在计算机“A”上运行的程序想要从计算机“B”下载映射“M”中的文件“F”。我使用以下准备工作:

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

由于计算机“B”需要授权,我得到了 Windows-Security-对话框。我想通过自动提供正确的用户名和密码来避免这种情况。我想这个对话框的 API 中有一些东西可以在这里提供帮助,但我没有找到任何东西。

4

1 回答 1

1

您可以将凭据存储在 Credential Vault 中,这里是一些示例代码(使用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 域的情况,它可能需要针对非域情况进行一些更改。

于 2019-10-07T14:47:10.787 回答