2010-01-06 31 views
25

Tôi thấy thông báo lỗi khi cố gắng thực thi xp_cmdshell từ bên trong một thủ tục được lưu trữ.Nhận quyền thực thi xp_cmdshell

xp_cmdshell được bật trên ví dụ. Và quyền thực thi được cấp cho người dùng của tôi, nhưng tôi vẫn thấy ngoại lệ.

Việc cho phép EXECUTE đã bị từ chối trên đối tượng 'xp_cmdshell', cơ sở dữ liệu 'mssqlsystemresource', lược đồ 'sys'

Một phần của vấn đề là đây là một cụm chia sẻ, và chúng ta có một cơ sở dữ liệu duy nhất trên các ví dụ , vì vậy chúng tôi không có đủ quyền quản trị. Vì vậy, tôi không thể đi vào và cấp quyền, và những gì không.

+4

Tại sao bạn sử dụng quy trình được lưu trữ nguy hiểm nhất từng được tạo? ('xp_cmdshell') – SLaks

+0

Mã cũ hơn và không có thời gian để viết lại. Chúng tôi đang sử dụng nó để gọi BCP để nhập tệp vào bảng tạm thời để xử lý. Bảng tạm thời là sql động và chúng tôi tạo tệp .fmt dựa trên cùng một logic mà sql động sử dụng. Sẽ mất hơn một ngày để thực hiện lại điều này. –

+0

Bạn có thể đăng số phiên bản SQL Server chính xác, bao gồm số bản dựng không? –

Trả lời

51

Đối với người dùng không phải là thành viên của vai trò sysadmin trên cá thể SQL Server, bạn cần phải thực hiện các hành động sau để cấp quyền truy cập cho thủ tục được lưu trữ mở rộng xp_cmdshell. Ngoài ra nếu bạn quên một trong các bước tôi đã liệt kê lỗi sẽ được ném.

  1. Enable thủ tục xp_cmdshell

    Msg 15.281, Level 16, State 1, Thủ tục xp_cmdshell, Line 1 SQL Server bị chặn truy cập vào thủ tục 'sys.xp_cmdshell' của thành phần 'xp_cmdshell' vì thành phần này bị tắt như là một phần của cấu hình bảo mật cho máy chủ này. Người quản trị hệ thống có thể cho phép sử dụng 'xp_cmdshell' bằng cách sử dụng sp_configure. Để biết thêm thông tin về phép 'xp_cmdshell', xem "Diện tích Cấu hình bề mặt" trong SQL Server Books Online. *

  2. Tạo một đăng nhập cho người dùng phi sysadmin có quyền truy cập công cộng để các cơ sở dữ liệu tổng thể

    Msg 229, Level 14, State 5, Thủ tục xp_cmdshell, Line 1 việc cho phép EXECUTE đã bị từ chối trên đối tượng 'xp_cmdshell', cơ sở dữ liệu 'mssqlsystemresource', lược đồ 'sys'. *

  3. Grant phép EXEC trên các thủ tục xp_cmdshell lưu trữ

    Msg 229, Level 14, State 5, Thủ tục xp_cmdshell, Line 1 Việc cho phép EXECUTE đã bị từ chối trên đối tượng 'xp_cmdshell', cơ sở dữ liệu 'mssqlsystemresource', schema 'sys'. *

  4. Tạo một tài khoản proxy đó xp_cmdshell sẽ được chạy theo bằng sp_xp_cmdshell_proxy_account

    Msg 15153, Cấp 16, Tiểu bang 1, Thủ tục xp_cmdshell, Dòng 1 Thông tin tài khoản proxy xp_cmdshell không thể truy xuất được hoặc không hợp lệ. Xác minh rằng thông tin xác thực '## xp_cmdshell_proxy_account ##' tồn tại và chứa thông tin hợp lệ.*

Dường như lỗi của bạn là bước 2 hoặc 3 bị bỏ qua. Tôi không quen thuộc với các cụm để biết nếu có bất cứ điều gì đặc biệt cho thiết lập đó.

+0

Bắt đầu từ hôm nay, bạn là anh hùng của tôi. Điều này thực sự đã giúp tôi tải! – Jens

+0

Cảm ơn, bạn có hướng dẫn sử dụng với mã theo dõi không? –

+0

@tchester bạn lấy thông tin này từ đâu? Thật hữu ích. Cảm ơn bạn. – Rachael

1

tchester nói:

(2) Tạo một đăng nhập cho người dùng phi sysadmin có quyền truy cập công cộng để các cơ sở dữ liệu tổng thể

