从服务访问WebDav资源时拒绝访问

时间:2013-01-09 07:35:02

标签: c delphi winapi service webdav

我在Windows 2003 Server上有一项服务需要访问webdav资源作为UNC路径。此服务的目的是验证(并采取纠正措施)webdav功能到sharepoint。我们的想法是将文件写入sharepoint,并验证其内容。如果出现问题且超出阈值,则将重新启动mrxdav和webclient服务。

我在2003服务器上的本地管理员服务帐户下运行该服务,并且可以访问sharepoint“文件夹”。 (我通过使用服务帐户登录并将文件写入同一文件夹来验证这一点。)

当服务尝试将文件写入此文件夹时,它会因ACCESS DENIED而失败,进程监视器会显示该服务在LocalSystem下运行并模拟我的服务帐户

enter image description here enter image description here enter image description here

我还尝试使用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;

1 个答案:

答案 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;
相关问题