如何啟用非系統管理員帳戶來執行 SQL Server 2000 中的 [xp_cmdshell] 延伸儲存程式


摘要


本文說明如何設定 Microsoft Windows 層級 SQL Server 代理程式 proxy 帳戶,以供不是 sysadmin 固定伺服器角色成員的 SQL 登錄使用。 此外,本文還包含可協助您解決嘗試設定 proxy 帳戶時可能發生之問題的詳細資訊參考。

簡介


Xp_cmdshell延伸儲存程式程式會從 Microsoft SQL Server 2000 中調用 Windows 命令命令介面。 當 xp_cmdshell 延伸儲存程式由 sysadmin 固定伺服器角色的成員執行時,命令外殼程式的 WINDOWS 程式會使用 SQL server windows 服務帳戶的安全性內容執行。 例如,如果 SQL Server 是在電腦上具有系統管理許可權的 Windows 登入,則開啟含有 xp_cmdshell 延伸儲存程式的命令提示字元的使用者,就會以本機系統管理員的身分存取 Windows。 根據預設,只有sysadmin固定伺服器角色的成員,才會將執行xp_cmdshell延伸儲存程式的許可權授與。 此許可權可協助遏制許可權的提升。如果您想要以降低的許可權等級啟動新的 Windows 程式,您可以使用 SQL Server 代理的 proxy 帳戶來設定具有適當許可權等級的 Windows 帳戶。

其他相關資訊


當您嘗試從不是sysadmin伺服器角色成員且未正確設定 Sql Server 代理程式 proxy 帳戶的 sql server 登入執行xp_cmdshell延伸儲存程式時,您可能會收到類似以下的錯誤訊息:
Msg 50001、Level 1、State 50001 xpsql .cpp:錯誤997從 GetProxyAccount 的行499
Msg 50001、Level 1、State 50001 xpsql .cpp:錯誤317從 GetProxyAccount 的行499
Msg 50001、Level 1、State 50001 xpsql .cpp:錯誤0(從 GetProxyAccount 的第499行)
Msg 50001、Level 1、State 50001 xpsql .cpp:錯誤87從 GetProxyAccount 的行499
如果您必須讓非系統管理員的使用者在 SQL Server 2000 中執行 xp_cmdshell 的延伸儲存程式,您必須將 proxy 帳戶與 SQL server 啟動帳戶設定為本機管理員群組的成員。 當 SQL Server 針對不是 sysadmin 固定伺服器角色成員的使用者執行作業或命令時,SQL Server 代理程式和 xp_cmdshell 延伸存儲程式都使用 proxy 帳戶。 Proxy 帳戶的 Windows 安全性認證是儲存在本機安全頒發機構(LSA)機密資料庫中。 只有 Windows 系統管理員可以存取此資訊。 因此,如果 SQL Server 啟動帳戶不是本機管理員群組的成員,使用者就無法儲存或取得 Windows 安全性認證以作為 proxy 帳戶登入,而且 xp_cmdshell 延伸存儲程式失敗。 若要讓非 sysadmin 使用者執行 xp_cmdshell 的延伸式儲存程式,SQL Server 啟動帳戶必須是本機管理員群組的成員。若要針對不是 sysadmin 固定伺服器角色成員的 SQL Server 登入設定 proxy 帳戶,請使用下列其中一種方法。

方法1:使用 SQL Server 企業版管理器

設定 Windows 帳戶

若要將 Windows 帳戶設定為允許非 sysadmin 使用者執行 xp_cmdshell 的延伸儲存程式,請依照下列步驟進行:
  1. 啟動 SQL Server 企業版管理器。
  2. 在 SQL Server 企業版管理器中,展開 [ MICROSOFT SQL server],然後展開 [SQL server 群組]。
  3. 展開您要設定 proxy 帳戶的 SQL Server 實例。
  4. 展開 [ 管理],以滑鼠右鍵按一下 [SQL Server 代理程式],然後按一下 [ 屬性]。
  5. 在 [ SQL Server 代理程式屬性 ] 對話方塊中,按一下 [ 作業系統 ] 索引標籤。
  6. 在 [ 非 SysAdmin 作業步驟 proxy 帳戶] 底下,按一下以清除 [ 只有具備系統管理員許可權的使用者才能執行 CmdExec 及 ActiveScripting 作業步驟 ] 核取方塊。
  7. 在 [ SQL Server Agent proxy 帳戶] 對話方塊的 [ 使用者名稱] 方塊中,輸入 Windows 帳戶名稱。
  8. 在 [ 密碼 ] 方塊中,輸入 Windows 密碼。
  9. 在 [ 網域 ] 方塊中,輸入 Windows 帳戶所屬的網域,然後按一下 [確定] 兩次。

