Delphi 通过提供凭据进行程序登录

Delphi 通过提供凭据进行程序登录,delphi,delphi-2010,delphi-6,Delphi,Delphi 2010,Delphi 6,考虑windows用户A(具有管理权限)和B(受限访问权限)。 也是位于服务器上的数据文件夹,只有用户a有权访问该文件夹 我面临的挑战是通过用户B登录windows,并通过我的Delphi应用程序尝试通过编程方式提供用户A的凭据来访问数据文件夹 是否有允许我实现此目标的API函数?您可以使用和函数模拟已登录的用户访问数据文件夹 试试这个样品 {$APPTYPE CONSOLE} uses Windows, SysUtils; function ConnectAs(const lpsz

考虑windows用户A(具有管理权限)和B(受限访问权限)。 也是位于服务器上的数据文件夹,只有用户a有权访问该文件夹

我面临的挑战是通过用户B登录windows,并通过我的Delphi应用程序尝试通过编程方式提供用户A的凭据来访问数据文件夹


是否有允许我实现此目标的API函数?

您可以使用和函数模拟已登录的用户访问数据文件夹

试试这个样品

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils;

function ConnectAs(const lpszUsername, lpszPassword: string): Boolean;
var
  hToken       : THandle;
begin
  Result := LogonUser(PChar(lpszUsername), nil, PChar(lpszPassword), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken);
  if Result then
    Result := ImpersonateLoggedOnUser(hToken)
  else
  RaiseLastOSError;
end;

begin
  try
   ConnectAs('Admin','Password');
   //do something here


   //terminates the impersonation
   RevertToSelf;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.

那么,用户B正在运行应用程序,但应用程序需要访问只有用户a才能访问的资源?可能有一种方法可以在代码中模拟权限,但我认为更好的做法是使用单独的服务,该服务使用提升的权限(特定的服务帐户)运行,而该服务实际上是访问相关资源的服务。然后应用程序将访问该服务以获取所需的内容。我需要数据文件夹只能通过我的应用程序访问。在后台运行服务将始终授予对该文件夹的访问权限。@Khatchig通过COM使用特定用户,您的应用程序将模拟该用户并使用用户权限访问windows文件夹。我不是说这是最好的解决方案,但它会起作用。你需要做的唯一一件事就是授予该文件夹中的应用程序用户权限。+1很好的解决方案,它适用于所有windows版本?唯一的问题是知道用户和密码,因为它可以由操作系统管理员更改这些功能是在XP+1中引入的;模仿是解决这类问题的方法。在开始模拟过程之前,只需向用户询问目标用户名/密码。