ユーザーをデータベースに追加せずに SharePoint で SqlErrorLog を使用して Elmah.axd にアクセスする

StackOverflow https://stackoverflow.com/questions/2073630

  •  20-09-2019
  •  | 
  •  

質問

インストール/設定しました エルマ 私の個人的な SharePoint 開発環境では、管理者としてログインしているため、すべてがうまく機能します。MS SQL Server エラー ログを使用しています。(私も使っています ログフォーネット DEBUG/INFO/etc レベルのログを処理するため、ログ ステートメントも ELMAH と同じテーブルのデータベースに保存されます。)

ただし、実際の開発サーバー(私の個人環境ではありません)では、アクセスすると http://example/elmah.axd 「ユーザー 'NT AUTHORITY\ANONYMOUS Logon' のログインに失敗しました」というエラーが表示されます。これが「ダブルホップ問題」による従来のエラーであることは理解していますが、自分の資格情報も渡されたくないのです。アプリケーション プール ID の資格情報を使用してデータベースにアクセスしたいだけです。SP オブジェクト モデルを使用する場合は、SPSecurity.RunWithElevatedPrivileges を使用できます。ただし、Elmah ソースは変更したくありません。

私の運用環境では、SQL Server 認証の使用、偽装を false に変更すること、またはデータベースに対するアクセス許可を自分に直接与えることはできません。

どうすればこれを機能させることができますか?何かが足りないのでしょうか?

役に立ちましたか?

解決

私の生産環境は、SQL Server認証の使用、なりすましの変更の変更、またはDBの権限を直接提供することを妨げています。

その場合は、Elmah ソースを変更するしかありません。ごめん。

これはダブルホップ問題とはあまり関係がなく、ASP.NET の偽装メカニズムの文書化が不十分であることが関係しています。によると この記事, 、 どうやら <identity impersonate="true" /> ASP.NET がデフォルトの IIS 匿名アカウント (IUSR_) になりすますマシン名)。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 する必要があります。私はこれを自分でテストしましたが、うまくいきました。幸運を。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top