私のユーティリティは、ディレクトリから 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 を手動で割り当てる必要がありますか?
-- ヴァルン