.NET получить полный список свойств для компьютеров AD (для соответствия API Powershell Get-ADComputer) - PullRequest
0 голосов
/ 20 ноября 2018

Я конвертирую код Powershell в C #, и в Powershell я называю этот API "Get-ADComputer" https://docs.microsoft.com/en-us/powershell/module/activedirectory/get-adcomputer?view=winserver2012-ps. Когда вы смотрите на примеры в ссылке, он показывает исчерпывающий список свойств, которые могут быть возвращены.

Я пытаюсь повторить это в C #, но я получаю подмножество того, что возвращает вызов Powershell.Например, я ищу «PrimaryGroup», которая возвращается только в вызове Powershell.

Вот фрагменты кода:

POWERSHELL

Get-ADComputer -Filter "*" -Properties "*"

C #

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (var p in GetProperties())
                Console.WriteLine(p);
        }

        private static IEnumerable<string> GetDomainNames()
        {
            ICollection<string> domains = new List<string>();

            foreach (Domain domain in Forest.GetCurrentForest().Domains)
                domains.Add(domain.Name);

            return domains;
        }

        public static List<string> GetProperties()
        {
            List<string> properties = new List<string>();

            foreach (var domainName in GetDomainNames())
            {
                using (DirectoryEntry directoryEntry = new DirectoryEntry(@"LDAP://" + domainName))
                {
                    using (DirectorySearcher mySearcher = new DirectorySearcher(directoryEntry))
                    {
                        mySearcher.Filter = ("(objectClass=computer)");
                        mySearcher.SizeLimit = 0; // no size limit
                        mySearcher.PageSize = 250; // paging
                        mySearcher.PropertiesToLoad.Add("PrimaryGroup"); // only want this property, for testing, comment out this line to get all properties returned

                        foreach (SearchResult resEnt in mySearcher.FindAll())
                        {
                            foreach (var p in resEnt.Properties.PropertyNames)
                                properties.Add(p.ToString());
                        }
                    }
                }
            }

            properties.Sort();

            return properties;
        }
    }
}

Полагаю, я не совсем правильно все настроил в коде C #.Я получаю много таких же свойств обратно, но не все.Я надеюсь на руководство.

спасибо.

1 Ответ

0 голосов
/ 20 ноября 2018

PowerShell иногда использует «отображаемые имена» для атрибутов, где фактическое имя атрибутов в AD немного отличается.PowerShell также имеет некоторые дополнительные свойства, которые переводят некоторые данные в AD во что-то полезное.Это пример этого.

Свойство PrimaryGroup возвращает различающееся имя основной группы.Тем не менее, нет атрибута в AD, который хранит это.Основная группа определяется из атрибута primaryGroupId, который представляет собой RID (относительный идентификатор) группы.

Таким образом, вам нужно запросить атрибут primaryGroupId и перевести его, чтобы найти фактическую группу.Я написал статью о Нахождении всех групп пользователей , где я поделился методом, который сделает это.Это принимает DirectoryEntry, но на самом деле ему просто нужно знать primaryGroupId и objectSid (поскольку он использует SID пользователя для построения SID группы):

private static string GetUserPrimaryGroup(DirectoryEntry de) {
    de.RefreshCache(new[] {"primaryGroupID", "objectSid"});

    //Get the user's SID as a string
    var sid = new SecurityIdentifier((byte[])de.Properties["objectSid"].Value, 0).ToString();

    //Replace the RID portion of the user's SID with the primaryGroupId
    //so we're left with the group's SID
    sid = sid.Remove(sid.LastIndexOf("-", StringComparison.Ordinal) + 1);
    sid = sid + de.Properties["primaryGroupId"].Value;

    //Find the group by its SID
    var group = new DirectoryEntry($"LDAP://<SID={sid}>");
    group.RefreshCache(new [] {"cn"});

    return group.Properties["cn"].Value as string;
}

Вы должныбыть в состоянии приспособить это к извлечению значений из DirectorySearcher.

В качестве примечания: если вы не прикоснетесь к коллекции PropertiesToLoad, он вернет каждый атрибут со значением (исключая созданные атрибуты)).Тем не менее, рекомендуется использовать PropertiesToLoad, если вам не нужно на законных основаниях видеть каждый атрибут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...