Yang.99 2024-03-18 14:57 采纳率: 33.3%
浏览 5

SetNamedSecurityInfo error code 0

                                WCHAR pszObjName[100] = L"C:\\Program Files\\test";
                                DWORD dwRes = 0;
                                PACL pOldDACL = NULL, pNewDACL = NULL;
                                PSECURITY_DESCRIPTOR pSD = NULL;
                                EXPLICIT_ACCESS ea;
                                // 获取文件夹的安全描述符
                                dwRes = GetNamedSecurityInfo(pszObjName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDACL, NULL, &pSD);
                                if (dwRes != ERROR_SUCCESS)
                                {
                                    MessageBox(NULL, L"获取安全描述符失败", L"FAILDE", MB_OK);
                                    //goto Cleanup;
                                }
                                else
                                {
                                    MessageBox(NULL, L"获取安全描述符成功", L"SUCCESS", MB_OK);
                                }

                                // 修改访问权限
                                WCHAR userName[MAX_PATH] = { 0 };
                                ULONG size = MAX_PATH;
                                GetUserName(userName, &size);
                                MessageBox(NULL, userName, L"用户名", MB_OK);
                                ZeroMemory(&ea, sizeof(EXPLICIT_ACCESSW));
                                ea.grfAccessPermissions = DELETE| WRITE_DAC| WRITE_OWNER;
                                ea.grfAccessMode = GRANT_ACCESS;
                                ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
                                ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
                                ea.Trustee.ptstrName = userName;

                                dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);
                                if (dwRes != ERROR_SUCCESS)
                                {
                                    MessageBox(NULL, L"设置访问权限失败", L"FAILED", MB_OK);
                                    //goto Cleanup;
                                }
                                else
                                {
                                    MessageBox(NULL, L"设置访问权限成功", L"SUCCESS", MB_OK);
                                }

                                // 更新文件夹的安全描述符
                                dwRes = SetNamedSecurityInfo((LPWSTR)pszObjName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDACL, NULL);
                                if (dwRes != ERROR_SUCCESS)
                                {
                                    MessageBox(NULL, to_wstring(GetLastError()).c_str(), L"更新安全描述符失败", MB_OK);
                                    //goto Cleanup;
                                }
                                else
                                {
                                    MessageBox(NULL, L"文件夹访问权限已修改成功!", L"SUCCESS", MB_OK);
                                }

                                // 释放资源
                                if (pSD != NULL)
                                    LocalFree((HLOCAL)pSD);
                                if (pNewDACL != NULL)
                                    LocalFree((HLOCAL)pNewDACL);

我想给test文件夹增加写入和修改的权限,但是SetNamedSecurityInfo这个函数会失败,获取到的错误码是0,这是为什么啊?需要管理员权限允许吗?

  • 写回答

3条回答 默认 最新

  • 关注

    Yang.99 下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    SetNamedSecurityInfo 函数返回的错误代码为0表示操作成功,而不是错误码。因此,这并不是一个错误。但是,在你的代码中,有一些问题可能会导致你的权限修改操作失败。

    首先,你需要以管理员权限运行你的程序,否则你将无法修改系统文件夹的权限。可以通过右键点击你的程序并选择“以管理员身份运行”来运行。

    其次,你需要确保已经正确设置了要修改权限的文件夹路径。在你的代码中,文件夹路径为"C:\Program Files\test",但是这可能并不是你真实要修改权限的文件夹路径。请确保文件夹路径是正确的。

    另外,你在获取用户名称时使用了 GetUserName 函数,但是它返回的是当前登录用户的用户名,不一定是管理员。因此,在修改权限时,你需要使用具有管理员权限的用户的用户名。

    以下是解决方案:

    1. 以管理员权限运行程序。
    2. 确保要修改权限的文件夹路径是正确的。
    3. 获取具有管理员权限的用户的用户名,可以通过以下方式获取:
    WCHAR adminUserName[MAX_PATH] = { 0 };
    ULONG size = MAX_PATH;
    GetUserName(adminUserName, &size);
    wcscat(adminUserName, L"\\Administrator");
    
    1. 将获取的管理员用户名修改为 TRUSTEE_IS_SID 形式,以便在 SetEntriesInAcl 函数中使用。
    WCHAR adminSID[MAX_PATH] = { 0 };
    DWORD sidSize = MAX_PATH;
    SID_IDENTIFIER_AUTHORITY sidAuth = SECURITY_NT_AUTHORITY;
    AllocateAndInitializeSid(&sidAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &adminSID);
    
    1. 将修改权限的参数修改为具有管理员权限的用户的用户名:
    ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
    ea.Trustee.ptstrName = adminSID;
    
    1. 然后进行权限修改操作,并检查返回的错误码是否为 ERROR_SUCCESS。

    请注意,这个解决方案假设你有对文件夹的管理员访问权限。如果你没有这些权限,你需要获取管理员权限或者与具有权限的用户建立连接来进行修改。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月18日

悬赏问题

  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价