【发布时间】: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;但是,我不确定如何解决此错误。无论用户的语言设置如何,我如何才能修复此错误,以便该功能可靠地工作?
【问题讨论】:
-
ALL_APP_PACKAGES的 SID 是 S-1-15-2-1。见msdn.microsoft.com/en-us/library/cc980032.aspx
标签: c++ windows group-policy