【问题标题】:Change who can join a created ComputerPrincipal account to the domain更改谁可以将创建的 ComputerPrincipal 帐户加入域
【发布时间】:2011-12-16 13:51:14
【问题描述】:

我正在使用 C# 创建新的计算机帐户。我的目标是允许 IT 帮助台人员在正确的 OU 中安全地将计算机添加到域中。我打算这样做的方式是让他们使用一种工具,该工具将获取相关信息并在 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。

更新

这是一张更新的图片,向您展示我试图在代码中完成的工作。如下图所示,当我在代码中创建新的计算机帐户时,我试图更改底部框(通过代码)。看看它如何让您指定谁可以将此特定计算机添加到域中?

【问题讨论】:

  • @marc_s - 计算机帐户创建本身(上述代码)是使用服务帐户完成的,而不是用户帐户。那不是问题。问题是当他们在机器上并在完成上述步骤后尝试将其加入域时 - 对象存在于 AD 中,但他们仍然无权将他们所在的计算机加入该对象.这是我要解决的问题。

标签: c# active-directory dns account-management


【解决方案1】:

这里是a place to find ExtendedRightAccessRule

这是一个简单的示例,它允许域用户“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(访问控制条目)。在示例中,我只是将权限委托给一个 OU。


第二版(2011-11-04)

他是我所写内容的证明:

如果您查看安全选项卡

【讨论】:

  • 这不只是授予我将计算机添加到 OU 的用户权限吗?我不想修改 OU 权限,我只想允许该用户将特定计算机连接到新创建的计算机对象。
  • 我想说明你评论的答案,所以我编辑了主要答案。
  • 我用我正在寻找的内容更新了我自己的帖子。您在此处指定的是委派。我不想进行委派,即使只有一个 OU。相反,我想授予用户将计算机关联到我们在域上的代码中创建的新帐户的权限(请参见上面的屏幕截图)。如您所见,如果我要使用 AD GUI 创建计算机帐户,我可以指定来宾帐户有权将计算机与 AD 中新创建的计算机帐户相关联。这就是我想在代码中做的事情。
  • 我认为你错了,你在谈论委托,从你的屏幕开始我编辑我的答案给你看证明。
  • 很抱歉,对此的回复真的很晚。我忘了回到它。无论如何,看起来你的事情发生了逆转。如果您将权限委派给 OU,您将有权将计算机添加到域中。但是,如果您要删除上面指定的委派权限,您仍然可以选择 user1 作为能够将该计算机添加到域的人。这就是我想要的。使用 GUI 时不需要委托。我不想(不能)对我的代码使用委托。
【解决方案2】:

为此,您至少需要在计算机帐户上授予“重置密码”权限。我认为您不需要其他任何东西,但我不记得了。

您可以使用 ActiveDirectoryAccessRule 类来构建 ACE 并将其添加到 ACL。你会想做这样的事情:

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

【讨论】:

  • 我可能错了,但这不只是整体授权吗?我不想委托,我只想授予那台计算机的权限。最后,我可能会允许任何人将他们的计算机添加到域中,这意味着每个人都需要拥有这个权利。我更新了上面的帖子,以更好地说明我在寻找什么。我希望我的代码能够模仿底部框(我放置访客用户的位置)。
猜你喜欢
  • 1970-01-01
  • 2021-03-11
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多