【问题标题】:Can't set group policy settings on PC's with different language settings无法在具有不同语言设置的 PC 上设置组策略设置
【发布时间】:2016-05-11 04:19:54
【问题描述】:

在我的程序中,我必须将某些文件的组策略设置设置为ALL APPLICATION PACKAGES。为此,我使用了以下函数,它将FilePath 放入一个文件并在该文件上设置ALL APPLICATION PACKAGES 组策略:

DWORD AdjustGroupPolicy(std::wstring wstrFilePath)
{
    PACL pOldDACL = NULL, pNewDACL = NULL;
    PSECURITY_DESCRIPTOR pSD = NULL;
    EXPLICIT_ACCESS eaAccess;
    SECURITY_INFORMATION siInfo = DACL_SECURITY_INFORMATION;
    DWORD dwResult = ERROR_SUCCESS;

    dwResult = GetNamedSecurityInfo(wstrFilePath.c_str(), SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDACL, NULL, &pSD);
    if (dwResult != ERROR_SUCCESS)
    {
        if (pSD != NULL)
            LocalFree((HLOCAL)pSD);
    }

    ZeroMemory(&eaAccess, sizeof(EXPLICIT_ACCESS));
    eaAccess.grfAccessPermissions = GENERIC_READ | GENERIC_EXECUTE;
    eaAccess.grfAccessMode = SET_ACCESS;
    eaAccess.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
    eaAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
    eaAccess.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
    eaAccess.Trustee.ptstrName = L"ALL APPLICATION PACKAGES";

    dwResult = SetEntriesInAcl(1, &eaAccess, pOldDACL, &pNewDACL);
    if (ERROR_SUCCESS != dwResult)
    {
        if (pSD != NULL)
            LocalFree((HLOCAL)pSD);
        if (pNewDACL != NULL)
            LocalFree((HLOCAL)pNewDACL);
    }

    dwResult = SetNamedSecurityInfo((LPWSTR)wstrFilePath.c_str(), SE_FILE_OBJECT, siInfo, NULL, NULL, pNewDACL, NULL);
    if (ERROR_SUCCESS != dwResult)
    {
        if (pSD != NULL)
            LocalFree((HLOCAL)pSD);
        if (pNewDACL != NULL)
            LocalFree((HLOCAL)pNewDACL);
    }

    return dwResult;
}

问题是,一些用户报告此功能由于某种原因而失败。在深入研究了这个问题后,我发现在具有英语以外的语言设置的 PC 上,该功能在 SetEntiresInAcl 处失败,错误代码为 1332 (0x534)。在MSDN documentation中,错误码对应错误ERROR_NONE_MAPPED,说明如下:

帐户名称和安全 ID 之间没有映射。

我的猜测是引发了错误,因为 ALL APPLICATION PACKAGES 的名称因语言设置而异,因此 Windows 找不到它的安全 ID;但是,我不确定如何解决此错误。无论用户的语言设置如何,我如何才能修复此错误,以便该功能可靠地工作?

【问题讨论】:

标签: c++ windows group-policy


【解决方案1】:

我对 Windows 中的访问控制策略相对较新,在我当前的项目之前从未处理过它。我吸取了教训,我不应该按名称设置受托人,因为您不能依赖名称在整个系统中都相同,即使它是一个知名组。

我最终通过在函数中添加以下代码来修复它:

PSID pSID;
ConvertStringSidToSid(L"S-1-15-2-1", &pSID); // S-1-15-2 is the SID for ALL_APP_PACKAGES

后来当我设置受托人信息时,我将代码更改为:

eaAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
eaAccess.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
eaAccess.Trustee.ptstrName = (LPTSTR)pSID;

ConvertStringSidToSid 采用字符串格式的 SID 并返回指向相应 SID 结构的指针。然后我可以使用该 SID 而不是使用它的名称,这样可以避免我之前遇到的翻译问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多