我在C#中通过LDAP创建计算机时出现问题:
以下是我的代码:
C#
string connectionPrefix = "LDAP://" + ldapPath;
DirectoryEntry dirEntry = new DirectoryEntry(connectionPrefix, GlobalVar.adUser, GlobalVar.adUserPassword);
DirectoryEntry newComputer = dirEntry.Children.Add("CN=" + computerName, "computer");
newComputer.Properties["samaccountname"].Value = computerName;
newComputer.Properties["dnshostname"].Value = computerName + ".[privacy].[domain].[here]";
newComputer.Properties["description"].Value = GlobalVar.adUser;
newComputer.Properties["location"].Value = "IT";
这完美无缺,只有一个例外:计算机是在正确的文件夹中创建的。然而,主要群体是"域用户"而不是"域计算机"当我直接在AD中创建计算机时,计算机会自动分配到主要组" Domain Computers"
结果是我无法将计算机添加到域中而无需在广告中手动编辑。
任何解决方案?
最诚挚的问候,
儒略
答案 0 :(得分:1)
我会使用System.DirectoryServices.AccountManagement来执行此操作...
LDAPusername =具有编辑LDAP权限的用户名。
创建后传递计算机名,然后传递该组。
很抱歉,如果这不完美,这是我转换的vb.net代码。
//The following code changes the principal group of an existing computer
PrincipalContext pc1 = new PrincipalContext(
ContextType.Domain,
"subdomain.domain.com",
LDAPusername,
LDAPpassword
);
dynamic cp = ComputerPrincipal.FindByIdentity(pc1, "computername");
dynamic computer = (DirectoryEntry)cp.GetUnderlyingObject();
// distinguishedname = "CN=Domain Users,CN=Users,DC=domain,DC=com"
string @group = "groupdistinguishedname";
DirectoryEntry groupdirentry = new DirectoryEntry(
"LDAP://" + @group,
LDAPusername,
LDAPpassword
);
groupdirentry.Invoke("Add", new object[] { computer.Path });
groupdirentry.CommitChanges();
groupdirentry.Invoke(
"GetInfoEx",
new object[] {
new object[] { "primaryGroupToken" },
0
}
);
object primaryGroupToken = groupdirentry.Invoke(
"Get",
new object[] { "primaryGroupToken" }
);
computer.Invoke(
"Put",
new object[] {"primaryGroupID",primaryGroupToken}
);
computer.CommitChanges();
答案 1 :(得分:0)
您需要将primaryGroupId设置为515我相信(域计算机)
newComputer.Properties["primaryGroupId"].Value = 515
答案 2 :(得分:0)
我遇到了同样的问题,最初是在网上搜索后被带到这里的。找到解决方案 here。
<块引用>要获得“有效”的计算机对象,您必须将属性 userAccountControl 设置为 0x1020 = (PASSWD_NOTREQD | WORKSTATION_TRUST_ACCOUNT) 并且还建议将 sAMAccountName 设置为计算机名(大写)后跟一个“$”(相同就像您从管理控制台创建对象一样)。
newComputer.Properties["userAccountControl"].Value = 0x1020;
这为我解决了问题。