c#在Active Directory中创建计算机 - 主要组问题

时间:2017-07-26 14:53:55

标签: c# active-directory ldap

我在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"

结果是我无法将计算机添加到域中而无需在广告中手动编辑。

任何解决方案?

最诚挚的问候,

儒略

3 个答案:

答案 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;

这为我解决了问题。