以程式的方式操縱NTFS的檔案許可權(上)

2021-08-21 22:45:52 字數 2708 閱讀 1008

以程式的方式操縱ntfs的檔案許可權

陳皓

windows nt/2k/xp版本的作業系統都支援ntfs格式的檔案系統,這是乙個有安全性質的檔案系統,你可以通過windows的資源管理器來設定對每個目錄和檔案的使用者訪問許可權。這裡我就不對ntfs的安全性進行講述了,我預設你對ntfs的檔案目錄的安全設定有了一定的了解。在這裡,我將向你介紹使用windows的api函式來操縱ntfs的檔案許可權。

在windows nt/2k?xp下的物件,不一定是檔案系統,還有其它的一些物件,如:程序、命名管道、印表機、網路共享、或是登錄檔等等,都可以設定使用者訪問許可權。在windows系統中,其是用乙個安全描述符(security descriptors)的結構來儲存其許可權的設定資訊,簡稱為sd,其在windows sdk中的結構名是「security_descriptor」,這是包括了安全設定資訊的結構體。乙個安全描述符包含以下資訊:

dacl和sacl構成了整個訪問控制列表access control list,簡稱acl,acl中的每一項,我們叫做ace(access control entry),acl中的每乙個ace。

我們的程式不用直接維護sd這個結構,這個結構由系統維護。我們只用使用windows 提供的相關的api函式來取得並設定sd中的資訊就行了。不過這些api函式只有windows nt/2k/xp才支援。

安全物件securable object是擁有sd的windows的物件。所有的被命名的windows的物件都是安全物件。一些沒有命名的物件是安全物件,如:程序和執行緒,也有安全描述符sd。在對大多數的建立安全物件的操作中都需要你傳遞乙個sd的引數,如:createfile和createprocess函式。另外,windows還提供了一系列有關安全物件的安全資訊的訪問函式,以供你取得物件上的安全設定,或修改物件上的安全設定。如:getnamedsecurityinfo,setnamedsecurityinfogetsecurityinfo,setsecurityinfo

下圖說明了,安全物件和dacl以及訪問者之間的聯絡(**於msdn)。注意,dacl表中的每個ace的順序是有意義的,如果前面的allow(或denied)ace通過了,那麼,系統就不會檢查後面的ace了。

系統會按照順序依次檢查所有的ace規則,如下面的條件滿足,則退出: 1、

如果乙個access-denied的ace明顯地拒絕了請求者。 2、

如果某access-allowed的ace明顯地同意了請求者。 3、

全部的ace都檢查完了,但是沒有一條ace明顯地允許或是拒絕請求者,那麼系統將使用預設值,拒絕請求者的訪問。

更多的理論和描述,請參看msdn。

#include

void main(void)

這個例子我是從網上找來的,改了改。其中使用到的關鍵的api函式,我都把其加粗了。從程式中我們可以看到,我們先初始化了乙個sd和乙個acl,然後呼叫lookupaccountname取得使用者的sid,然後通過這個sid,對acl中加入乙個有允許訪問許可權的ace,然後再把整個acl設定到sd中。最後,組織檔案安全描述的sa結構,並呼叫createfile建立檔案。如果你的作業系統是ntfs,那麼,你可以看到你建立出來的檔案的安全屬性的樣子:

這個程式旨在說明如何生成乙個新的sd和acl的用法,其有四個地方的不足和不清:

1、對於acl和sid的宣告採用了硬編碼的方式指定其長度。 2、

對於api函式,沒有出錯處理。 3、

沒有說明如何修改已有檔案或目錄的安全設定。 4、

沒有說明安全設定的繼承性。

對於這些我將在下個例程中講述。

在我把這個例程式例出來以前,請允許我多說一下。

1、對於檔案、目錄、命令管道,我們不一定要使用getnamedsecurityinfosetnamedsecurityinfo函式,我們可以使用其專用函式getfilesecuritysetfilesecurity函式來取得或設定檔案物件的sd,以設定其訪問許可權。需要使用這兩個函式並不容易,正如前面我們所說的,我們還需要處理sd引數,要處理sd,就需要處理dacl和ace,以及使用者的相關sid,於是,一系統列的函式就被這兩個函式帶出來了。 2、

對於上乙個例子中的使用硬編碼指定sid的處理方法是。呼叫lookupaccountname函式時,先把sid,domain名的引數傳為空null,於是lookupaccountname會返回使用者的sid的長度和domain名的長度,於是你可以根據這個長度分配記憶體,然後再次呼叫lookupaccountname函式。於是就可以達到到態分配記憶體的效果。對於acl也一樣。 3、

對於給檔案的acl中增加乙個ace條目,一般的做法是先取出檔案上的acl,逐條取出ace,和現需要增加的ace比較,如果有衝突,則刪除已有的ace,把新加的ace添置到最後。這裡的最後,應該是非繼承而來的ace的最後。關於acl繼承,ntfs中,你可以設定檔案和目錄是否繼承於其父目錄的設定。在程式中同樣可以設定。

->

以程式的方式操縱NTFS的檔案許可權

以程式的方式操縱ntfs的檔案許可權 陳皓 windows nt 2k xp 版本的作業系統都支援ntfs格式的檔案系統,這是乙個有 安全 性質的檔案系統,你可以通過windows的資源管理器來設定對每個目錄和檔案的使用者訪問許可權。這裡我就不對ntfs的安全性進行講述了,我預設你對 以程式的方式操...

springboot讀取配置檔案的方式以及亂碼解決

springboot讀取配置檔案的方式有三種 1 使用 value註解的方式進行讀取 2 使用environment讀取 3 使用 configurationproperties註解讀取 4 讀取配置遇到的亂碼 1 使用 value註解的方式進行讀取 value註解方式一 user.name gzh...

讓程式 exe 以系統服務的方式執行

c instsrv.exe 服務的名稱 c srvany.exe 回車 執行登錄檔程式 regedit.exe 建立 hkey local machine system currentcontrolset services 服務的名稱 子項。選 服務的名稱 按右鍵,新建 項 取名 parameter...