使用GetEffectiveRightsFromAcl()获取访问权限..?

时间:2008-12-12 20:48:10

标签: c winapi

我正在尝试检查特定文件的特定文件的权限 受托人和我正在使用win32 API GetEffectiveRightsFromAcl()。什么时候 该文件可由域组访问,该功能 当本地帐户(admin或其他)时,返回5(拒绝访问) 用于执行该功能。

这三个陈述总结了我所看到的行为 GetEffectiveRightsFromAcl():

  • 当域组拥有该文件的权限并且该程序在a下运行时 本地帐户:访问被拒绝。
  • 当域组拥有该文件的权限并且程序运行时 在域帐户或本地系统下:成功
  • 当域组没有该文件的权限时 程序在任何帐户下运行:成功

有谁知道这背后的原因?它看起来像我这样 与Active Directory安全性相关。什么设置可能会影响这个 什么是调试这个的好方法?

另外,我听说GetEffectiveRightsFromAcl()可能通常有问题并且使用AccessCheck()代替。但是我需要能够获取任意SID并检查它对文件的访问权限,因为AccessCheck()需要模拟令牌,我不知道如何从任意SID中获取令牌......任何想法?感谢

鲍勃

2 个答案:

答案 0 :(得分:3)

我使用过C#,对我来说效果很好。

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.AccessControl;

namespace DACL
{
    class Class1
    {
        private enum MULTIPLE_TRUSTEE_OPERATION
        {
            NO_MULTIPLE_TRUSTEE,
            TRUSTEE_IS_IMPERSONATE
        }

        private enum TRUSTEE_FORM
        {
            TRUSTEE_IS_SID,
            TRUSTEE_IS_NAME,
            TRUSTEE_BAD_FORM,
            TRUSTEE_IS_OBJECTS_AND_SID,
            TRUSTEE_IS_OBJECTS_AND_NAME
        }

        private enum TRUSTEE_TYPE
        {
            TRUSTEE_IS_UNKNOWN,
            TRUSTEE_IS_USER,
            TRUSTEE_IS_GROUP,
            TRUSTEE_IS_DOMAIN,
            TRUSTEE_IS_ALIAS,
            TRUSTEE_IS_WELL_KNOWN_GROUP,
            TRUSTEE_IS_DELETED,
            TRUSTEE_IS_INVALID,
            TRUSTEE_IS_COMPUTER
        }

        private struct TRUSTEE
        {
            public IntPtr pMultipleTrustee;
            public MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
            public TRUSTEE_FORM TrusteeForm;
            public TRUSTEE_TYPE TrusteeType;
            public IntPtr ptstrName;
        }

        [DllImport("advapi32.dll", SetLastError = true)]
        private static extern void BuildTrusteeWithSid(
            ref TRUSTEE pTrustee,
            byte[] sid
        );

        [DllImport("advapi32.dll")]
        private static extern uint GetEffectiveRightsFromAcl(byte[] pacl, ref TRUSTEE pTrustee, ref uint pAccessRights);

        public bool HasAccess(SecurityIdentifier sid)
        {
            DiscretionaryAcl dacl = <DACL from somewhere>;

            byte[] daclBuffer = new byte[dacl.BinaryLength];
            dacl.GetBinaryForm(daclBuffer, 0);

            byte[] sidBuffer = new byte[sid.BinaryLength];
            sid.GetBinaryForm(sidBuffer, 0);

            TRUSTEE t = new TRUSTEE();
            BuildTrusteeWithSid(ref t, sidBuffer);

            uint access = 0;
            uint hr = GetEffectiveRightsFromAcl(daclBuffer, ref t, ref access);

            int i = Marshal.Release(t.ptstrName);

            return ((access & <Desired Access>) == <Desired Access>) ? true : false;
        }
    }
}

答案 1 :(得分:2)

  • 如果域组有权使用 文件,此功能必须访问 要枚举的活动目录 受托人的集团成员资格 (至少如果它是域用户)。 如果您的程序正在运行 本地帐户,然后这个帐户 没有权利访问 活动目录,因此错误 返回代码。
  • 域帐户和本地系统有 访问活动目录。 本地系统是计算机帐户 在活动目录中(计算机 就像AD中的用户一样。
  • 如果没有域组可以访问 文件,功能不必 检查活动目录。所以 本地用户也是成功的。