Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将ACL从c++;? 如何从C++中改变ACL?< /P> 可以帮助我做任何下面的C++而没有任何确认: cacls c:\personal\file.txt /d everyone_C++_Windows_File Permissions - Fatal编程技术网

如何将ACL从c++;? 如何从C++中改变ACL?< /P> 可以帮助我做任何下面的C++而没有任何确认: cacls c:\personal\file.txt /d everyone

如何将ACL从c++;? 如何从C++中改变ACL?< /P> 可以帮助我做任何下面的C++而没有任何确认: cacls c:\personal\file.txt /d everyone,c++,windows,file-permissions,C++,Windows,File Permissions,我想你是说在Windows系统上?您需要使用Win32 API的NTFS部分,这正是cacls所使用的。浏览MSDN,它会在那里的某个地方。例如如果您不想弄乱API(即SetNamedSecurityInfo),您可以像这样绕过提示: echo y|cacls filename /d everyone 由于echo是内置的,要从程序中调用该命令行,您可能必须运行: cmd.exe /c echo y|cacls filename /d everyone 使用以下代码 #include <

我想你是说在Windows系统上?您需要使用Win32 API的NTFS部分,这正是cacls所使用的。浏览MSDN,它会在那里的某个地方。例如

如果您不想弄乱API(即SetNamedSecurityInfo),您可以像这样绕过提示:

echo y|cacls filename /d everyone
由于echo是内置的,要从程序中调用该命令行,您可能必须运行:

cmd.exe /c echo y|cacls filename /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.
    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);
}
#包括
#包括
void SetFilePermission(LPCTSTR文件名)
{
PSID pEveryoneSID=NULL;
PACL PACL=NULL;
显式访问ea[1];
SID\u IDENTIFIER\u AUTHORITY SIDAuthWorld=SECURITY\u WORLD\u SID\u AUTHORITY;
//为Everyone组创建一个已知的SID。
AllocateAndInitializeSid(&SIDAuthWorld,1,
安全,世界,,
0, 0, 0, 0, 0, 0, 0,
&白蜡虫;
//初始化ACE的显式访问结构。
零内存(&ea,1*sizeof(显式访问));
ea[0]。grfAccessPermissions=0xFFFFFFFF;
ea[0]。grfAccessMode=DENY_访问;
ea[0]。grfInheritance=NO_继承;
ea[0].Trustee.TrusteeForm=Trustee\u是\u SID;
ea[0].Trustee.TrusteeType=Trustee\u是\u众所周知的\u组;
ea[0].Trustee.ptstrName=(LPTSTR)pEveryoneSID;
//创建包含新ACE的新ACL。
setEntriesAcl(1、ea、NULL和pACL);
//初始化安全描述符。
PSECURITY_描述符pSD=(PSECURITY_描述符)LocalAlloc(LPTR,
安全描述符(最小长度);
初始化安全描述符(pSD,安全描述符修订版);
//将ACL添加到安全描述符。
设置安全性脚本或ACL(pSD,
TRUE,//bDaclPresent标志
pACL,
FALSE);//不是默认的DACL
//更改安全属性
SetFileSecurity(文件名、DACL\u安全信息、pSD);
if(pEveryoneSID)
自由体;
国际单项体育联合会(pACL)
本地免费(pACL);
中频(pSD)
本地自由(pSD);
}

请注意:此代码来自MSDN文章“”。注释中说“ACE将允许对密钥进行读取访问”,但grfAccessPermissions定义了权限,因此将其设置为0xFFFFFF将提供一切。@RobertBasler我删除了矛盾的代码注释。