1

私のユーティリティは、ディレクトリから ACL を抽出し、別のディレクトリに追加します。私の問題はこれです -

ACE を反復処理しているときにAceFlags value = 0、継承フラグ (適用先) を持つ ACE の場合、「フォルダー、サブフォルダー、およびディレクトリ」であることがわかりました。同じ ACL を別のディレクトリに適用すると、Windows 7 で正常に動作します。ただし、Windows XP では、継承フラグが「フォルダーのみ」に変更されます。ここにコードがあります -

BOOL SetNonInheritedAceToTarget(LPWSTR pszSource, LPWSTR pszDestination)
{
BOOL bRetVal = FALSE;

DWORD dwRes = 0;
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pacl = NULL;

if( ERROR_SUCCESS == GetNamedSecurityInfo(pszSource, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pacl, NULL, &pSD) )
{
    if(pacl)
    {
        for (USHORT i = 0; i < pacl->AceCount; i++)
        {
            ACCESS_DENIED_ACE * PACE = NULL;

            if (!GetAce(pacl, i,(LPVOID*) &PACE))
                continue;

            if(PACE->Header.AceFlags & INHERIT_ONLY_ACE || PACE->Header.AceFlags & INHERITED_ACE)
            {
                // Delete the ACE
                if(!DeleteAce(pacl, i))
                {
                    TCHAR szErrorMsg[300] = {0};
                    wsprintf(szErrorMsg, L"Unable to delete ACE from DACL of = %ls", pszSource);
                    OutputDebugString(szErrorMsg);
                }
            }
        }
    }
}

if(ERROR_SUCCESS == SetNamedSecurityInfo(pszDestination, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, pacl, NULL))
    bRetVal = TRUE;

return bRetVal;
}

コードをいじっているのか、本当にOS関連の問題なのかはわかりません。ヘルプ!!!。繰り返しますが、OS 関連の問題である場合、AceFlag を手動で割り当てる必要がありますか?

-- ヴァルン

4

2 に答える 2

1

はい、主にIntegrity Level (以前は Integrity Control (IL) と呼ばれていた) の統合により、Vista の登場により ACE は変更されました。コードを Windows 7 および XP で実行する必要がある場合は、これらを手動で処理する必要があります。

于 2012-05-28T16:07:56.403 に答える
0

ああ… ばかげている。INHERIT_ONLY_ACE をチェックして、ACE が継承されていることを確認していました... いずれにせよ、Mox が指摘したように、vista (およびそれ以上) では、Windows ベースのオブジェクトの整合性チェックを強化するために新しい ACE が追加されました。ただし、これは ACE の解釈方法を変更しません。私のコードは問題ありません。余分なフラグをチェックしていました。

私を教育してくれたモックスに感謝します。

-- ヴァルン

于 2012-05-29T11:45:17.227 に答える