2

我在 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;
4

1 回答 1

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;
于 2013-01-10T12:18:38.293 回答