tôi đã đi vào danh sách cơ sở dữ liệu của người dùng của tôi (server/security/kết nối/my tên người dùng/thuộc tính/người dùng ánh xạ, và muốn kiểm tra hộp cho cơ sở dữ liệu tổng thể.Tôi nhận được một thông báo lỗi nói rằng người dùng đã tồn tại trong cơ sở dữ liệu chủ. và chọn hộp dành cho chính. Hãy chọn hộp "công khai" bên dưới.

Sau đó, bạn cần cấp lại khoản tiền tài trợ dễ thương trên xp_cmdshell để "tên người dùng của tôi"

Yves

36

Tôi muốn để hoàn thành câu trả lời từ tchester.

(1) Cho phép các thủ tục xp_cmdshell:

-- To allow advanced options to be changed. 
EXEC sp_configure 'show advanced options', 1 
RECONFIGURE 
GO 

-- Enable the xp_cmdshell procedure 
EXEC sp_configure 'xp_cmdshell', 1 
RECONFIGURE 
GO 

(2) Tạo một đăng nhập 'Domain \ TestUser' (cửa sổ người dùng) cho người sử dụng phi sysadmin có quyền truy cập công cộng để các cơ sở dữ liệu tổng thể

(3) Grant EXEC phép trên xp_cmdshell thủ tục lưu trữ:

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser] 

(4) Tạo một tài khoản proxy đó xp_cmdshell sẽ được chạy theo bằng sp_xp_cmdshell_proxy_account

EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'pwd' 
-- Note: pwd means windows password for [Domain\TestUser] account id on the box. 
--  Don't include square brackets around Domain\TestUser. 

(5) cho phép kiểm soát Grant máy chủ để sử dụng

USE master; 
GRANT CONTROL SERVER TO [Domain\TestUser] 
GO 
+0

Không GRANT KIỂM SOÁT MÁY CHỦ ĐẾN [Domain \ TestUser] có hiệu quả cung cấp quyền sysadmin cho người dùng đó? Tôi nghĩ toàn bộ ý tưởng là giảm thiểu các quyền trên người dùng đó? – Colin

+2

Khi tôi đọc điều này, tôi nghĩ rằng người dùng quản trị viên không phải là tài khoản windows và cũng là tài khoản proxy. Không đúng. Tài khoản proxy cần phải là cửa sổ. Sau đó, bất kỳ người dùng quản trị viên nào không cần quyền truy cập công khai vào quyền chủ và thực thi trên xp_cmdshell – Colin

+1

Trong trường hợp của tôi, bước 4 hoàn toàn không cần thiết! – Johan

0

Mở rộng trên những gì đã được quy định tự động xuất dữ liệu dưới dạng csv để một mạng chia sẻ qua SQL Server Agent.

(1) Cho phép các thủ tục xp_cmdshell:

-- To allow advanced options to be changed. 
EXEC sp_configure 'show advanced options', 1 
RECONFIGURE 
GO 

-- Enable the xp_cmdshell procedure 
EXEC sp_configure 'xp_cmdshell', 1 
RECONFIGURE 
GO 

(2) Tạo một đăng nhập 'Domain \ TestUser' (cửa sổ người dùng) cho người sử dụng phi sysadmin có quyền truy cập công cộng để các cơ sở dữ liệu tổng thể. Thực hiện thông qua ánh xạ người dùng

(3) Cung cấp nhật ký làm công việc theo lô: Điều hướng đến Chính sách bảo mật cục bộ -> Chính sách địa phương -> Chuyển nhượng quyền người dùng.Thêm người dùng vào "Đăng nhập như một công việc hàng loạt"

(4) Cho đọc/quyền ghi vào thư mục mạng cho domain \ user

(5) cho phép Grant EXEC trên stored procedure xp_cmdshell:

GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser] 

(6) Tạo một tài khoản proxy đó xp_cmdshell sẽ được chạy theo bằng sp_xp_cmdshell_proxy_account

EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'password_for_domain_user' 

(7) Nếu lệnh sp_xp_cmdshell_proxy_account không làm việc, m tạo một cách an toàn nó

create credential ##xp_cmdshell_proxy_account## with identity = 'Domain\DomainUser', secret = 'password' 

(8) Bật tác nhân máy chủ SQL. Mở Trình quản lý cấu hình máy chủ SQL, điều hướng đến Dịch vụ SQL Server, bật SQL Server Agent.

(9) Tạo công việc tự động. Mở SSMS, chọn SQL Server Agent, sau đó nhấp chuột phải vào công việc và nhấp vào "Công việc mới".

(10) Chọn "Chủ sở hữu" làm người dùng được tạo của bạn. Chọn "Các bước", tạo "type" = T-SQL. Điền vào trường lệnh tương tự như dưới đây. Đặt dấu phân cách là ','

EXEC master..xp_cmdshell 'SQLCMD -q "select * from master" -o file.csv -s "," 

(11) Điền lịch biểu tương ứng.

Các vấn đề liên quan