2016-01-18 149 views
0

我試圖在兩個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會話中的測試環境中運行的,則完全相同的行會成功。

合乎邏輯的解決方案是將用於CreateNamedPipeASECURITY_ATTRIBUTES中的DACL設置爲SECURITY_WORLD_SID_AUTHORITY, KEY_ALL_ACCESS(S-1-1-0)。這並沒有解決問題。

「每個人都可以做任何事情」的唯一安全降級將是「沒有任何安全性」。我需要做什麼CreateNamedPipe以便CreateFileA從來沒有失敗與訪問被拒絕?

安全性在這裏是非常不相干的。 PIPE_TYPE_MESSAGEpipeChunkSize已經意味着服務器可以防止非法客戶端發生緩衝區溢出。

回答

1

當我想任何人都可以訪問的管道(例如,它的託管的服務,我無法預測什麼帳號將需要它),我添加了一個NULL-DACL SD:

static SECURITY_ATTRIBUTES g_sa = {0}; 

g_sa.nLength = sizeof(g_sa); 
g_hsa = GlobalAlloc (GHND,SECURITY_DESCRIPTOR_MIN_LENGTH); 
g_sa.lpSecurityDescriptor = GlobalLock(g_hsa); 
g_sa.bInheritHandle = TRUE; 

if (InitializeSecurityDescriptor (g_sa.lpSecurityDescriptor, 1)) 
{ 
    if (SetSecurityDescriptorDacl (g_sa.lpSecurityDescriptor, TRUE,NULL,FALSE)) 
    { 
     DebugMessage ("security descriptor DACL set OK\n"); 

其中& g_sa被添加爲CreateNamedPipe的參數。當然,這是一個吹噓門禁區域,但如果你想任何人能夠訪問它,你沒有太多的選擇。