我正在使用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。
更新
这是一张更新的图片,向您展示我在代码中要完成的工作。正如您在下图中看到的,当我在代码中创建一个新的计算机帐户时,我正在尝试更改底部框(通过代码)。了解它如何允许您指定谁可以将此特定计算机添加到域中?
答案 0 :(得分:0)
要执行此操作,您需要至少在计算机帐户上授予重置密码权限。我不认为你需要别的东西,但我不记得了。
您可以使用ActiveDirectoryAccessRule类来构建ACE并将其添加到ACL。你会想做这样的事情:
var rule = new ActiveDirectoryAccessRule(<user to delegate to>, ActiveDirectoryRights.ExtendedRight, AccessControlType.Allow, new Guid("00299570-246d-11d0-a768-00aa006e0529")
答案 1 :(得分:0)
这是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)
他是我写作的证据:
如果你看一下安全标签