#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();
Это создаст учетные записи компьютеров и поместит их в правильное подразделение. Однако вам все равно необходимо предоставить права на добавление компьютера в домен, чтобы подключить компьютер к этой учетной записи. Я не могу найти код для этого.
В качестве дополнительного примечания, я понимаю, что мог бы предоставить сотрудникам службы поддержки разрешение на присоединение компьютеров к домену. Проблема, однако, заключается в том, что они могли бы сделать это без использования этого инструмента. Они не поймут, что, делая это, они отправляют компьютеры не в те подразделения.
Обновить
Вот обновленная картинка, чтобы показать вам, чего я пытаюсь добиться в коде. Как вы можете видеть на изображении ниже, я пытаюсь изменить нижнее поле (с помощью кода) при создании новой учетной записи компьютера в коде. Посмотрите, как это позволяет вам указать, кто может добавить этот конкретный компьютер в домен?
Комментарии:
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 в качестве лица, способного добавить этот компьютер в домен. Это то, что я хочу. При использовании графического интерфейса делегирование не требуется. Я не хочу (не могу) использовать делегирование для своего кода.