Sql-Server

使用 sa 使用者將 xp_logevent 上的執行權限授予 sa

  • November 10, 2016

使用以下程式碼執行 SQL Server 2012 CLR 儲存過程:

const string executeLog = "EXEC master..xp_logevent @errorNumber, @message, informational";
using (SqlCommand cmd = new SqlCommand(executeLog, connection))
{
   cmd.CommandType = CommandType.Text;
   cmd.Parameters.AddWithValue("@errorNumber", 60001);
   cmd.Parameters.AddWithValue("@message", url);

   cmd.ExecuteScalar();
}

我收到此錯誤:

System.Data.SqlClient.SqlException:對對象“xp_logevent”、數據庫“mssqlsystemresource”、架構“sys”的執行權限被拒絕。

我嘗試以sa使用者身份執行此操作:

grant execute on xp_logevent to sa

但我得到另一個錯誤:

您找不到不存在的使用者“sa”或使用者沒有權限。

如何向 sa 使用者授予執行權限?

如何向 sa 使用者授予執行權限?

您不需要在伺服器角色中按sa原樣授予執行任何內容,並且幾乎可以做任何事情。因此,如果您在執行 時遇到錯誤,那麼您沒有以. 連接字元串是使用還是正常/外部連接?如果使用,則權限基於執行 SQLCLR 儲存過程的人。如果使用正常連接,則權限預設基於 SQL Server NT 服務的登錄帳戶(如果是預設實例,則為MSSQLSERVER / SQLEXPRESS ),否則它可以是執行 SQLCLR 儲存過程的任何人的權限,如果程式碼已添加以進行模擬。sa``sysadmin``xp_logevent``sa``context connection = true;``context connection = true;

那麼,它是如何製造的SqlConnection呢?該問題的答案將有助於確定適當的解決方案。如果此 SQLCLR 儲存過程將由任何人(即不一定是db_owner數據庫角色或sysadmin伺服器角色的使用者)呼叫,那麼您可以執行以下操作以將此權限授予盡可能小的範圍。

在包含 SQLCLR 儲存過程的數據庫中:

  1. 創建非對稱密鑰(請參閱CREATE ASYMMETRIC KEY
  2. 從該非對稱密鑰創建使用者(請參閱CREATE USER
  3. 將此新使用者添加到db_owner數據庫角色
  4. 創建一個 T-SQL 儲存過程(可能稱為它dbo.LogEvent),它接受您傳入的兩個參數 (@errorNumber@message) 並簡單地執行EXEC xp_logevent @errorNumber, @message, informational;
  5. 將此新儲存過程授予EXECUTE將呼叫 SQLCLR 儲存過程的任何使用者和/或數據庫角色
  6. 使用用於創建新使用者的相同非對稱密鑰簽署這個新的儲存過程(請參閱添加簽名
  7. 更新您的 SQLCLR 程式碼以執行這個新的 T-SQL 儲存過程(即dbo.LogEvent),而不是xp_logevent
  8. 然後,您可以將您的using聲明更改為new SqlCommand("dbo.LogEvent", connection)
  9. 然後更改cmd.CommandType = CommandType.Text;cmd.CommandType = CommandType.StoredProcedure;
  10. 刪除const string executeLog

其他注意事項:

  • 請不要使用AddWithValue,因為它有問題。相反,只需SqlParameter使用顯式設置的數據類型創建 ,然後將其添加到SqlCommand.SqlParameters集合中。
  • ExecuteScalar如果您沒有從結果集中擷取某些內容,則無需呼叫。相反,呼叫ExecuteNonQuery

引用自:https://dba.stackexchange.com/questions/105520