我在Windows 2003 Server上有一项服务需要访问webdav资源作为UNC路径。此服务的目的是验证(并采取纠正措施)webdav功能到sharepoint。我们的想法是将文件写入sharepoint,并验证其内容。如果出现问题且超出阈值,则将重新启动mrxdav和webclient服务。
我在2003服务器上的本地管理员服务帐户下运行该服务,并且可以访问sharepoint“文件夹”。 (我通过使用服务帐户登录并将文件写入同一文件夹来验证这一点。)
当服务尝试将文件写入此文件夹时,它会因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;
答案 0 :(得分:0)
解决方法是使用与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;