2

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;
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 に答える