2008-12-04 81 views
1

我有一個C++服務,提供了一個名爲管道客戶提供一個NULL SECURITY_ATTRIBUTES如下:的Web服務無法打開命名管道 - 訪問被拒絕

hPipe = CreateNamedPipe(lpszPipename, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE, 0, NULL);

有一種使用一個dll這個管道來獲得服務。

有一個使用dll的c#GUI,工作正常。

有一個.net網站也使用此DLL(同一個確切的同一臺PC上),但總是得到拒絕的權限當它試圖打開管道。

任何人都知道爲什麼會發生這種情況,以及如何解決它?

也沒有人知道SECURITY_ATTRIBUTES一個很好的教程,因爲我還沒有理解MSDN信息呢。

感謝, 帕特里克

回答

2

命名管道(你有一個空的安全描述信息)補助金只寫本地系統,管理員權限,而對於管道的所有者/創建者默認的ACL。除非您的Web應用程序正在其中一個帳戶下運行(默認情況下它不會),否則您將無法獲得寫入權限。 (我假設你要求的讀/寫。)

有幾個選項...

  1. 具有相同的帳戶下運行,以創建該服務的Web應用程序管。

  2. 將Web應用程序配置爲使用模擬,可以通過在web.config中指定具有寫權限的特定用戶,或將其設置爲使用由IIS傳入的用戶(以及從具有寫入權限的用戶帳戶訪問應用程序訪問)。

  3. 手動模擬與的管接入持續時間的寫訪問的用戶(例如,與WindowsIdentity.Impersonate)。

  4. 在向Everyone授予寫入訪問權的管道上(或運行應用程序的特定帳戶,儘管設置起來會更復雜),在管道上使用非默認安全描述符。

有一個創建簡單安全描述符here的示例;你應該能夠修改它以適應你的需求。

2

入住的那種對ASP.NET網站使用驗證,並在該網站的web.config文件中的模擬設置。很有可能,ASP.NET代碼運行在不允許在您的機器上創建命名管道的帳戶下。

您可能能夠通過授予更多的權限來使用該賬戶由ASP.NET應用程序來解決這個問題,或者通過配置Web應用程序使用不同的(更高特權)帳戶。話雖如此,你真的希望你的網站的遠程訪問者能夠創建命名管道嗎?我不會講你,我想你已經想過了。

對我所見過的SECURITY_ATTRIBUTES來說,最平易近人,最徹底的描述就是由Keith Brown編寫的這本書...... http://www.amazon.co.uk/gp/product/0201604426

+0

哦,隨意講課。爲了澄清,Web服務不是創建管道,而是調用一個dll函數,該函數打開已由windows服務創建的管道。我認爲這將是安全的? – Patrick 2008-12-04 12:24:21

2

添加行:

<身份冒充= 「真」/>

到<的System.Web> web.config文件的部分允許訪問該管。我不會建議其他人使用它,因爲我不確定安全含義,但它現在適合我們的要求。

感謝Eric和Martin爲我指出了正確的方向。