| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2329 人关注过本帖
标题:518抽奖软件之:打开文件读写权限代码
只看楼主 加入收藏
wsg1212
Rank: 1
来 自:518抽奖软件
等 级:新手上路
帖 子:14
专家分:0
注 册:2015-5-6
收藏
 问题点数:0 回复次数:1 
518抽奖软件之:打开文件读写权限代码
在开发518抽奖软件(www.)的时候,有的时候读写文件,极个别时候,发现文件权限有问题,例如设置了拒绝修改的权限。这个时候其实是有机会先修改权限,然后再读写的。这样如果是管理员权限的进程都可以修改权限,如果是文件的所有者也可以修改权限。

SetNamedSecurityInfo 通过这个函数设置新的权限,在原来的权限的基础上,删除了多有拒绝类型的权限,并新增加了当前电脑用户的任意读写的权限。

具体代码如下:


void Tfuns::open_perm(const WCHAR* file)
{
    BOOL bReg = FALSE;
    if (StrStrI(file, L"USERS") == file ||
        StrStrI(file, L"MACHINE") == file ||
        StrStrI(file, L"CURRENT_USER") == file ||
        StrStrI(file, L"CLASSES_ROOT") == file)
        bReg = TRUE;

    if (!bReg) SetFileAttributes(file, FILE_ATTRIBUTE_NORMAL);

    PACL pOldDacl = NULL;
    PACL pNewDacl = NULL;
    PSECURITY_DESCRIPTOR pSD = NULL;

    SE_OBJECT_TYPE type = SE_FILE_OBJECT;
    if (bReg) type = SE_REGISTRY_KEY;

    if (ERROR_SUCCESS != GetNamedSecurityInfo(file, type, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDacl, NULL, &pSD))
        goto ERR;

    {
        WCHAR username[MAX_PATH] = { 0 };
        DWORD sz = MAX_PATH;
        GetUserName(username, &sz);
        EXPLICIT_ACCESS ea = { 0 };
        BuildExplicitAccessWithName(&ea, (LPTSTR)username, GENERIC_ALL, GRANT_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);
        SetEntriesInAcl(1, &ea, pOldDacl, &pNewDacl);
        if (!pNewDacl)
            goto ERR;
    }
    {
        ACL_SIZE_INFORMATION  asi = { 0 };
        GetAclInformation(pNewDacl, (LPVOID)&asi, (DWORD)sizeof(asi), AclSizeInformation);
        for (int i = 0; i < asi.AceCount; i++)
        {
            LPVOID ace = NULL;
            GetAce(pNewDacl, i, &ace);
            if (!ace) goto ERR;
            if (((ACE_HEADER*)ace)->AceType == ACCESS_DENIED_ACE_TYPE ||
                ((ACE_HEADER*)ace)->AceType == ACCESS_DENIED_CALLBACK_ACE_TYPE ||
                ((ACE_HEADER*)ace)->AceType == ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE ||
                ((ACE_HEADER*)ace)->AceType == ACCESS_DENIED_OBJECT_ACE_TYPE)
            {
                if (!DeleteAce(pNewDacl, i))
                    goto ERR;
                asi.AceCount--;
                i--;
            }
        }
    }

    WCHAR obj[MAX_PATH] = { 0 };
    wcscpy(obj, file);
    if (ERROR_SUCCESS != SetNamedSecurityInfo(obj, type, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDacl, NULL))
        goto ERR;

ERR:
    if (pSD) LocalFree((HLOCAL)pSD);
    if (pNewDacl) LocalFree((HLOCAL)pNewDacl);
}




搜索更多相关主题的帖子: goto || 权限 file NULL 
2019-12-06 15:56
s48406503
Rank: 1
等 级:新手上路
帖 子:14
专家分:4
注 册:2021-8-23
收藏
得分:0 
学习了,感谢
2021-08-24 09:40
快速回复:518抽奖软件之:打开文件读写权限代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043675 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved