2012-05-03 32 views
6

Tôi đang cố tạo một số chương trình Message Queues trên Máy chủ Windows 2003x64/2008R2 theo chương trình. Khi một Hàng đợi được tạo, Windows sẽ tự động áp dụng các quyền mặc định cho Hàng đợi.Đặt quyền mặc định khi tạo Hàng đợi Tin nhắn mới (MSMQ) trong C#

Đối với MSMQ 4, người dùng sau được thêm vào theo mặc định

  • Mọi người
  • Đấng Tạo Hóa của hàng đợi
  • vô danh Đăng Nhập

Khi tôi đặt quyền cho một hàng đợi sử dụng MessageQueue.SetPermissions() , chỉ định AccessControlList chỉ được thêm vào các quyền bảo mật mặc định.

Có cách nào để các quyền mặc định có thể bị xóa hoặc ghi đè không? Trong this MSDN Article ở phía dưới, nó khẳng định rằng

Bạn có thể không, tuy nhiên, tùy chỉnh giá trị mặc định khi chúng được mã hóa cứng.

Tôi biết rằng cài đặt của hàng đợi được lưu giữ trong một tệp, nằm ở C:\Windows\System32\msmq\storage\lqs. Trong tệp này có một thuộc tính Bảo mật đại diện cho các quyền cho hàng đợi. Có thể chỉnh sửa phím này là một lựa chọn không? Tuy nhiên, điều này có vẻ lạ lùng với tôi.

Tôi đang tìm một cách thích hợp để chỉ định AccessControlList của riêng mình ghi đè quyền bảo mật mặc định của hàng đợi. Hoặc khi nó được tạo ra, hoặc sau đó.

Bất kỳ trợ giúp nào được đánh giá cao,

Cảm ơn.

Trả lời

12

Nếu bạn không thể xóa hoặc thu hồi quyền đối với các nhóm mặc định đó, bạn luôn có thể từ chối các quyền đối với chúng. Từ chối được ưu tiên hơn cho phép. Mã này hoạt động:

MessageQueue queue = new MessageQueue(".\\Private$\\QueueName"); 
queue.SetPermissions("Everyone", MessageQueueAccessRights.ReceiveMessage, 
     AccessControlEntryType.Deny); 

Thu hồi quyền (AccessControlEntryType.Revoke) cũng nên hoạt động. Có thể có lỗi trong mã của bạn. Hoạt động trên máy của tôi.

Bài báo cho biết:

Bạn có thể không, tuy nhiên, tùy chỉnh giá trị mặc định khi chúng được mã hóa cứng.

và điều đó có nghĩa là bạn không thể thay đổi những quyền nào được đưa ra trong quá trình tạo hàng đợi nhưng bạn có thể thay đổi chúng sau đó.

Edit: Để có được "Mọi người" không phụ thuộc vào hệ điều hành ngôn ngữ: How to get the IdentityReference for "Everyone" to create MutexAccessRule on localized systems?

+1

Nhưng vì 'Từ chối được ưu tiên, và bạn 'Từ chối' Mọi người đều đúng, điều đó không có nghĩa là không ai có thể sử dụng hàng đợi? Liệu 'Thu hồi' có phải là một lựa chọn tốt hơn? –

+0

Thu hồi là tốt hơn nếu nó hoạt động nhưng bạn đã viết bạn không thể làm điều đó. Nó hoạt động khi tôi thử nó. Hãy thử lại với mã này. –

+0

Có 'Thu hồi' hoạt động. Tuy nhiên, làm cách nào tôi có thể thu hồi quyền đối với Chủ sở hữu/Người sáng tạo? Tên người dùng này không phải lúc nào cũng giống nhau. – Dominik

6

tôi đã có vấn đề chính xác cùng với các ACL. Khi tôi chuyển sang phương thức SetPermissions(), mọi thứ chạy tốt hơn nhiều.

Đoạn code dưới đây làm việc cho tôi:

   queue.SetPermissions(
        "Everyone", 
        MessageQueueAccessRights.FullControl, 
        AccessControlEntryType.Allow); 
       queue.SetPermissions(
        "ANONYMOUS LOGON", 
        MessageQueueAccessRights.FullControl, 
        AccessControlEntryType.Allow); 
0

Mặc dù câu trả lời của Mike là đúng, nó giả định máy chủ có tiếng Anh như ngôn ngữ. Nếu bạn sử dụng đoạn mã này trên máy chủ trong đó sử dụng một ngôn ngữ khác nhau (trong trường hợp này người Hà Lan) ...

queue.SetPermissions( 
        "Everyone", 
        MessageQueueAccessRights.FullControl, 
         AccessControlEntryType.Allow); 

... bạn sẽ có được ngoại lệ sau đây:

Kan de naam Mọi người niet omzetten (fout = 1332). System.Messaging.AccessControlList.MakeAcl (IntPtr oldAcl) bij System.Messaging.MessageQueue.SetPermissions (AccessControlList DACL) bij System.Messaging.MessageQueue.SetPermissions (String dùng, MessageQueueAccessRights quyền, AccessControlEntryType EntryType)

mà gần như dịch thành 'Không thể chuyển đổi tên' Mọi người '. Thay vào đó, nếu bạn sử dụng mã này, bạn sẽ nhận được phiên bản được bản địa hóa của 'Mọi người':

using System.Security.Principal; 

** code ommitted** 

string everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null).Translate(typeof(NTAccount)).Value; 
queue.SetPermissions( 
        everyone, 
        MessageQueueAccessRights.FullControl, 
        AccessControlEntryType.Allow); 
Các vấn đề liên quan