新增 SQL Server 登入帳戶

若要新增您想要授與許可權以執行 xp_cmdshell 延伸儲存程式的 SQL Server 登入帳戶,請依照下列步驟執行:
  1. 在 SQL Server 企業管理器中,展開 [安全性]。
  2. 在 [登入] 窗格中,以滑鼠右鍵按一下您想要授與許可權的 SQL Server 登入帳戶,然後按一下 [屬性]。注意: 如果還沒有新增帳戶,您可以建立 Windows proxy 帳戶做為登入帳戶。
  3. 在 [ SQL Server 登入屬性 ] 對話方塊中,按一下 [ 資料庫存取 ] 索引標籤。
  4. 在 [指定此登入所能存取的資料庫] 清單中,按一下以選取資料庫的 [允許] 核取方塊,然後按一下[確定]
  5. 展開 [ 資料庫]、[主版],然後按一下 [ 延伸儲存程式]。
  6. 找出並以滑鼠右鍵按一下xp_cmdshell 延伸存儲程式,然後按一下 [屬性]。
  7. 在 [ 延伸儲存程式屬性 ] 對話方塊中,按一下 [ 許可權]。
  8. 針對您要授與 [執行] 許可權的 SQL Server 登入帳戶,按一下以選取 [ EXEC ] 核取方塊,然後按一下 [確定] 兩次。

方法2:執行 Transact-sql 腳本

執行下列 Transact-sql 腳本以啟用 Windows 帳戶來執行 xp_cmdshell 的延伸儲存程式:
-- Set database to master.USE masterGO-- Add a valid Windows account as proxy account.EXECUTE xp_sqlagent_proxy_account N'SET'                        , N'<DomainName>'                        , N'<WindowsAccount>'                        , N'<WindowsPassword>'GO-- Get the proxy account to determine whether it is set up correctly. EXECUTE xp_sqlagent_proxy_account N'GET'GO-- Enable non-system administrators to run the job and to execute xp_cmdshell.EXECUTE msdb..sp_set_sqlagent_properties @sysadmin_only = 0GO
注意: 在此腳本中, <DomainName> 是 Windows 帳戶所屬的網域。 <WindowsAccount> 是 Windows 帳戶名稱。 <WindowsPassword> 是 Windows 帳戶的密碼。 若要新增您想要授與執行 xp_cmdshell 延伸存儲程式許可權的 SQL Server 登入帳戶,請執行下列 transact-sql 腳本:
USE masterGO-- Grant database access to the SQL Server login account that you want to provide access.EXEC sp_grantdbaccess '<SQLLogin>'GO-- Grant execute permission on xp_cmdshell to the SQL Server login account.GRANT exec ON xp_cmdshell TO <SQLLogin>GO
注意: 在此腳本中, <SQLLogin> 是您想要授與執行 xp_cmdshell 延伸存儲程式許可權的 SQL Server 登入。注意: Proxy 帳戶是 Windows 帳戶,其安全性內容是 SQL Server 代理程式作業或命令列命令執行。 當您設定 SQL Server 代理 proxy 帳戶的 Windows 帳戶時,您必須給予該帳戶「以批次工作登入的使用者權利」。

參考


如需 xp_cmdshell 延伸儲存程式的詳細資訊,請參閱 SQL Server 線上書籍中的「transact-sql 參考」主題。 如需 SQL Server 代理程式 proxy 帳戶的詳細資訊,請造訪下列 Microsoft 開發人員網路(MSDN)網站:如需如何在 proxy 帳戶上設定適當許可權的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:
283811 如何在 sql server 2005 中變更 SQL Server 或 SQL Server 代理服務帳戶,而不使用 sql Server 2000 或 SQL Server Configuration Manager 中的 sql Enterprise Manager