私のプログラムでは、特定のファイルのグループポリシー設定をALL APPLICATION PACKAGES
に設定する必要があります。これを実現するために、私は、ファイルへFilePath
を取り、そのファイル上のALL APPLICATION PACKAGES
グループポリシーを設定し、次の機能を使用しています:異なる言語設定のPCでグループポリシー設定を設定できません
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では、エラーコード1332(0x534)のSetEntiresInAcl
で機能が失敗することが判明しました。 MSDN documentationでは、エラーコードを記述して、エラーERROR_NONE_MAPPED
に対応:
アカウント名とセキュリティIDの間のマッピングは実行されませんでした。
ALL APPLICATION PACKAGES
は言語設定によって多少異なる名前が付けられているため、セキュリティIDが見つからない可能性があります。しかし、私はどのようにこのエラーを修正するのか分からない。ユーザーの言語設定に関係なく機能が確実に機能するように、このエラーを修正する方法を教えてください。
'ALL_APP_PACKAGES'のSIDはS-1-15-2-1です。 https://msdn.microsoft.com/en-us/library/cc980032.aspxを参照してください。 –