如何从c ++更改ACL?
任何人都可以帮助我做下面的从C ++没有任何确认:
cacls c:\personal\file.txt /d everyone
使用下面的代码
#include <Accctrl.h> #include <Aclapi.h> void SetFilePermission(LPCTSTR FileName) { PSID pEveryoneSID = NULL; PACL pACL = NULL; EXPLICIT_ACCESS ea[1]; SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; // Create a well-known SID for the Everyone group. AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID); // Initialize an EXPLICIT_ACCESS structure for an ACE. // The ACE will allow Everyone read access to the key. ZeroMemory(&ea, 1 * sizeof(EXPLICIT_ACCESS)); ea[0].grfAccessPermissions = 0xFFFFFFFF; ea[0].grfAccessMode = DENY_ACCESS; ea[0].grfInheritance= NO_INHERITANCE; ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID; ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID; // Create a new ACL that contains the new ACEs. SetEntriesInAcl(1, ea, NULL, &pACL); // Initialize a security descriptor. PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); InitializeSecurityDescriptor(pSD,SECURITY_DESCRIPTOR_REVISION); // Add the ACL to the security descriptor. SetSecurityDescriptorDacl(pSD, TRUE, // bDaclPresent flag pACL, FALSE); // not a default DACL //Change the security attributes SetFileSecurity(FileName, DACL_SECURITY_INFORMATION, pSD); if (pEveryoneSID) FreeSid(pEveryoneSID); if (pACL) LocalFree(pACL); if (pSD) LocalFree(pSD); }
我假设你的意思是在Windows系统上? 您需要使用Win32 API的NTFS部分,这是cacls使用的部分。 浏览MSDN,它会在那里。 例如SetSecurityInfo
如果你不想搞乱API(比如SetNamedSecurityInfo),你可能可以绕过这样的提示:
echo y|cacls filename /d everyone
由于echo是一个内置的,所以要从你的程序中调用这个命令行,你可能需要运行:
cmd.exe /c echo y|cacls filename /d everyone