J’essaie de vérifier les droits sur un fichier particulier pour un dépositaire spécifique et j’utilise l’API Win32 GetEffectiveRightsFromAcl (). Lorsque le fichier est accessible par un groupe de domaines, la fonction renvoie 5 (Accès refusé) lorsqu’un compte local (admin ou autre) est utilisé pour exécuter la fonction.
Ces trois instructions résument le comportement que je constate avec GetEffectiveRightsFromAcl ():
Est-ce que quelqu’un sait la raison derrière cela? Il me semble que cela est lié à la sécurité Active Directory. Quels parameters pourraient affecter ceci et quel serait un bon moyen de le déboguer?
En outre, j’ai entendu dire que GetEffectiveRightsFromAcl () pouvait être généralement problématique et qu’il fallait plutôt utiliser AccessCheck (). Cependant, je dois pouvoir prendre un SID arbitraire et vérifier son access par rapport à un fichier. AccessCheck () nécessitant un jeton d’emprunt d’identité, je ne sais pas comment je pourrais créer un jeton à partir d’un SID arbitraire … Des idées? Merci
Bob
J’ai utilisé en C # et cela fonctionne bien pour moi.
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; } } }