我試圖在兩個Windows進程之間創建一個命名管道。服務器進程在UI會話中以普通帳戶運行。客戶端進程在未知的安全上下文中運行,顯然相當受限制。如何關閉命名管道安全?
起初我叫
pipe = CreateNamedPipeA(MY_PIPE_NAME, PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, maxClients,
pipeChunkSize, pipeChunkSize, 0, nullptr);
即假期通行證沒有SECURITY_ATTRIBUTES
。通常,這是有效的 - 沒有安全意味着沒有安全。顯然,這不再是命名點的情況。來電者試過
CreateFileA(MY_PIPE_NAME, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
並得到一個GetLastError=5
,拒絕訪問。測試表明,這是由於安全失敗;如果客戶端可執行文件是在與服務器相同的UI會話中的測試環境中運行的,則完全相同的行會成功。
合乎邏輯的解決方案是將用於CreateNamedPipeA
的SECURITY_ATTRIBUTES
中的DACL設置爲SECURITY_WORLD_SID_AUTHORITY, KEY_ALL_ACCESS
(S-1-1-0)。這並沒有解決問題。
「每個人都可以做任何事情」的唯一安全降級將是「沒有任何安全性」。我需要做什麼CreateNamedPipe
以便CreateFileA
從來沒有失敗與訪問被拒絕?
安全性在這裏是非常不相干的。 PIPE_TYPE_MESSAGE
和pipeChunkSize
已經意味着服務器可以防止非法客戶端發生緩衝區溢出。