Измените, кто может присоединить созданную учетную запись ComputerPrincipal к домену

#c# #active-directory #dns #account-management

#c# #active-directory #dns #управление учетными записями

Вопрос:

Я использую C # для создания новых учетных записей компьютеров. Моя цель — позволить персоналу службы поддержки ИТ безопасно добавлять компьютеры в домен в нужном подразделении. Я намеревался сделать это так, чтобы они использовали инструмент, который брал бы соответствующую информацию и создавал учетную запись в Active Directory. Пока все это отлично работает. Есть только одна загвоздка — я не могу понять, как предоставить моим работникам права на присоединение компьютера к домену. Обычно в Active Directory вы можете изменить группу, которой разрешено присоединять новый компьютер к домену. Я использую DirectoryServices.Мы с AccountManagement не можем понять, как сделать то же самое в коде.

Вот мой код:

 PrincipalContext oPrincipalContext = GetPrincipalContext(sOU);

//The password is just a random construction.
//The computer SAM Account Name must end with a dollar sign in order for it
//to be usable.
ComputerPrincipal oComputerPrincipal = new ComputerPrincipal(oPrincipalContext, 
                                                             sComputerName   "$", 
                                                             RandomPassword(), 
                                                             true);

//You actually need to save the record before it is actually created
oComputerPrincipal.Save();
 

Это создаст учетные записи компьютеров и поместит их в правильное подразделение. Однако вам все равно необходимо предоставить права на добавление компьютера в домен, чтобы подключить компьютер к этой учетной записи. Я не могу найти код для этого.

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

Обновить

Вот обновленная картинка, чтобы показать вам, чего я пытаюсь добиться в коде. Как вы можете видеть на изображении ниже, я пытаюсь изменить нижнее поле (с помощью кода) при создании новой учетной записи компьютера в коде. Посмотрите, как это позволяет вам указать, кто может добавить этот конкретный компьютер в домен?

Диалоговое окно quot;Новый компьютерquot;

Комментарии:

1. @marc_s — Само создание учетной записи компьютера (приведенный выше код) выполняется с использованием учетной записи службы, а не учетной записи пользователя. Проблема не в этом. Проблема заключается в том, что когда они находятся на самой машине и пытаются присоединить ее к домену после выполнения описанных выше действий — объект существует в AD, но у них по-прежнему нет разрешения на подключение компьютера, на котором они находятся, к этому объекту. Это проблема, которую я пытаюсь исправить.

Ответ №1:

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

Вы можете использовать класс ActiveDirectoryAccessRule для создания ACE и добавления его в список управления доступом. Вы захотите сделать что-то вроде этого:

var rule = new ActiveDirectoryAccessRule(<user to delegate to>, ActiveDirectoryRights.ExtendedRight, AccessControlType.Allow, new Guid("00299570-246d-11d0-a768-00aa006e0529")

Комментарии:

1. Я могу ошибаться, но разве это не просто общее делегирование полномочий? Я не хочу делегировать полномочия, я просто хочу предоставить права для этого одного компьютера. В конце концов, могло бы случиться так, что я позволил бы любому добавить свой компьютер в домен, что означало бы, что каждый должен был бы иметь его прямо сейчас. Я обновил свое сообщение выше, чтобы лучше проиллюстрировать то, что я ищу. Я хочу, чтобы мой код мог имитировать нижнее поле (куда я помещаю гостевого пользователя).

Ответ №2:

Вот место, где можно найти ExtendedRightAccessRule.

И вот простой пример, который позволяет пользователю домена ‘user1’ сбросить пароль для пользователей, представленных в подразделении ‘ForUser1’. Вам просто нужно разрешить вашему пользователю добавлять компьютер в подразделение. @Brian Desmon даст вам идентификатор GUID.

 /* Connection to Active Directory 
 */ 
DirectoryEntry workingOU = new DirectoryEntry(); 
workingOU.Options.SecurityMasks = SecurityMasks.Owner | SecurityMasks.Group | SecurityMasks.Dacl | SecurityMasks.Sacl; 
workingOU.Path = "LDAP://WM2008R2ENT:389/ou=ForUser1,dc=dom,dc=fr"; 

/* Retreive Obect security 
 */ 
ActiveDirectorySecurity adsOUSec = workingOU.ObjectSecurity; 

/* Ellaborate the user to delegate 
 */ 
NTAccount ntaToDelegate = new NTAccount("dom", "user1"); 
SecurityIdentifier sidToDelegate = (SecurityIdentifier)ntaToDelegate.Translate (typeof(SecurityIdentifier)); 

/* Specils Guids 
 */ 
Guid UserForceChangePassword = new Guid("00299570-246d-11d0-a768-00aa006e0529"); 
Guid userSchemaGuid = new Guid("BF967ABA-0DE6-11D0-A285-00AA003049E2"); 
Guid pwdLastSetSchemaGuid = new Guid("bf967a0a-0de6-11d0-a285-00aa003049e2"); 

/* Ellaborate ACEs 
 */ 
ExtendedRightAccessRule erarResetPwd = new ExtendedRightAccessRule(ntaToDelegate, AccessControlType.Allow, UserForceChangePassword, ActiveDirectorySecurityInheritance.Descendents, userSchemaGuid); 
PropertyAccessRule parPwdLastSetW = new PropertyAccessRule(ntaToDelegate, AccessControlType.Allow, PropertyAccess.Write, pwdLastSetSchemaGuid, ActiveDirectorySecurityInheritance.Descendents, userSchemaGuid); 
PropertyAccessRule parPwdLastSetR = new PropertyAccessRule(ntaToDelegate, AccessControlType.Allow, PropertyAccess.Read, pwdLastSetSchemaGuid, ActiveDirectorySecurityInheritance.Descendents, userSchemaGuid); 
adsOUSec.AddAccessRule(erarResetPwd); 
adsOUSec.AddAccessRule(parPwdLastSetW); 
adsOUSec.AddAccessRule(parPwdLastSetR); 

workingOU.CommitChanges(); 
 

Отредактировано (2011-11-04)

В моем понимании то, что вы хотите сделать, — это своего рода делегирование; Внутри Active Directory делегирование становится реальностью с правами на объекты. В вашем случае вы хотите разрешить пользователю создавать учетную запись компьютера. В большинстве случаев администраторы делают это для всего домена :

введите описание изображения здесьвведите описание изображения здесь

Если вы попробуете это, вы увидите новый ACE (запись управления доступом) в ACL домена nod (список управления доступом). В приведенном примере я просто делегирую право в одном подразделении.


Второе издание (2011-11-04)

Он является доказательством того, что я пишу :

введите описание изображения здесь

Если вы посмотрите на вкладку безопасность

введите описание изображения здесь

Комментарии:

1. Разве это не дало бы мне просто права пользователя на добавление компьютера в подразделение? Я не хочу изменять права подразделения, я просто хочу разрешить этому пользователю подключать определенный компьютер к вновь созданному объекту computer.

2. Я хочу проиллюстрировать ответ на ваш комментарий, поэтому я редактирую основной ответ.

3. Я обновил свой собственный пост тем, что я ищу. То, что вы здесь указываете, — это делегирование. Я не хочу заниматься делегированием полномочий, даже для одного подразделения. Вместо этого я хочу предоставить пользователю права на привязку компьютера к новой учетной записи, которую мы создали в коде в домене (см. Мой Скриншот выше). Как вы можете видеть, если бы я создал учетную запись компьютера с помощью графического интерфейса AD, я мог бы указать, что учетная запись гостя может иметь доступ для привязки компьютера к вновь созданной учетной записи компьютера в AD. Это то, что я хочу сделать в коде.

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

5. Извините за действительно поздний ответ на это. Я забыл вернуться к этому. В любом случае, похоже, что у вас все наоборот. Если вы делегируете разрешения подразделению, у вас будут права на добавление компьютера в домен. Однако, если бы вы удалили делегированные права, указанные выше, вы все равно могли бы выбрать user1 в качестве лица, способного добавить этот компьютер в домен. Это то, что я хочу. При использовании графического интерфейса делегирование не требуется. Я не хочу (не могу) использовать делегирование для своего кода.