以程式的方式操縱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,setnamedsecurityinfo,getsecurityinfo,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、 對於檔案、目錄、命令管道,我們不一定要使用getnamedsecurityinfo和setnamedsecurityinfo函式,我們可以使用其專用函式getfilesecurity和setfilesecurity函式來取得或設定檔案物件的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...