четверг, 9 декабря 2010 г.

Давайте делегируем полномочия или “Где мои атрибуты?!”

Так как я в последнее время занимаюсь различными задачами по делегированию полномочий, то приходится припоминать кое-какие хорошо забытые “базовые” вещи. На самом деле мне пришлось дважды воткнуться в проблему исчезнувших атрибутов, чтобы заняться ей всерьёз и обнаружить повторно, что понятие “filtered attributes” может относиться не только к RODC =)
Итак, ситуация обычно выглядит следующим образом: Вы пытаетесь делегировать полномочия на атрибут объекта в AD с помощью мастера делегирования и обнаруживаете, что это невозможно, поскольку он (атрибут) в мастере не виден. Не виден он так же и во вкладке Безопасность свойств объекта. Например, если я попытаюсь делегировать полномочия на изменение атрибута employeeID для контактов, мастер покажет мне следующее окно:
image
Как видно, здесь нет такого атрибута, как employeeID. Где он? Ну, это достаточно просто: многие атрибуты фильтруются из представления мастера (и не только). Это сделано, чтобы облегчить нам работу, так как существует множество свойств объектов, которые обычно просто не нужны (т.е. нет нужды их редактировать, конечно). “Но… Мне нужно делегировать полномочия на эти свойства!”,- скажете мне Вы. Отлично, никаких проблем: давайте вернем наши атрибуты на подобающее им место. Чтобы осуществить это, нам нужно внести некоторые измениния в файл dssec.dat, расположенный в папке %systemroot%\system32 (резервная копия не должна пригодиться, но должна быть сделана Winking smile). Файл имеет вполне очевидную структуру: одна секция на каждый тип объекта, начинающаяся с [<attributename>] и заканчивающаяся с началом следующей секции. Например, секция для контактов будет выглядеть как-то так:
image
Из скриншота видно, что секция состоит из названий отфильтрованных атрибутов, знака “=” и числа. В красном прямоугольнике мы видим тот самый атрибут, который мы не можем видеть в мастере. Почему? Ну очевидно же, что из-за этой мерзкой цифры 7. Что бы нам такого туда поместить вместо нее? Вариантов немного:
  • Чтобы отобразить оба варианта read & write, поставим туда 0
  • Чтобы отобразить вариант write, используйте 1
  • 2 даст доступ к опции read
  • ну и оставьте там 7, чтобы убрать свойство из мастера целиком.
так что давайте поставим строку “employeeID=0”:
image
перезапустим нашу консоль ADUC и снова запустим мастер делегирования:
image
Voilà!
Дополнительное чтиво:
http://support.microsoft.com/kb/296490
http://technet.microsoft.com/en-us/library/cc756087(WS.10).aspx

24 комментария:

mikas комментирует...

God Job!

KomatoZo комментирует...

Спасибо.

Анонимный комментирует...

Каким средством предполагается редактировать атрибут employeeID после того, как на него выданы полномочия? Может есть какая-то форма, а не Attribut Editor?

KomatoZo комментирует...

Можно сделать свою форму, можно добавить в основное окно редактора ADUC это поле, можно скриптом.
Я постараюсь в ближайшее время описать возможные способы.

Анонимный комментирует...

Подскажите, есть ли возможность делегировать пользователю право на блокировку/разблокировку учетных записей и право добавления только в определенные группы безопасности?

Alexander Trofimov комментирует...

1) Блокировка/разблокировка: если имеется в виду enable/disable, то частично да. Есть атрибут userAccountControl, в котором можно это делать. К сожалению, он управляет и дополнительными параметрами типа password never expires, так что если Вы не готовы делегировать и такие права, то имеем проблему, конечно же.
2) Про группы ответ однозначно да, это даже входит в стандартные возможности делегирования доступа: modify the membership of a group.

Анонимный комментирует...

1. не совсем понял, как можно применить аттрибут userAccountControl

2. стандартные возможности - это да. но мне нужено, чтобы пользователь мог изменять членство только в нескольких группах. есть вариант не через мастер, а через безопасность в свойствах группы, ну а если мне нужно это сделать на 20 группах.

Alexander Trofimov комментирует...

1) Не "применить". Вы можете дать право изменять этот атрибут, после чего у администратора, которому Вы это право делегировали появится возможность делать учетной записи disable/enable. Однако вместе с этим появятся и другие права.
2) Я бы рекомендовал поместить эти группы в отдельное OU, и на них стандартным способом произвести делегирование. Любой другой способ, с большой вероятностью приведет в дальнейшем к проблемам или лишней работе.

Игорь комментирует...

Александр, как работать с атрибутом UserAccountControl я понял (http://support.microsoft.com/kb/305144). но значение атрибута UserAccountControl не сохрянется, если я хочу, чтобы это был простой аккаунт и юзер мог блокировать учетки, присваиваю значение атрибута 528 (512+16).читаю дальше, вижу, что в 2003 флаги LOCK_OUT и PASSWORD_EXPIRED заменены новым атрибутом ms-DS-User-Account-Control-Computed. ок, оставляю атрибут UserAccountControl равным 512, меняю значение атрибута ms-DS-User-Account-Control-Computed на 16 (0x0010), пытаюсь примениться, а adsiedit говорит: "доступ к атрибуту не разрешен, т.к. атрибут принадлежит диспетчеру защищенных записей SAM". и как же мне изменить этот атрибут? :)

Игорь комментирует...

Перечитал еще раз внимательно http://support.microsoft.com/kb/305144 и не нашел флага отвечающего за enable|disable.
флаг UF_LOCKOUT отвечает за залочивание учетки, а не за блокировку. и его изменить вроде нельзя судя по http://www.selfadsi.org/extended-ad/user-unlock.htm. поэтому мне это и не удалось.
Александр, уточните пож-ста как можно делегировать права на блокировку/разблокировку аккаунтов )) и возможно ли это в принципе.

Alexander Trofimov комментирует...

Ок, я еще раз проверю, как я это сделал на работу и напишу =)
На следующей неделе будет, я думаю, результат.

Alexander Trofimov комментирует...

Ну вот смотрите: только что попробовал.
Была учетная запись с атрибутом userAccountcontrol = 0x200 (dec 512). Я через консоль сделал ей Disable. Атрибут стал 0x202 (514). Потом изменил атрибут обратно на 0x200 и он включился.
Если желаете, могу провести эксперимент чисто - с правами пользователя (и сделать из этого видео даже) =)

Alexander Trofimov комментирует...

А кстати, почему 512+16? Должно быть 512+2. 16 это локаут, который действительно руками ставить нельзя. Нужно accountdisable.

Игорь комментирует...

дык как мне наделить пользователя правами блокировки/разблокировки? :))

вот Вы пишете: "Вы можете дать право изменять этот атрибут, после чего у администратора, которому Вы это право делегировали появится возможность делать учетной записи disable/enable."

как это право дать, никак не пойму ))))

Игорь комментирует...

все понял )) через файл dssec.dat (у Вас в статье опечатка, файл у вас называется dessec.dat)
но не могу найти этот атрибут в файле...внось уповаю на Вас ))
вот все, что касается пользователя у меня:

