Sharepoint 2007 在SharePoint中使用SqlErrorLog访问Elmah.axd,而不向数据库添加用户

Sharepoint 2007 在SharePoint中使用SqlErrorLog访问Elmah.axd,而不向数据库添加用户,sharepoint-2007,log4net,elmah,Sharepoint 2007,Log4net,Elmah,我已经在我的个人SharePoint开发环境中安装/配置了,自从我以管理员身份登录以来,一切都很好。我正在使用MS Sql Server错误日志。(我还使用它来处理DEBUG/INFO/etc级别的日志记录,日志语句也存储在数据库中,与ELMAH的表相同。) 但是,在实际的开发服务器(不是我的个人环境)上,当我访问时,会出现错误“用户'NT AUTHORITY\ANONYMOUS LOGON'登录失败”。我知道这是“双跳问题”的传统错误,但我甚至不希望传递我的凭据—我只希望使用应用程序池标识的凭

我已经在我的个人SharePoint开发环境中安装/配置了,自从我以管理员身份登录以来,一切都很好。我正在使用MS Sql Server错误日志。(我还使用它来处理DEBUG/INFO/etc级别的日志记录,日志语句也存储在数据库中,与ELMAH的表相同。)

但是,在实际的开发服务器(不是我的个人环境)上,当我访问时,会出现错误“用户'NT AUTHORITY\ANONYMOUS LOGON'登录失败”。我知道这是“双跳问题”的传统错误,但我甚至不希望传递我的凭据—我只希望使用应用程序池标识的凭据进行数据库访问。使用SP对象模型时,SPSecurity.RunWithElevatedPrivileges可用;但是,我不想修改Elmah源代码

我的生产环境禁止使用SQL Server身份验证、将模拟更改为false或直接授予我对数据库的权限

我怎样才能让它工作?我错过什么了吗

我的生产环境排除了 SQL Server身份验证的使用, 将模拟更改为false,或 给自己在数据库上的权限 直接的

那么您别无选择,只能修改Elmah源代码。对不起

这与双跳问题关系不大,与ASP.NET中缺乏文档记录的模拟机制关系更大。根据,显然
导致ASP.NET模拟默认的IIS匿名帐户(IUSR\U 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需要被添加。我自己也测试过了,效果很好。祝你好运。

我最终编辑了Elmah源代码,但没有你的解决方案那么优雅。我刚刚将db调用包装在“RunWithElevatedPrivileges”中,当然还将程序集放入GAC中,等等。谢谢!