考虑Windows用户A(具有管理权限)和B(受限访问权限)。 也是位于服务器上的数据文件夹,只有用户A有权访问该数据文件夹。通过提供凭据进行程序登录
我面临的挑战是通过用户B登录窗口,并通过我的Delphi应用程序尝试通过以编程方式提供用户A的凭据来访问数据文件夹。
是否有API函数可以实现这个目标?
考虑Windows用户A(具有管理权限)和B(受限访问权限)。 也是位于服务器上的数据文件夹,只有用户A有权访问该数据文件夹。通过提供凭据进行程序登录
我面临的挑战是通过用户B登录窗口,并通过我的Delphi应用程序尝试通过以编程方式提供用户A的凭据来访问数据文件夹。
是否有API函数可以实现这个目标?
可以使用LogonUser
,ImpersonateLoggedOnUser
和RevertToSelf
函数模仿登录用户访问数据文件夹。
试试这个样本
{$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.
+1不错的解决方案,它适用于所有的Windows版本?唯一的问题是知道用户和密码,因为它可以由操作系统管理员更改 – EProgrammerNotFound
这些功能是在XP中引入的。 – RRUZ
+1;模仿是解决这些问题的方法。只需在开始模拟过程之前向用户提供目标用户名/密码。 –
因此,用户B正在运行的应用程序,但应用程序需要访问,只有用户A可以访问资源?可能有一种方法可以模仿代码中的权限,但我想一个更好的做法是将一个单独的服务与提升的权限(特定的服务帐户)一起运行,其中该服务实际上是访问有问题的资源。然后,应用程序将访问该服务以获取所需内容。 – David
我需要数据文件夹才能通过我的应用程序访问。在后台运行服务将随时授予对该文件夹的访问权限。 – Johny
@Khatchig通过使用特定用户的COM,您的应用程序模仿用户并访问windows用户权限文件夹。我不是说这是最好的解决方案,但它会起作用。您只需要为该文件夹中的App用户授予权限即可。 – EProgrammerNotFound