Изменить, кто может присоединить созданную учетную запись ComputerPrincipal к домену - PullRequest
1 голос
/ 27 октября 2011

Я использую 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();

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

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

Обновление

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

New Computer dialog

Ответы [ 2 ]

0 голосов
/ 27 октября 2011

Здесь место для поиска ExtendedRightAccessRule .

А вот простой пример, который позволяет пользователю домена 'user1' сбросить пароль для пользователей, представленных в OU 'ForUser1'.Вы просто должны позволить своему пользователю добавить компьютер в OU.@ Брайан Десмон даст вам 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 делегирование становится реальностью с правами на объекты.В вашем случае вы хотите разрешить пользователю создавать учетную запись компьютера.В большинстве случаев администраторы делают это для всего домена:

enter image description hereenter image description here

Если вы попробуете это, вы увидите новый ACE (Access Control Entry) в домене nodACL (Список контроля доступа).В этом примере я просто делегирую право в одном подразделении.


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

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

enter image description here

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

enter image description here

0 голосов
/ 27 октября 2011

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

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

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

...