2013-12-18 31 views
0

更新:我最初發布的「in」目錄位於C:上。它實際上在E:上。 D:和E:是RAID上的卷。我不會期望有所作爲,但如果我知道發生了什麼,我就不必提問了。由HTTP處理程序創建的目錄權限,由用戶訪問

我遇到一個必須由Web服務和本地用戶控制的目錄的ACL權限問題。這是我的第一個涉及目錄安全和ACL的項目,所以我擔心我正在考慮全部錯誤。我願意提供一個解決方案的答案,以及那些能夠提出對我的安全模型進行全面改革的答案。

我正在從Windows Server 2012 R2 Web服務工作,該服務從多個用戶(節點)捕獲數據,然後對其進行處理。我有每個節點目錄(例如E:\ in \ node1,E:\ in \ node2等)來保存傳入數據,然後我使用一個C#控制檯應用程序作爲非管理本地用戶(LocalUser )將文件移動到更大的卷,並使用更深層的目錄結構來反映控制檯應用程序所做的分類。

最初,我將創建每個節點的目錄作爲LocalUser,但爲了可管理性,我做了一個Web服務(POST Handler)來創建節點目錄,因爲每個節點都被調配和配置。

我現在有一個文件系統,其中一些目錄由LocalUser創建,一些由DefaultAppPool通過Web服務創建。兩種類型的目錄都按預期接收文件。當我以LocalUser身份運行我的控制檯應用程序時,對於LocalUser創建的目錄,一切正常,但是當我嘗試將File.Move()從Web創建的Node目錄設置爲Web創建的Classification目錄時,我得到UnauthorizedAccessException。當我查看ACL時,發現問題在於Creator(和完全控制帳戶)與運行控制檯應用程序的帳戶不同。另外,ACL頁面說E:\ in \ node2從E:,而不是E:\ in繼承。

Web供應的關鍵在於自動化系統,所以我不希望觸及所有新目錄以添加LocalUser(或包含LocalUser的組)。我還希望系統在其他經過身份驗證的用戶嘗試運行控制檯應用程序(例如,從未在任何地方創建任何目錄的LocalUser2)時工作。

看來,我必須解決這個問題的兩個機會是1)Web服務創建目錄時,或2)LocalUser運行腳本時。不幸的是,我擔心這兩個賬戶(DefaultAppPool,LocalUser)都沒有權限授予(情況1))或者獲取(情況2))完全控制有問題的目錄。最終,我計劃從Web服務運行控制檯應用程序,並且這將使所有內容運行爲DefaultAppPool,但是在開發過程中以及作爲手動維護操作,我希望能夠在控制檯上運行控制檯應用程序作爲LocalUser或LocalUser2的需求。我認爲在運行控制檯應用程序時可以創建一些模擬DefaultAppPool的「填充程序」,但據我所知,做這種模擬的唯一方法是讓Web服務執行此操作。

總之,我怎麼能有一個系統,其中Web服務創建的目錄,然後可以由用戶在一個特定的組中控制?

回答

0

這就是我所理解你的問題:

  • 你有,如果在這些目錄需要和存儲數據的文件創建目錄的默認應用運行的web服務
  • 你必須運行一個控制檯應用程序本地用戶處理目錄中的數據並將結果存儲在不同的捲上
  • 您打算讓Web服務也運行控制檯應用程序,這意味着它將使用與AppPool相同的身份訪問文件系統
  • 個某些節點目錄已經由本地用戶通過web服務創建的,別人
  • 您的控制檯應用程序不能訪問由web服務

建立在你的問題你列舉的例子節點目錄節點目錄中的文件* c:\ in \ node1 *,* c:\ in \ node2 *等。目錄* c:\ in *將是所有節點目錄的父目錄。權限通常會自動繼承。在* c:\ in *中創建的節點目錄應該從* c:\ in *中繼承權限。

Web服務是否手動設置它創建的節點目錄的訪問權限?

如果是這樣,這是必要的嗎?如果您爲c:\ in \設置權限,例如IIS APPPOOL \ DefaultAppPool和組用戶已完全控制在c:\ in \中創建的所有目錄都可以自動繼承這些權限,從而將您從此問題。 (所有的本地用戶,據我所知是自動進行的該組的成員用戶

如果Web服務必須手動設置訪問權限,如何添加所需的權限的組用戶當節點目錄是新創建的?通過這種方式,控制檯應用程序將能夠訪問該目錄,而不管誰啓動它。

webservice/console應用程序是否需要每個目錄的「完全控制」?我理解你的問題的方式權限修改,閱讀,列表文件夾內容應該就夠了。也許我錯過了一些東西......

如果您需要限制對某些用戶的訪問,則只能創建一個新的安全組,並且只允許該組訪問節點目錄樹。然後可以將需要訪問的本地用戶添加到該組。 Web服務的應用程序池標識也需要成爲該組的成員。在這種情況下,添加僅用於Web服務的新應用程序池可能會很有用。無論您更改此應用程序池的身份是一個選擇問題。

+0

謝謝你,你已經重申了這個問題。 – verbamour

+0

我將編輯該問題以添加更多細節。當我說目錄根目錄是c:\ in時,我過度簡化了,它實際上是在e:上。當我查看ACL時,它們從e:\繼承,而不是e:\ in。那是意想不到的。一旦我確定我正在查看最新的代碼,我會發布製作目錄的代碼片段。我還將對父目錄的當前ACL進行另一次檢查,然後再次嘗試查看是否可以使用適當的繼承創建一個目錄。 – verbamour

+0

您已經寫過卷D:和E:位於RAID上。它們是否在外部存儲系統上,可能不是Windows系統?我問,因爲外部系統可能會負責設置和繼承實際的訪問權限。 Windows服務器會以預期的方式感知權限的模擬。如果是這種情況,可能需要仔細研究存儲系統如何處理訪問權限。 – roadkill

0

OK,這裏的交易:

File.Move()需要寫入權限目的地和DeleteSubdirectoriesAndFiles的來源。這是一個高級許可,所以你必須爲此付出一點努力(感謝http://www.codeproject.com/Questions/181198/File-I-O-permissions-the-C-way,其中參考File handling with non-administrative user來確定要求)。

  1. 選擇有問題的父目錄(最好不帶 子目錄,作爲應用的權限遞歸可能會失敗,並 需要對您單擊「繼續」很多)。
  2. 右擊 - > [菜單]屬性 - > [Tab]鍵安全 - > [按鈕]高級
  3. 這帶來了 '高級安全設置[目錄]'
  4. 添加或選擇所需的主體(」用戶'在我的情況)。
  5. [按鈕]編輯
  6. 這帶來了
  7. [藍文本]「的[目錄]的權限項目」顯示高級權限
  8. 選中「刪除子文件夾和文件」框中。
  9. (驗證您要讀取和寫入的屬性可能是一個很好的 想法)
  10. 單擊應用和/或確定,直到所有窗口消失。

然後這被程序創建的子目錄繼承,每個人都得到蛋糕。

感謝@roadkill讓我走上正軌,我在CodeProject.com上找到了第一個解決方案的lukeer,以及使用了StackOverflow解決方案lukeer的@Powerlord。

相關問題