C# 更改可以将创建的ComputerPrincipal帐户加入域的用户

C# 更改可以将创建的ComputerPrincipal帐户加入域的用户,c#,active-directory,dns,account-management,C#,Active Directory,Dns,Account Management,我正在使用C#创建新的计算机帐户。我的目标是让IT帮助台人员以正确的方式将计算机安全地添加到域中。我打算这样做的方式是让他们使用一个工具,该工具将获取相关信息并在Active Directory中创建帐户。到目前为止,这一切都非常有效。这里只有一个障碍——我不知道如何授予我的员工将计算机加入域名的权利。通常在Active Directory中,您可以将允许加入新计算机的组更改为域。我使用的是DirectoryServices.AccountManagement,我不知道如何在代码中执行同样的操作

我正在使用C#创建新的计算机帐户。我的目标是让IT帮助台人员以正确的方式将计算机安全地添加到域中。我打算这样做的方式是让他们使用一个工具,该工具将获取相关信息并在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();
这将创建计算机帐户并将其放入正确的OU中。但是,您仍然需要被授予将计算机添加到域的权限,以便将计算机连接到此帐户。我找不到这样做的代码

作为补充说明,我理解我可以授予我的帮助台人员将计算机加入域的权限。但问题是,他们不需要使用这个工具就可以做到这一点。他们不会意识到,当他们这样做的时候,他们将计算机发送到了错误的OU

更新

下面是一张更新的图片,向您展示了我试图在代码中实现的功能。如下图所示,当我用代码创建一个新的计算机帐户时,我试图更改底部框(通过代码)。查看它如何允许您指定谁可以将此特定计算机添加到域


要执行此操作,您需要至少在计算机帐户上授予重置密码权限。我想你不需要别的东西,但我想不起来了

您可以使用ActiveDirectoryAccessRule类来构建ACE并将其添加到ACL。您将需要执行以下操作:

var-rule=new-ActiveDirectoryAccessRule(,ActiveDirectoryRights.ExtendedRight,AccessControlType.Allow,新Guid(“00299570-246d-11d0-a768-00aa006e0529”)
如下所示

下面是一个简单的示例,允许域用户“user1”为OU“ForUser1”中的用户重置密码。您只需允许用户向OU添加计算机。@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内部,通过对对象的权限委托成为现实。在您的情况下,您希望允许用户创建计算机帐户。大多数情况下,管理员都会对整个域执行此操作:

如果您尝试它,您将在域节点ACL(访问控制列表)中看到一个新的ACE(访问控制条目)


第二版(2011-11-04)

他是我写的东西的证明:

若你们看一下安全标签


@marc_s-计算机帐户创建本身(上述代码)是使用服务帐户完成的,而不是用户帐户。这不是问题所在。问题是当他们在计算机上,并在完成上述步骤后尝试将其加入域时-对象存在于AD中,但他们仍然没有权限加入他们所在的计算机。这就是我正在尝试的问题正在进行更正。这难道不只是授予我的用户将计算机添加到OU的权限吗?我不想修改OU权限,我只想允许该用户将特定计算机连接到新创建的计算机对象。我想说明您评论的答案,所以我编辑了主答案。我用我正在查找的内容更新了自己的帖子。什么您在此处指定的是委派。我不想委派,即使只是一个OU。相反,我想授予用户将计算机与我们在域上的代码中创建的新帐户关联的权限(请参见上面的屏幕截图)。如您所见,如果我要使用AD GUI创建计算机帐户,我可以指定来宾帐户有权将计算机与AD中新创建的计算机帐户关联。这是我想在代码中执行的操作。我认为您错了,您是在谈论委派,从您的屏幕开始,我编辑我的答案以向您展示证据。很抱歉对这个问题的回复太晚。我忘了再回来。无论如何,看起来你的情况是相反的。如果你将权限委派给OU,你将有权将计算机添加到域中。但是,如果你要删除上面指定的委派权限,你仍然可以选择user1作为代理能够将该计算机添加到域的人。这就是我想要的。使用GUI时不需要委派。我不想(不能)在我的代码中使用委托。我可能错了,但这不只是整体委托吗?我不想做委托,我只想授予这台计算机的权限。最终,我可能会允许任何人将他们的计算机添加到域中,这意味着每个人都需要拥有该权限。我更新了我的帖子abov为了更好地说明我在寻找什么,我希望我的代码能够模拟底部的框(我把Guest User放在那里)。