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

2021-06-22 02:11:41 字數 4069 閱讀 1453

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

以程式的方式操縱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 <windows.h>

void main(void)

security_attributes sa;   //和檔案有關的安全結構

security_descriptor sd;   //宣告乙個sd

byte aclbuffer[1024];

pacl pacl=(pacl)&aclbuffer;  //宣告乙個acl,長度是1024

byte sidbuffer[100];

psid psid=(psid) &sidbuffer;   //宣告乙個sid,長度是100

dword sidbuffersize = 100;

char domainbuffer[80];

dword domainbuffersize = 80;

sid_name_use snu;

handle file;

//初始化乙個sd

initializesecuritydescriptor(&sd, security_descriptor_revision);

//初始化乙個acl

initializeacl(pacl, 1024, acl_revision);

//查詢乙個使用者hchen,並取該使用者的sid

lookupaccountname(0, "hchen", psid,

&sidbuffersize, domainbuffer,

&domainbuffersize, &snu);

//設定該使用者的access-allowed的ace,其許可權為「所有許可權」

addaccessallowedace(pacl, acl_revision, generic_all, psid);

//把acl設定到sd中

setsecuritydescriptordacl(&sd, true, pacl, false);

//把sd放到檔案安全結構sa中

sa.nlength = sizeof(security_attributes);

sa.binherithandle = false;

sa.lpsecuritydescriptor = &sd;

//建立檔案

file = createfile("c:\\testfile",

0, 0, &sa, create_new, file_attribute_normal, 0);

closehandle(file);

這個例子我是從網上找來的,改了改。其中使用到的關鍵的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的安全性進行講述了,我預設你對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...