4

我的应用程序将在客户端台式计算机上的 LAN 上使用。在这个 LAN 中,有一个专用的 Windows 2k 服务器。没有广告。

用户必须填写服务器的用户帐户信息,以便应用程序可以使用此帐户进行一些远程操作(映射网络驱动器)

如何针对此服务器检查用户凭据?

映射驱动程序时,如果用户帐户身份验证不正确,我会遇到错误,但我想在尝试映射之前获得此信息。

类似于 LogonUser API 函数,但在远程计算机上工作。

谢谢,

4

2 回答 2

3

我使用来自http://www.michael-puff.de/Programmierung/Delphi/Units/的单元 SSPIValidatePassword.pas, 它适合我的工作。该单元中唯一导出的函数 SSPLogonUser 返回 true 或 false....

于 2012-11-26T10:52:24.267 回答
3

您可以将WNetUseConnection函数与CONNECT_INTERACTIVECONNECT_PROMPT标志一起使用。当您输入正确的凭据时,这将与空的用户 ID 和密码参数一起调用凭据对话框并连接到网络资源:

procedure TForm1.Button1Click(Sender: TObject);
var
  BufferSize: DWORD;
  ResultFlag: DWORD;
  NetResource: TNetResource;
begin
  NetResource.dwType := RESOURCETYPE_DISK;
  NetResource.lpLocalName := nil;
  NetResource.lpRemoteName := '\\MySuperSecret\Place';
  NetResource.lpProvider := nil;
  if WNetUseConnection(Handle, NetResource, nil, nil, CONNECT_INTERACTIVE or
    CONNECT_PROMPT, nil, BufferSize, ResultFlag) = NO_ERROR
  then
    ShowMessage('Connected!');
end;

要在不提示输入凭据的情况下连接到网络资源,请删除上面指定的标志,如下面的函数所示,连接成功时应返回 True,失败时返回 False。下面是参数说明:

  • RemoteName (string) - 远程网络名称
  • UserName (string) - 用于连接网络资源的用户名
  • 密码(字符串)- 用于连接网络资源的密码

function TryConnect(const RemoteName, UserName, Password: string): Boolean;
var
  BufferSize: DWORD;
  ResultFlag: DWORD;
  NetResource: TNetResource;
begin
  NetResource.dwType := RESOURCETYPE_DISK;
  NetResource.lpLocalName := nil;
  NetResource.lpRemoteName := PChar(RemoteName);
  NetResource.lpProvider := nil;
  Result := WNetUseConnection(0, NetResource, PChar(UserName), PChar(Password),
    0, nil, BufferSize, ResultFlag) = NO_ERROR;
end;
于 2012-11-26T12:07:45.643 回答