我在 Windows 2003 Server 上有一项服务,需要以 UNC 路径的形式访问 webdav 资源。此服务的目的是验证(并采取纠正措施)webdav 功能到 sharepoint。想法是将文件写入共享点,并验证其内容。如果出现问题并且超出阈值,则会重新启动 mrxdav 和 webclient 服务。
我在 2003 服务器上的本地管理员服务帐户下运行该服务,并且可以访问共享点“文件夹”。(我通过使用服务帐户登录并将文件写入同一文件夹来验证这一点)。
当服务尝试将文件写入此文件夹时,它失败并显示 ACCESS DENIED,进程监视器显示该服务在 LocalSystem 下运行并模拟我的服务帐户
我还尝试使用 LogonUser 和 LogonUserEx(具有登录交互、网络、网络明文和提供程序的各种选项)从我的代码中模拟服务帐户,然后是 ImpersonateUser,但都导致相同的访问被拒绝。
我认为这是特定于使用 WebClient 服务的服务。我的代码是用 Delphi 编写的,但我也添加了 c 标签以吸引更多读者,因为我认为我的问题与 Delphi 无关。
编辑:也许相关,我正在运行一个单独的线程,它实际访问 WebDav 共享。
编辑:作为一种解决方法,我使用以下代码使用显式凭据创建网络连接:
function TGuardThread.Map(const Username: String; var Password: String;
const Domain: String): Boolean;
var
nr: NETRESOURCE;
dwRes: DWORD;
begin
try
ZeroMemory(@nr, SizeOf(nr));
nr.dwType := RESOURCETYPE_ANY;
nr.lpRemoteName := PChar('\\mywebdavroot\myfolder');
dwRes := WNetAddConnection2(nr, PChar(Password),
PChar(Format('%s\%s', [Domain, Username])), CONNECT_UPDATE_PROFILE);
Result := dwRes = NO_ERROR;
finally
if Length(Password) > 0 then
SecureZeroMemory(@Password[1], Length(Password) * SizeOf(Char));
end;
end;