簡體   English   中英

防止其他進程和用戶訪問文件

[英]Prevent other processes and users from accessing a file

我有在計算機上運行的用C#編寫的Windows服務,它創建並使用了許多文件。 有沒有一種方法可以防止計算機上的用戶(包括管理員)從代碼中弄亂這些文件(移動,編輯,重命名,刪除)?

我知道StreamWriter可以實現這一點,但是我不想一直保持打開狀態而無需實際訪問文件中的數據,但是我似乎找不到任何其他方法。

編輯:讓我改一下問題的基礎,不要在下面的評論。 是否可以通過只有我的服務才能訪問文件的方式來設置ACL? 如果只有服務可以訪問文件,我也會接受(我已經在Microsoft Docs中提到了“所有服務”安全組,但是我似乎無法在系統或.net上找到它)。

您可以通過更改訪問權限來做到這一點,但我強烈建議您簡單地將它們保持打開狀態(只要小心,在每次批量寫入后刷新流)。

在第一部分中,我嘗試直接解決您的問題( “如何預防...” ),但是在第二部分中,我嘗試概述另一種方法(使您的應用程序具有彈性:保留備份)。

如何預防...

假設您正在Windows上運行,以避免其他用戶惹上他們,您應該:

  • 設置隱藏屬性。 默認情況下,隱藏文件是隱藏的,許多用戶甚至看不到它們。 如果您可以在目錄級別執行此操作,那就更好了。

  • 更改ACL以拒絕對“ UsersAdministrators組的Full access 如果您選擇並保留Read權限,那就更好了。 默認情況下,Windows選擇最嚴格的策略,即使一個用戶屬於兩個組,這也會有效地阻止所有人寫入該文件(如果您還拒絕“ Read權限,那么他們甚至將無法看到其內容,但稍后再查看) )。

  • 與一個用戶創建一個特殊的組(具有所需的權限,並且只有那些權限)。 確保該用戶沒有自動添加到“ Users組中。
  • 更改應用程序以在編寫這些文件時模擬該用戶。 如果您保留了“ Read權限,則讀取代碼不會受到影響。

不要忘記檢查Windows的不同版本和版本( HomeUsers在我的腦海中不斷跳動。)如果您的應用程序是Windows Service,那么事情可能會稍微容易一些,請參閱eryksun的評論

您可以使用Windows資源管理器簡單地進行所有這些試驗,找到適當的平衡,但是不要忘記每個安裝都是一個不同的世界,只有上帝知道環境是什么(但他不知道為什么)。

幾個明顯的缺點:

  • 管理員可以始終執行自己想要的操作,然后他們可以找到這些文件並還原權限。 我認為(我不確定)系統安裝程序具有某些特殊特權來防止這種情況,但是我不確定(而且我無法想象如何做到)。
  • 安裝變得更加復雜(如果沒有,您將需要一個)。 您可以在首次執行應用程序時執行此操作,但是隨后您將需要管理特權(僅一次,但可能更糟)。
  • 您的代碼更加復雜。
  • 進行更多的設置意味着可能會出現更多的錯誤,請與您的技術支持團隊共同努力。
  • 更新(和技術支持工作)將更加復雜。
  • 具有某些特權的用戶不會受到影響(請參閱另一條評論 ),但這確實是一件好事,您不應該全力規避它。

備份是關鍵!

不要忘記,如果他們真的想破壞您的應用程序,那么他們只會刪除應用程序目錄...

我認為,但我不知道您的特定用例,也許您是從錯誤的角度來解決問題。 如果要防止用戶(有意或無意)破壞數據文件,則需要BACKUP 每次編寫副本時,請將副本保存在其他位置,將其標記為隱藏並過得愉快。 如果它們不是太大,您甚至可以直接在Windows Registry中保存內容。 對於加密/散列/校驗和文件,您的應用程序可以輕松檢測出它們何時損壞或丟失:只需還原備份就可以了。

我不想一直打開文件

但是保持開放是密切遵循您的意圖和要求的好方法。

只要不超過數百個,這似乎是最佳選擇。

另一種方法是設置安全屬性(ACL),但這很麻煩,並且需要更高的特權。

排除管理員是不可能的,您不應該這么做。 避免意外刪除或重命名是可行的,但不能完全控制。

2其他選項是

  • 在文件所在的位置設置一些權限,以便沒有人可以訪問它們

  • 如果所有有問題的文件都將由您的應用程序創建,則可以檢查CreateFile中的選項,可以在其中將共享選項設置為0x00000000以“防止其他進程在請求刪除,讀取或刪除其他文件或設備時打開它們。寫訪問權限。”

如果您想使用CreateFile我想您將必須對其進行鎖定

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM