Получение «Структура идентификатора безопасности недействительна» при установке флага AD - PullRequest
0 голосов
/ 08 декабря 2011

Это та же проблема, что и в этой теме: Недопустимая структура идентификатора безопасности, эта ошибка возникает при установке нового SecurityDescriptor для пользовательских свойств AD , но вместо .Net используется C ++.

Я хочу установить флаг «Пользователь не может изменить пароль» для учетной записи Active Directory.Я использую этот код от MS , но получаю ошибку

Недопустимая структура идентификатора безопасности.

Это происходит в методе SetUserCannotChangePassword()в этой строке:

//update the security descriptor property
hr = pads->Put(sbstrSecDesc, svar);

Эта ошибка возникает, только когда я проверяю ее с компьютера, который не находится в том же домене, что и пользователь, которому я хочу установить флаг AD.Если я запускаю свое приложение в том же домене, где я изменяю, все работает нормально.

Относительно этого кода ошибки Я нашел эту статью .Совет по открытию портов для LSA не сработал - я деактивировал брандмауэры, но это не решило проблему.

И у меня есть только эта проблема с установкой этого флага.Другие флаги как "UserMustChangePassword" не являются проблемой.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

Я не могу дать решение вашей проблемы сейчас, но после прочтения другого ответа я решил написать несколько комментариев в качестве ответа, чтобы иметь больше места. Я уверен, что источником проблемы является использование LookupAccountSid функции или LookupAccountName для внутреннего использования. Таким образом, вы получаете ошибку. Я нахожу странным, что ошибка ERROR_INVALID_SID (1337) ошибка: «Структура идентификатора безопасности является недопустимым». документируется только в некоторых API, таких как ConvertStringSidToSid , ConvertSidToStringSid , AddAccessAllowedAce , AddAccessAllowedAceEx и некоторых других, которые не должны использоваться в коде, который Вы описываете.

Если для получения SID какой-либо учетной записи используется, например, LookupAccountName, можно установить параметр lpSystemName. Это может быть очень важно, если нужно разрешить имя из домена, которому нет прямого доверия от домена, к которому принадлежит компьютер. Например, если у вас есть один основной домен и два домена ресурсов, и вы пытаетесь разрешить учетную запись из одного домена ресурсов на компьютере из другого домена ресурсов. В случае использования NULL в качестве lpSystemName не удастся, но в случае использования любого сервера из основного домена в качестве lpSystemName, например контроллера домена главного домена, вы сможете разрешить любой аккаунт с любых доменов.

В случае, если любое «открытие портов для LSA» действительно не будет работать. Чтобы действительно помочь вам, мне нужно знать синтаксис pwszUserDN, который вы используете в ADsOpenObject или SetUserCannotChangePassword. Есть несколько возможностей, которые вы можете использовать в Binding String (см. Также здесь ). Я надеюсь, что вы можете решить эту проблему, если вы измените синтаксис. Например, вы можете попытаться указать сервер явно. Например, вы можете использовать

LDAP://server01/CN=Jeff Smith,CN=users,DC=fabrikam,DC=com

или

LDAP://domain2.fabrikam.com/CN=Users,DC=domain2,DC=fabrikam,DC=com

вместо

LDAP://CN=Jeff Smith,CN=users,DC=fabrikam,DC=com
1 голос
/ 26 февраля 2012

Я не уверен, что это решит вашу проблему, так как проблема, скорее всего, является некоторой ошибкой в ​​структуре Microsoft.

Вы ссылаетесь на то, что эта ошибка возникает только в том случае, если вы выполняете ее на компьютере / пользователе за пределами домена, который вы в настоящее время изменяете, поэтому вы можете попытаться установить надежное соединение с Сервером домена перед выполнением приложения. Это можно сделать разными способами, но проще всего подключить скрытый общий ресурс IPC $ на контроллере домена в качестве администратора домена. Просто выполните это в командной строке:

NET USE \\<DOMAIN-CONTROLER>\IPC$ /user:<DOMAIN-NAME>\<Domain-admin-user> <domain-admin-user-password>

Опять же, это может или не может решить вашу проблему, но оно того стоит:)

...