代码之家  ›  专栏  ›  技术社区  ›  Oskar Kjellin

SqlException:用户没有执行此操作的权限

  •  3
  • Oskar Kjellin  · 技术社区  · 14 年前

    我一直在Visual Studio中使用我的网站(ASP.NET MVC),但现在我想在服务器上托管它。我从Visual Studio发布到要使用的网络共享。服务器正在运行Windows Home Server、IIS 6和SQL Server 2008 R2(Express)。

    在Microsoft SQL Server Management Studio中,我附加了数据库,并确保用户iusr_server是数据库的所有者。我还确保用户网络服务具有访问权限。

    该网站在IIS中配置为以匿名方式作为iusr_服务器运行。我已经授予了对iusr_服务器以及文件系统中的网络服务的写和读访问权限,并确保没有任何内容是只读的。

    web.config具有以下连接字符串:

            <connectionStrings>
        <remove name="ApplicationServices" />
      <add name="ApplicationServices" connectionString="Data Source=.\SQLExpress;Integrated Security=True;Initial Catalog=MyDatebase"
       providerName="System.Data.SqlClient" />
         </connectionStrings>
    

    但是,我不能浏览我的网站。我只得到这个错误:

    “/”应用程序中的服务器错误。

    用户没有权限 执行此操作。描述:一个 期间发生未处理的异常 当前网站的执行 请求。请查看堆栈跟踪 有关错误的详细信息 以及代码的起源。

    异常详细信息: system.data.sqlclient.sqlException: 用户没有权限 执行此操作。

    源错误:

    生成了未处理的异常 在电流执行期间 Web请求。关于 异常的来源和位置 可以使用异常来标识 下面是堆栈跟踪。

    堆栈跟踪:

    [sqlException(0x80131904):用户执行 没有执行此操作的权限 行动。
    system.data.sqlclient.sqlInternalConnection.onerror(sqlException 异常,Boolean BreakConnection) +4846887 system.data.sqlclient.tdsarser.throwExceptionandWarning(tdsarserStateObject STATEOBO)+ 194

    感觉我什么都试过了。非常感谢你在这方面的帮助。

    编辑:

    This is the event in the event viewer:
    Event code: 3005 
    Event message: An unhandled exception has occurred. 
    Event time: 2010-06-05 23:55:08 
    Event time (UTC): 2010-06-05 21:55:08 
    Event ID: 88a3a76c00a34e21bf6e711b3b3a8f21 
    Event sequence: 137 
    Event occurrence: 59 
    Event detail code: 0 
    
    Application information: 
        Application domain: /LM/W3SVC/6893/Root-2-129202466028125000 
        Trust level: Full 
        Application Virtual Path: / 
        Application Path: C:\Inetpub\WebPage\ 
        Machine name: SERVER 
    
    Process information: 
        Process ID: 5864 
        Process name: w3wp.exe 
        Account name: SERVER\USER
    
    Exception information: 
        Exception type: SqlException 
        Exception message: User does not have permission to perform this action. 
    
    Request information: 
        Request URL: http://localhost/ 
        Request path: / 
        User host address: 127.0.0.1 
        User:  
        Is authenticated: False 
        Authentication Type:  
        Thread account name: SERVER\USER
    
    Thread information: 
        Thread ID: 1 
        Thread account name: SERVER\USER
        Is impersonating: True 
        Stack trace:    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
       at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
       at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
       at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
       at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
       at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
       at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
       at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
       at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
       at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       at System.Data.SqlClient.SqlConnection.Open()
       at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
       at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()
       at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()
       at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
       at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
       at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)     
    
    Custom event details: 
    
    For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
    
    4 回复  |  直到 14 年前
        1
  •  2
  •   Oskar Kjellin    14 年前

    结果发现问题在于,我的DataContext使用的是它自己的connectionString,它不在web.config中。因此,它从未改变过,也无法建立连接。我更改了我的代码,以便我的DataContext使用web.config中的字符串,该字符串起作用:)

        2
  •  1
  •   Raj More    14 年前

    权限不是由用户ID决定的,而是由SQL Server为登录保留的内部ID决定的。由于这是两台服务器,因此两台计算机上登录名的内部ID不同。

    当您跨服务器移动数据库时,必须修复用户登录,因为它们会变成孤立的。新服务器上的内部ID不同,因此可以通过运行以下tsql命令修复用户登录:

    EXEC sp_change_users_login 'Auto_Fix', 'IUSR_Server'
    

    数据库中有一个用户,但服务器上也必须有一个登录名。您必须检查它们是否都存在,以便解决问题(如果这与数据库用户是孤立的有关)

        3
  •  1
  •   Jimmie R. Houts    14 年前

    您是否已验证iusr_服务器帐户对文件系统中的sqlexpress数据库具有完全访问权限?

    您还可以尝试使IIS中的应用程序池作为iusr_服务器运行(该应用程序在自己的应用程序池中运行,对吗?)。然后将匿名用户的网站安全性更改回默认值。执行此操作时,请确保iusr_服务器帐户是IIS_wpg组的一部分,这将授予该帐户在应用程序池中进行模拟的所有正确权限。

        4
  •  0
  •   Akash Kava    14 年前

    在第3行

    线程信息:
    线程ID:1
    线程帐户名:服务器\用户

    <--什么是服务器\用户,是您的用户还是网络服务?如果是网络服务(通常是应用程序池的ID),则此线程帐户名应该可以访问SQL Server数据库。理想的解决方案是通过提供显式凭证来更改配置,或者确保线程帐户名具有对数据库的完全访问(读/写)权限。