[user]
aCSPolicyName=7
adminCount=7
allowedAttributes=7
allowedAttributesEffective=7
allowedChildClasses=7
allowedChildClassesEffective=7
badPasswordTime=7
badPwdCount=7
bridgeheadServerListBL=7
c=7
canonicalName=7
co=7
codePage=7
controlAccessRights=7
countryCode=7
createTimeStamp=7
dBCSPwd=7
defaultClassStore=7
destinationIndicator=7
displayNamePrintable=7
distinguishedName=7
dSASignature=7
dSCorePropagationData=7
dynamicLDAPServer=7
extensionName=7
flags=7
fromEntry=7
frsComputerReferenceBL=7
fRSMemberReferenceBL=7
fSMORoleOwner=7
garbageCollPeriod=7
generationQualifier=7
groupPriority=7
groupsToIgnore=7
instanceType=7
isCriticalSystemObject=7
isDeleted=7
isPrivilegeHolder=7
l=7
lastKnownParent=7
lastLogoff=7
lastLogon=7
legacyExchangeDN=7
lmPwdHistory=7
localeID=7
logonCount=7
mail=7
managedObjects=7
masteredBy=7
maxStorage=7
mhsORAddress=7
modifyTimeStamp=7
mS-DS-ConsistencyChildCount=7
mS-DS-ConsistencyGuid=7
mSMQDigests=7
mSMQDigestsMig=7
mSMQSignCertificates=7
mSMQSignCertificatesMig=7
msNPAllowDialin=7
msNPCallingStationID=7
msNPSavedCallingStationID=7
msRADIUSCallbackNumber=7
msRADIUSFramedIPAddress=7
msRADIUSFramedRoute=7
msRADIUSServiceType=7
msRASSavedCallbackNumber=7
msRASSavedFramedIPAddress=7
msRASSavedFramedRoute=7
netbootSCPBL=7
networkAddress=7
nonSecurityMemberBL=7
ntPwdHistory=7
nTSecurityDescriptor=7
o=7
objectCategory=7
objectClass=7
objectGUID=7
objectVersion=7
operatorCount=7
otherWellKnownObjects=7
ou=7
partialAttributeDeletionList=7
partialAttributeSet=7
physicalDeliveryOfficeName=7
possibleInferiors=7
preferredDeliveryMethod=7
preferredOU=7
primaryGroupID=7
primaryInternationalISDNNumber=7
primaryTelexNumber=7
proxiedObjectName=7
proxyAddresses=7
queryPolicyBL=7
registeredAddress=7
replPropertyMetaData=7
replUpToDateVector=7
repsFrom=7
repsTo=7
revision=7
rid=7
sAMAccountType=7
sDRightsEffective=7
securityIdentifier=7
seeAlso=7
serverReferenceBL=7
servicePrincipalName=7
showInAddressBook=7
showInAdvancedViewOnly=7
sIDHistory=7
siteObjectBL=7
sn=7
st=7
subRefs=7
subSchemaSubEntry=7
supplementalCredentials=7
systemFlags=7
teletexTerminalIdentifier=7
telexNumber=7
terminalServer=7
textEncodedORAddress=7
tokenGroups=7
tokenGroupsNoGCAcceptable=7
unicodePwd=7
url=7
userPassword=7
userSMIMECertificate=7
uSNChanged=7
uSNCreated=7
uSNDSALastObjRemoved=7
USNIntersite=7
uSNLastObjRem=7
uSNSource=7
wbemPath=7
wellKnownObjects=7
whenChanged=7
whenCreated=7
x121Address=7

Alexander Trofimov комментирует...

За опечатку большое спасибо. вычитывал вроде, а все одно проскочило... =)
По поводу атрибута: если его нет в dssec.dat, значит он автоматически доступен в интерфейсе мастера делегирования.
На стадии мастера "tasks to delegate" выбираете "Create a custom task to delegate", потом на "Active Directory Object Type" выбираем "Only the following objects in the folder" и ставим галочку напротив User objects. На вкладке Permissions ставим галочку Property-specific и UserAccountConrol у нас в кармане. =)
Если не так - пишите, будем разбираться.

Игорь комментирует...

Александр, все получилось.
спасибо за статью и комментарии )
успехов!!

Alexander Trofimov комментирует...

Всегда пожалуйста. Только помните - если вы хотели дать только право включить или выключить учетную запись, то дали, на самом деле, несколько больше прав.

Анонимный комментирует...

Александр, подскажи изменять файл dssec.dat нужно на компе на котором запускается оснастка AD, или на домен контроллерах?

Alexander Trofimov комментирует...

Достаточно на станции, где редактируете политику. Честно говоря, даже не уверен, что на DC имеет смысл менять файл, если Вы там не собираетесь менять политику. Но я попробую - записано в toDo =)

shulya комментирует...

Александр, подскажи еще пожалуйста, не получается делегировать права на изменение поля "полное имя". При делегирование указано что разрешить редактирование поля полное имя, однако этого не достаточно.
Скриншот здесь: http://narod.ru/disk/32871155001/attributes.png.html

Спасибо, заранее!

Alexander Trofimov комментирует...

Почему недостаточно? Насколько я вижу, запись в поле можно изменить.

shulya комментирует...

При нажатие кнопки ОК выдается сообщение о недостаточности прав на изменение поля полное имя.

Alexander Trofimov комментирует...

В блоге не очень удобно заниматься траблшутингом. Предлагаю в почту переместиться. Напишите, что конкретно и как Вы делегировали.
alexander[dot]trofimov[at]live[dot]com