【发布时间】:2025-11-23 23:25:01
【问题描述】:
我在 Windows 2003 Server 上有一项服务,需要以 UNC 路径的形式访问 webdav 资源。此服务的目的是验证(并采取纠正措施)webdav 功能到 sharepoint。想法是将文件写入共享点,并验证其内容。如果出现问题并超过阈值,则会重新启动 mrxdav 和 webclient 服务。
我在 2003 服务器上的本地管理员服务帐户下运行该服务,并且可以访问共享点“文件夹”。 (我通过使用服务帐户登录并将文件写入同一文件夹来验证这一点)。
当服务尝试将文件写入此文件夹时,它失败并显示 ACCESS DENIED,进程监视器显示该服务在 LocalSystem 下运行并模拟我的服务帐户
我还尝试使用 LogonUser 和 LogonUserEx(具有登录交互、网络、网络明文和提供程序的各种选项)从我的代码中模拟服务帐户,然后是 ImpersonateUser,但都导致相同的 ACCESS DENIED。
我认为这是使用 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;
【问题讨论】:
-
不是 Windows LocalSystem 在设计上剥夺了任何网络访问权限吗?
-
@Arioch'是的 LocalSystem 是(系统不是),但这就是我使用服务(用户)帐户运行服务的原因。
标签: c delphi winapi service webdav