一朋友問到的,于是參考了範文慶 《精通Windows API--函數接口程式設計執行個體》 書中的相關文檔,自己整理出一個DEMO,有興趣看看!
/
// Securtiy.cpp
// 設定NTFS檔案使用者組權限
// BY Koma 2010.04.13
#include <windows.h>
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"Advapi32.lib")
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pszCmdLine, int cmdShow)
{
SECURITY_ATTRIBUTES sa; // 和檔案有關的安全結構
SECURITY_DESCRIPTOR sd; // 聲明一個SD
BYTE aclBuffer[1024]; // buffer
PACL pacl = (PACL)&aclBuffer;// 聲明一個ACL,長度是1024
BYTE sidBuffer[100]; // sid buffer
PSID psid = (PSID)&sidBuffer;
// 聲明SID,長度是100
DWORD sidBufferSize = 100;
DWORD domainBufferSize = 80;
char domainBuffer[80];
HANDLE hFile;
SID_NAME_USE snu;
// 初始化SD、初始化ACL
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
InitializeAcl(pacl, 1024, ACL_REVISION);
// 查找使用者Koma,并取該使用者的SID
LookupAccountName(0, "Koma",psid,&sidBufferSize, domainBuffer,&domainBufferSize, &snu);
// 設定該使用者的Access-Allowed的ACE,其權限為All-Access
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;
// 開始建立檔案
hFile = CreateFile("D://Test.txt",0, 0, &sa, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"建立失敗!",NULL,NULL);
return -1;
}
MessageBox(NULL,"建立成功!",NULL,NULL);
CloseHandle(hFile);
return 0;
}