4

私のアプリは、クライアント デスクトップ コンピューターの LAN で使用されます。この LAN には、専用の Windows 2k サーバーが 1 台あります。ADはありません。

ユーザーはサーバーのユーザー アカウント情報を入力する必要があるため、アプリはこのアカウントでリモート操作を実行できます (ネットワーク ドライブのマップ)

このサーバーに対してユーザー資格情報を確認するにはどうすればよいですか?

ドライバーをマッピングするとき、ユーザー アカウントの認証に問題があるとエラーが発生しますが、マッピングを試みる前にこの情報を取得したいと考えています。

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 (文字列) - リモート ネットワーク名
  • UserName (文字列) - ネットワーク リソースへの接続に使用されるユーザー名
  • パスワード (文字列) - ネットワーク リソースへの接続に使用するパスワード

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 に答える