2016-05-11 16 views
2

私のプログラムでは、特定のファイルのグループポリシー設定を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が見つからない可能性があります。しかし、私はどのようにこのエラーを修正するのか分からない。ユーザーの言語設定に関係なく機能が確実に機能するように、このエラーを修正する方法を教えてください。

+1

'ALL_APP_PACKAGES'のSIDはS-1-15-2-1です。 https://msdn.microsoft.com/en-us/library/cc980032.aspxを参照してください。 –

答えて

0

私は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文字列を取り-format SIDを返し、対応するSID構造体へのポインタを返します。私はそれを使用する代わりにそのSIDを使用することができます。これにより、私が以前に持っていた翻訳の問題を回避できます。

関連する問題