Использование SetEntriesInAcl в C #: ошибка 1332 - PullRequest
1 голос
/ 14 декабря 2011

Мне нужно создать общую папку, и для этого, по-видимому, я должен использовать методы pinvoke NetShare *. Эта часть в порядке, но я хочу добавить некоторые общие права доступа к общей папке. Я использую SetEntriesInAcl, но получаю сообщение об ошибке 1332: сопоставление имен учетных записей и идентификаторов безопасности не выполняется.

Определения:

internal enum MULTIPLE_TRUSTEE_OPERATION : uint
{
    NO_MULTIPLE_TRUSTEE = 0,
    TRUSTEE_IS_IMPERSONATE = 1
}

internal enum TRUSTEE_FORM : uint
{
    TRUSTEE_IS_SID = 0,
    TRUSTEE_IS_NAME = 1,
    ...
}

internal enum TRUSTEE_TYPE : uint
{
    TRUSTEE_IS_UNKNOWN = 0,
    TRUSTEE_IS_USER = 1,
    TRUSTEE_IS_GROUP = 2,
    ...
}

internal enum ACCESS_MODE : uint
{
    NOT_USED_ACCESS = 0,
    GRANT_ACCESS = 1,
    ...
}

internal enum ACCESS_MASK : uint
{
    GENERIC_ALL = 0x10000000, //268435456,
    GENERIC_READ = 0x80000000, //2147483648L,
    GENERIC_WRITE = 0x40000000, //1073741824,
    GENERIC_EXECUTE = 0x20000000, //536870912,
    STANDARD_RIGHTS_READ = 0x00020000, //131072
    STANDARD_RIGHTS_WRITE = 0x00020000,
}

[DllImport("advapi32.dll", SetLastError = true)]
private static extern uint SetEntriesInAcl(
    int cCountOfExplicitEntries, 
    ref EXPLICIT_ACCESS pListOfExplicitEntries, 
    IntPtr OldAcl, 
    out IntPtr NewAcl
    );

А вот как я ее вызываю:

//This pointer will hold the full ACL (access control list) once the loop below has completed
IntPtr aclPtr = default(IntPtr);

EXPLICIT_ACCESS explicitAccessRule = new EXPLICIT_ACCESS();
TRUSTEE account = new TRUSTEE();
{
    account.MultipleTrusteeOperation = MULTIPLE_TRUSTEE_OPERATION.NO_MULTIPLE_TRUSTEE;
    account.pMultipleTrustee = 0;
    account.TrusteeForm = TRUSTEE_FORM.TRUSTEE_IS_NAME;
    account.ptstrName = "Everyone";
    account.TrusteeType = TRUSTEE_TYPE.TRUSTEE_IS_USER;
}
explicitAccessRule.grfAccessMode = ACCESS_MODE.GRANT_ACCESS;
explicitAccessRule.grfAccessPermissions = ACCESS_MASK.GENERIC_READ | ACCESS_MASK.STANDARD_RIGHTS_READ | ACCESS_MASK.GENERIC_EXECUTE;
explicitAccessRule.grfInheritance = NO_INHERITANCE;
//Set the Trustee to the TRUSTEE structure we created earlier in the loop
explicitAccessRule.Trustee = account;

//Add this explicit access rule to the ACL
uint SetEntriesResult = SetEntriesInAcl(1, ref explicitAccessRule, aclPtr, out aclPtr);

Кто-нибудь знает, что мне не хватает? Или есть другой способ сделать это?

Спасибо.

Ответы [ 3 ]

1 голос
/ 18 июня 2015

Кажется, что имена Анси не могут быть сопоставлены. Это работает, если вы используете Unicode-версию SetEntriesInAclW или явно устанавливаете свойство CharSet.

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern uint SetEntriesInAcl(
    int cCountOfExplicitEntries,
    ref EXPLICIT_ACCESS pListOfExplicitEntries,
    IntPtr OldAcl,
    out IntPtr NewAcl);

Вы также можете добавить структуру EXPLICIT_ACCESS в функцию BuildExplicitAccessWithName.

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern void BuildExplicitAccessWithName(
    ref EXPLICIT_ACCESS pExplicitAccess,
    string pTrusteeName,
    uint AccessPermissions,
    uint AccessMode,
    uint Inheritance);
0 голосов
/ 08 апреля 2016

Я столкнулся с теми же проблемами из-за отсутствия CharSet, несовместимых определений в моих структурах и определениях методов и неправильного маршалинга строковых параметров.

Я поместил примеры кода в другой поток, чтобы выне нужно терять дни, пытаясь отсеять ошибки Win32, которые не всегда так полезны.

Обновление прав доступа к общей папке:

Работающий пример .NETиспользование взаимодействия SetEntriesInAcl в действии

0 голосов
/ 21 декабря 2011

Для начала переменная aclPtr является входной переменной. В идеале он должен был получить свое значение из API GetSecurityInfo. (http://msdn.microsoft.com/en-us/library/windows/desktop/aa446654(v=vs.85).aspx) Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...