Проверка учетных данных пользователя на сервере рабочей группы

Мое приложение будет использоваться в локальной сети на клиентском настольном компьютере. В этой локальной сети есть один выделенный сервер Windows 2k. АД нет.

Пользователь должен заполнить информацию об учетной записи пользователя сервера, чтобы приложение могло выполнять некоторые удаленные операции с этой учетной записью (сопоставление сетевых дисков).

Как я могу проверить учетные данные пользователя на этом сервере?

При сопоставлении драйверов у меня будет ошибка, если аутентификация учетной записи пользователя не в порядке, но я хотел бы получить эту информацию перед попыткой сопоставления.

Что-то вроде функции LogonUser API, но работающей на удаленном компьютере.

Спасибо,


person Fred    schedule 26.11.2012    source источник


Ответы (2)


Вы можете использовать WNetUseConnection с флагами CONNECT_INTERACTIVE и CONNECT_PROMPT. Это в сочетании с пустыми параметрами идентификатора пользователя и пароля вызовет диалоговое окно учетных данных и подключится к сетевому ресурсу при вводе правильных учетных данных:

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;
person TLama    schedule 26.11.2012
comment
Спасибо, я знал об этом способе выполнения работы. Дело в том, что мое приложение является своего рода установочным приложением, в начале запрашиваются учетные данные, а затем, после нескольких страниц стиля установки, оно пытается незаметно сопоставить сетевые ресурсы с предоставленными учетными данными. Я ищу способ проверить учетные данные при запуске - person Fred; 26.11.2012
comment
Затем вы можете попытаться удалить эти флаги. Первый, CONNECT_INTERACTIVE, указывает, что операционная система может взаимодействовать с пользователем в целях аутентификации, поэтому теперь она должна удовлетворять ваши потребности. - person TLama; 26.11.2012
comment
Спасибо за ваш вклад, я реализовал ваше решение - person Fred; 28.11.2012

Я использую модуль SSPIValidatePassword.pas из http://www.michael-puff.de/Programmierung/Delphi/Units/, который подходит мне. Единственная экспортируемая функция в этом модуле SSPLogonUser возвращает значение true или false....

person mrabat    schedule 26.11.2012
comment
Спасибо, но я не могу понять, как заставить его работать. Я попытался использовать другую реализацию (delphi-kb.blogspot.fr/2010/07/), и я не могу заставить его работать ни с контроллером домена, ни с сервером рабочей группы - person Fred; 26.11.2012
comment
+1 за решение SSPI! SSPI является предпочтительным способом проверки учетных данных в Windows, как предлагает Microsoft: support.microsoft.com/kb/180548 ; Также полезно прочитать: stackoverflow.com/questions/7111618/ - person iPath ツ; 26.11.2012
comment
@Fred, реализация SSPI основана на Ansi, но в Delphi ›= 2009 тип строки — unicode — может быть, поэтому код не работает? - person iPath ツ; 26.11.2012
comment
@Fred, на самом деле SSPIValidatePassword.pas компилируется и работает, как и ожидалось, в Delphi 7. Так что речь идет о PAnsiChar / PWideChar и строковом типе Unicode в Delphi ›= 2009 - person iPath ツ; 26.11.2012
comment
Спасибо за комментарий, я согласен с вами, что использование SSPI - правильный способ сделать это, но я не могу найти способ заставить его работать. Собрал тестовый образец под D7. В тестовой сети у меня есть 2 компьютера в одной рабочей группе, клиент XP и сервер 2k. На сервере у меня есть учетная запись администратора. С этим тестовым образцом он всегда возвращает false, но с теми же учетными данными я могу монтировать сетевые диски или подключаться к серверу. - person Fred; 27.11.2012