UNCパスとしてwebdavリソースにアクセスする必要があるWindows2003Server上のサービスがあります。このサービスの目的は、SharePointに対するwebdav機能を検証(および修正措置を講じる)することです。アイデアは、SharePointにファイルを書き込み、その内容を確認することです。何か問題が発生し、しきい値を超えた場合、mrxdavとwebclientサービスが再起動されます。
2003サーバーのローカル管理者であり、SharePointの「フォルダー」にアクセスできるサービスアカウントでサービスを実行しています。(サービスアカウントでログインし、同じフォルダーにファイルを書き込むことでこれを確認しました)。
サービスがこのフォルダーにファイルを書き込もうとすると、ACCESS DENIEDで失敗します。プロセスモニターは、サービスがLocalSystemで実行されていることを示し、サービスアカウントを偽装します。
また、LogonUserとLogonUserEx(ログオンインタラクティブ、ネットワーク、ネットワーククリアテキスト、プロバイダーのさまざまなオプションを使用)に続いてImpersonateUserを使用して、コードからサービスアカウントを偽装しようとしましたが、すべて同じACCESSDENIEDになります。
これは、WebClientサービスを使用するサービスに固有のものだと思います。私のコードはDelphiで書かれていますが、私の問題はDelphiに関連しているとは思わないので、より多くの読者を引き付けるためにcタグも追加しました。
編集:おそらく関連性がありますが、実際に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;