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

我正在尝试检查特定受托者的特定文件的权限,并使用win32 API GetEffectiveRightsFromAcl()。 当域组可以访问该文件时,当使用本地帐户(admin或其他)执行该function时,该函数返回5(拒绝访问)。

这三个语句总结了我在GetEffectiveRightsFromAcl()中看到的行为:

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

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

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

短发

我使用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 = ; 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 & ) == ) ? true : false; } } } 
  • 如果域组对文件具有权限,则此函数必须访问活动目录以枚举受托者的组成员身份(至少如果它是域用户)。 如果您的程序在本地帐户下运行,则此帐户无权访问活动目录,因此错误返回代码。
  • 域帐户和本地系统可以访问活动目录。 本地系统是活动目录中的计算机帐户(计算机就像AD中的用户)。
  • 如果没有域组可以访问该文件,则该函数不必检查活动目录。 所以本地用户也成功了。