Obtenir un access refusé avec GetEffectiveRightsFromAcl () ..?

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 ():

  • Lorsque le groupe de domaine a des droits sur le fichier et que le programme s’exécute sous un compte local: Accès refusé.
  • Lorsque le groupe de domaine a des droits sur le fichier et que le programme s’exécute sous un compte de domaine ou sur le système local: succès
  • Lorsque le groupe de domaine n’a pas de droits sur le fichier et que le programme est exécuté sous n’importe quel compte:

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; } } } 
  • si le groupe de domaine a le droit d’accéder au fichier, cette fonction doit accéder à l’annuaire actif pour énumérer l’appartenance au groupe de l’administrateur (du moins s’il s’agit d’un utilisateur de domaine). Si votre programme est exécuté sous un compte local, ce compte n’a pas le droit d’accéder au répertoire actif, d’où le code de retour d’erreur.
  • Le compte de domaine et le système local ont access au répertoire actif. Le système local est le compte d’ordinateur dans l’annuaire actif (les ordinateurs sont comme des utilisateurs dans AD).
  • Si aucun groupe de domaine n’a access au fichier, la fonction n’a pas à vérifier avec le répertoire actif. Donc, les utilisateurs locaux réussissent aussi.