2013-01-24 30 views
5

Tôi cần cấp quyền truy cập cho mọi người đối với một đường ống có tên tôi đang tạo. Tôi hiểu cách để làm điều đó là tạo ra một DACL NULL/trống và chuyển nó đến CreateNamedPipe.Làm cách nào để tạo một DACL NULL/trống?

Làm cách nào để tạo một DACL NULL? Tôi đã nói rằng nó không phải là giống như đi qua một con trỏ NULL cho LPSECURITY_ATTRIBUTES.

Trả lời

9

Như thế này:

SECURITY_DESCRIPTOR SD; 
InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION); 
SetSecurityDescriptorDacl(&SD, TRUE, NULL, FALSE); 

tôi bỏ qua việc kiểm tra lỗi vì lợi ích của ngắn gọn. Bạn sẽ không làm điều đó.

Sau đó, khi bạn gọi CreateNamedPipe bạn có thể thiết lập các thuộc tính an ninh ghi lại như thế này:

SA.nLength = sizeof(SA); 
SA.lpSecurityDescriptor = &SD; 
SA.bInheritHandle = TRUE; 

Các tài liệu cho SetSecurityDescriptorDacl trạng thái:

Khi tham số pDacl không trỏ đến một DACL và cờ bDaclPresent là TRUE, một DACL NULL được chỉ định. Tất cả truy cập đều được cho phép. Bạn không nên sử dụng một NULL DACL với một đối tượng vì bất kỳ người dùng nào cũng có thể thay đổi DACL và chủ sở hữu của bộ mô tả bảo mật. Điều này sẽ ảnh hưởng đến việc sử dụng đối tượng.

Vì vậy, ở trên là cách thực hiện, nhưng tài liệu nhấn mạnh rằng bạn không nên làm như vậy.

+0

Hm, phần về việc thay đổi quyền sở hữu là một bất ngờ. Nhưng trong trường hợp của tôi nó không phải là một vấn đề, tôi chỉ cần để có thể kết nối từ exe của tôi bất kể người dùng chạy nó, và kết nối với đường ống sẽ không cho phép họ hack dịch vụ cửa sổ của tôi hoặc bất cứ điều gì. Nhưng nó vẫn thú vị - có thể cấp quyền truy cập cho mọi người để kết nối, mà không cho phép họ thay đổi quyền sở hữu? – sashoalm

+0

Có, sau đó bạn cần phải sử dụng một DACL thực. Mã trong nhận xét của tôi tại câu hỏi trước của bạn giải thích cách tôi làm điều đó. –

4

Dưới đây là đoạn mã chúng tôi sử dụng một trong các dự án của chúng tôi:

SECURITY_DESCRIPTOR pSD; 
SECURITY_ATTRIBUTES SA; 

if(!InitializeSecurityDescriptor(&pSD, SECURITY_DESCRIPTOR_REVISION)) 
    throw error; 
if(!SetSecurityDescriptorDacl(&pSD, true, NULL, false)) 
    throw error; 
SA.nLength = sizeof(SA); 
SA.lpSecurityDescriptor = &pSD; 
SA.bInheritHandle = true; 
pSA = &SA; 
... 
FMapping = CreateFileMapping(INVALID_HANDLE_VALUE, pSA, PAGE_READWRITE, 0, 4096, p); 

Mã này tạo ra một bản đồ với quyền truy cập cho tất cả

+0

Tại sao sử dụng biến con trỏ ('pSA') và không chỉ sử dụng địa chỉ' SA'? – Ajay

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