Не удается перечислить членов группы AD с помощью C#

#c# #powershell #active-directory #adgroup

#c# #powershell #active-directory #adgroup

Вопрос:

Не могли бы вы мне помочь? Я пытаюсь перечислить членов группы AD с удаленного компьютера, используя следующий код:

 using (var entry = new DirectoryEntry(..
{
    foreach (object member in (IEnumerable)entry.Invoke("Members", null))
    {
  

Этот код работает хорошо, за исключением одной среды.

В этой конкретной среде, когда я пытаюсь перечислить членов группы AD, возникает следующее исключение:

Система.Отражение.TargetInvocationException: исключение было вызвано целью вызова.

Система.Исключение ArgumentException: значение не попадает в ожидаемый диапазон. — Завершение трассировки стека внутренних исключений —

в системе.DirectoryServices.DirectoryEntry.Вызов (строковое имя метода, аргументы Object[])

Я запускаю те же команды через power shell (скрипт скопирован ниже) и получаю ту же ошибку:

Исключение, вызывающее «Invoke» с аргументами «2»: «Значение не попадает в ожидаемый диапазон.

В C:TempPSTest_AD_Group_Members2.ps1:23 символ: 5

  • $members = $DirectoryEntry.Invoke(«Члены», $null)
  • CategoryInfo : не указано: (:) [], исключение MethodInvocationException
  • Ошибка с полным разрешением: вызов метода DotNetMethodTargetInvocation

Пожалуйста, обратите внимание, что

  1. Я безуспешно пытался воспроизвести его для нескольких контроллеров домена в разных доменах. Это происходит только в одной конкретной среде
  2. Я попытался найти это исключение в Интернете, но не нашел ничего подходящего
  3. Я использую администратора домена для запуска этого кода
  4. Код выполняется на Windows Server 2016 с последними обновлениями
  5. У меня есть сценарий PowerShell, который производит такое же поведение (скопировано ниже)
  6. Я не вижу соответствующей записи в средстве просмотра событий, указывающей на то, что что-то пошло не так как на исходной, так и на целевой машинах

Может кто-нибудь помочь мне понять, почему этот код не может получить членов группы AD только в этой конкретной среде?

Есть ли способ на стороне DC понять, что пошло не так? возможно, журнал постоянного тока для входящих / попыток команд?

Спасибо за вашу помощь

 =========================== powershell script ==============================

Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$cred = Get-Credential
$domain = "<domain name>"
$groupname = "<group name>"
$results = "<result csv file path>"

cls

$ctx = New-Object 'DirectoryServices.AccountManagement.PrincipalContext' ([DirectoryServices.AccountManagement.ContextType]::Domain, $domain, $cred.UserName, $cred.GetNetworkCredential().Password)
$timing = Measure-Command {$group = [System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($ctx, $groupname)}
$props = [ordered]@{
    'Type' = $group.StructuralObjectClass
    'Name' = $group.SamAccountName
    'SID' = $group.sid
    'RetrivedIn(s)' = $timing.TotalSeconds
    'Retrievedcount' = $group.count
    'UserPrincipalName' = $group.UserPrincipalName
}
New-Object -TypeName PSObject -Property $props | Export-Csv -Path $results -NoTypeInformation

$timing = Measure-Command {
    $DirectoryEntry = New-Object System.DirectoryServices.DirectoryEntry ("LDAPS://$($group.DistinguishedName)", $cred.UserName, $cred.GetNetworkCredential().Password)
    
$members = $DirectoryEntry.Invoke("Members")
}

$props = [ordered]@{
    'Type' = $members.gettype().name
    'Name' = "GroupDirectoryEntry"
    'SID' = "n/a"
    'RetrivedIn(s)' = $timing.TotalSeconds
    'Retrievedcount' = ($members | Measure-Object).count
    'UserPrincipalName' = "n/a"
}
New-Object -TypeName PSObject -Property $props | Export-Csv -Path $results -Append -NoTypeInformation

$members |
ForEach-Object {
    $bytesSid = $_.gettype().InvokeMember("objectSid","GetProperty",$null,$_,$null)
    $sid = New-Object System.Security.Principal.SecurityIdentifier ($bytesSid, 0)
    $timing = Measure-Command {$acct = [DirectoryServices.AccountManagement.Principal]::FindByIdentity($ctx, 4, $sid.value)}
    $props = [ordered]@{
        'Type' = $acct.StructuralObjectClass
        'Name' = $acct.SamAccountName
        'SID' = $acct.Sid
        'RetrivedIn(s)' = $timing.TotalSeconds
        'Retrievedcount' = $acct.count
        'UserPrincipalName' = $acct.UserPrincipalName
    }
    New-Object -TypeName PSObject -Property $props | Export-Csv -Path $results -Append -NoTypeInformation
}
============================= end of powershell script ================================
  

Ответ №1:

Почему бы не использовать GroupPrincipal вместо отражения?

Это было бы так просто, как это:

 PrincipalContext ctx = new PrincipalContext(ContextType.Domain,                                                                      
                                            "fabrikam.com",   
                                            "DC=fabrikam,DC=com",   
                                            "administrator",   
                                            "SecretPwd123");  

GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx,   
                                                   IdentityType.Name,   
                                                   "Domain Admins");  

if (grp != null)  
{  
    foreach (Principal p in grp.GetMembers(true))  
    {  
         Console.WriteLine(p.Name);  
    }  
    grp.Dispose();  
}  

ctx.Dispose();
  

Ошибка довольно понятна:

цель вызова. Это Members функция

Система.Исключение ArgumentException: значение не попадает в ожидаемый диапазон, скорее всего, это относится к null значению.

Комментарии:

1. Большое спасибо за ваш ответ. однако это не относится к моему случаю, поскольку я не могу изменить код. Боюсь, мне нужно понять основную причину и исправить среду.

Ответ №2:

Я выясняю, в чем проблема. проблемная среда имеет настройки в своей среде AD из-за использования стороннего продукта, который подготавливает свой active Directory для поддержки. В рамках интеграции выполняется обновление схемы, которое добавляет атрибут "участники" к их схеме AD. это вызывает конфликт при вызове членов в записи каталога.