Получение доступа запрещено с помощью GetEffectiveRightsFromAcl () ..? - PullRequest
4 голосов
/ 12 декабря 2008

Я пытаюсь проверить права на определенный файл для определенного опекун и я использую Win32 API GetEffectiveRightsFromAcl (). когда файл доступен по доменной группе, функция возвращает 5 (Доступ запрещен), когда локальная учетная запись (администратор или другой) используется для выполнения функции.

Эти три утверждения суммируют поведение, с которым я наблюдаю GetEffectiveRightsFromAcl ():

  • Когда группа домена имеет права на файл и программа запускается под локальная учетная запись: доступ запрещен.
  • Когда группа домена имеет права на файл и программа запускается под учетной записью домена или локальной системы: успех
  • Когда у группы домена нет прав на файл и Программа работает под любым аккаунтом: Успех

Кто-нибудь знает причину этого? Похоже, это связанные с безопасностью Active Directory. Какие настройки могут повлиять на это и что было бы хорошим способом отладить это?

Кроме того, я слышал, что GetEffectiveRightsFromAcl (), как правило, может быть проблематичным и использовать вместо него AccessCheck (). Однако мне нужно иметь возможность взять произвольный SID и проверить его доступ к файлу, а поскольку AccessCheck () требует токен олицетворения, я не знаю, как я мог бы выделить токен из произвольного SID ... Есть идеи? Спасибо

Bob

Ответы [ 2 ]

3 голосов
/ 27 марта 2009

Я использовал в 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;
        }
    }
}
2 голосов
/ 13 декабря 2008
  • если доменная группа имеет право на файл, эта функция должна получить доступ активный каталог для перечисления членство в группе попечителя (по крайней мере, если это пользователь домена). Если ваша программа работает под локальная учетная запись, затем эта учетная запись не имеют права доступа к активный каталог, следовательно ошибка код возврата.
  • учетная запись домена и локальная система имеют доступ к активному каталогу. Локальная система - учетная запись компьютера в активном каталоге (компьютеры как пользователи в AD).
  • Если ни одна доменная группа не имеет доступа к файл, функция не должна проверьте с активным каталогом. Так локальные пользователи тоже преуспевают.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...