GetEffectiveRightsFromAcl抛出无效的acl错误

时间:2010-06-18 14:30:28

标签: c# winapi interop file-permissions

我正在尝试使用C#中的interop获取用户对文件的有效权限。以下是我正在使用的代码:

        public static FileSystemRights GetFileEffectiveRights(string FileName, string UserName)
    {
        IntPtr pDacl, pZero = IntPtr.Zero;
        int Mask = 0;
        uint errorReturn = GetNamedSecurityInfo(FileName, SE_OBJECT_TYPE.SE_FILE_OBJECT, SECURITY_INFORMATION.Dacl
            , out pZero, out pZero, out pDacl, out pZero, out pZero);
        if (errorReturn != 0)
        {
            throw new Exception("Win error : " + errorReturn);
        }
        Program.TRUSTEE pTrustee = new TRUSTEE();
        pTrustee.pMultipleTrustee = IntPtr.Zero;
        pTrustee.MultipleTrusteeOperation = (int)Program.MULTIPLE_TRUSTEE_OPERATION.NO_MULTIPLE_TRUSTEE;
        pTrustee.ptstrName = UserName;
        pTrustee.TrusteeForm = (int)Program.TRUSTEE_FORM.TRUSTEE_IS_NAME;
        pTrustee.TrusteeType = (int)Program.TRUSTEE_TYPE.TRUSTEE_IS_USER;
        errorReturn = GetEffectiveRightsFromAcl(pDacl, ref pTrustee, ref Mask);
        if (errorReturn != 0)
        {
            throw new Exception("Win error : " + errorReturn);
        }
        return (FileSystemRights)Mask;
    }

此代码正常工作,直到我开始使用类FileAccessRule和FileInfo修改ACL结构,然后我开始得到Windows错误1336:ERROR_INVALID_ACL。如果我调试进程,情况也是如此:我调用GetFileEffectiveRights一次,暂停进程,通过Windows API更改ACL,然后重新启动并再次调用GetFileEffectiveRights(第一次调用成功但第二次调用1336.)
出了什么问题?
PS:我正在使用VS 2008和.NET 3.5在Windows 7上进行开发 编辑:当我尝试获取通过Windows GUI / C#的File API添加了非继承ACE的文件的权限时,我只收到错误。

1 个答案:

答案 0 :(得分:2)

问题出在问题的另一部分,即通过Windows API更改ACL。

DACL中ACE的顺序非常重要。例如,在http://support.microsoft.com/kb/269175/en中,您将找到有关正确ACE顺序和代码示例的完整说明。

如果您仍然遇到同样的问题,请在您的问题中发布修改ACL的代码示例。