C # Active Directory Поиск - PullRequest
       20

C # Active Directory Поиск

1 голос
/ 11 декабря 2019

У меня есть эта функция powershell, и я хочу сделать ее как функцию C #. Как я могу положить его в C #?

Get-ADComputer -filter {Name -Like 'myComp'} -property * | select DistinguishedName

Ответы [ 3 ]

1 голос
/ 11 декабря 2019

Вы должны быть в состоянии сделать это довольно легко. Добавьте ссылку на System.DirectoryServices.AccountManagement и используйте этот код:

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, 'YourDomain'))
{
    ComputerPrincipal computer = ComputerPrincipal.FindByIdentity (ctx, "name");

    if (computer != null)
    {
        // do whatever you need to do with your computer principal
        string distinguishedName = computer.DistinguishedName;
    }

}

Обновите : если вы не знаете свой домен ...... .. - вы также можете использовать:

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))

, и в этом случае основной контекст создается для текущего домена, в котором вы находитесь.

0 голосов
/ 11 декабря 2019

Все остальные ответы предлагают использовать пространство имен System.DirectoryServices.AccountManagement. Хотя это и сработает, на самом деле это просто оболочка пространства имен System.DirectoryServices, чтобы упростить использование. Это делает вещи проще (иногда), но делает это за счет производительности.

Например, во всех приведенных вами примерах ваш код будет извлекать каждый атрибут со значением из объекта компьютера в AD, даже если вам нужен только один атрибут.

Если вы используете DirectorySearcher, вы можете выполнить поиск и получить только тот атрибут, который вам нужен:

public string GetComputerDn(string computerName) {
    var searcher = new DirectorySearcher {
        Filter = $"(&(objectClass=computer)(sAMAccountName={computerName}$))",
        PropertiesToLoad = { "distinguishedName" } //return only the distinguishedName attribute
    };
    var result = searcher.FindOne();
    if (result == null) return null;
    return (string) result.Properties["distinguishedName"][0];
}

Обратите внимание, что в AD sAMAccountName компьютерных объектов - это то, что вы обычно называете «именем компьютера», за которым следует $, поэтому фильтр - это то, что онесть.

0 голосов
/ 11 декабря 2019

Пожалуйста, попробуйте это:

Добавить ссылку на службы Active Directory (% programfiles% \ Reference Assemblies \ Microsoft \ Framework.NETFramework \\ System.DirectoryServices.AccountManagement.dll)

public string GetComputerName(string computerName)
{
    using (var context = new PrincipalContext(ContextType.Domain, "your domain name goes here"))
    {
        using (var group = GroupPrincipal.FindByIdentity(context, "Active Directory Group Name goes here"))
        {
            var computers = @group.GetMembers(true);
            return computers.FirstOrDefault(c => c.Name == computerName).DistinguishedName;
        }
    }

    return null; // or return "Not Found"
}
...