私の運用環境では、SQL Server 認証の使用を排除し、偽装を false に変更したり、自分自身にデータベースに対する権限を直接付与したりしています。
そうなると、Elmah ソースを変更するしかありません。ごめん。
これは、ダブル ホップの問題とはあまり関係がなく、ASP.NET で文書化されていない偽装メカニズムと関係があります。この記事によると、 <identity impersonate="true" />
ASP.NET がデフォルトの IIS 匿名アカウント (IUSR_ machinename ) になりすますようです。SharePoint はこれを必要としますが、リモート データベースにアクセスしようとしても役に立たないため、明らかに何かする必要があります。
はい、この記事によると、Elmah ソース コードを編集して、抽象クラスから派生する新しいクラスを作成する必要がありますErrorLog
。この新しいクラスは、元の SqlErrorLog クラスのラッパーとして機能し、RWEP ブロックでそのメソッドを実行します。ここにあります:
public class SqlErrorLogWEP : ErrorLog
{
private SqlErrorLog sqlErrorLog;
public SqlErrorLogWEP(IDictionary config)
{
sqlErrorLog = new SqlErrorLog(config);
}
public SqlErrorLogWEP(string connectionString)
{
sqlErrorLog = new SqlErrorLog(connectionString);
}
public override string Log(Error error)
{
string retVal = String.Empty;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
retVal = sqlErrorLog.Log(error);
});
return retVal;
}
public override ErrorLogEntry GetError(string id)
{
ErrorLogEntry retVal = default(ErrorLogEntry);
SPSecurity.RunWithElevatedPrivileges(delegate()
{
retVal = sqlErrorLog.GetError(id);
});
return retVal;
}
public override int GetErrors(int pageIndex, int pageSize, System.Collections.IList errorEntryList)
{
int retVal = -1;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
retVal = sqlErrorLog.GetErrors(pageIndex, pageSize, errorEntryList);
});
return retVal;
}
}
言うまでもなく、Elmah プロジェクトで SharePoint を参照する必要があり、Elmah.dll を GAC する必要があります。私はこれを自分でテストしましたが、動作します。幸運を。