0

手伝っていただけませんか?次のコードを使用して、リモート マシンから AD グループのメンバーを列挙しようとしています。

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

このコードは、1 つの環境を除いてうまく機能します。

この特定の環境で、AD グループのメンバーを列挙しようとすると、次の例外がスローされます。

System.Reflection.TargetInvocationException: 呼び出しのターゲットによって例外がスローされました。

System.ArgumentException: 値が期待される範囲内にありません。--- 内部例外スタック トレースの終了 ---

System.DirectoryServices.DirectoryEntry.Invoke (文字列 methodName、オブジェクト [] 引数) で

Power Shell (以下にコピーされたスクリプト) を介して同じコマンドを実行すると、同じエラーが発生しました。

"2" 個の引数を指定して "Invoke" を呼び出し中に例外が発生しました: "値が期待される範囲内にありません。

C:\Temp\PSTest_AD_Group_Members2.ps1:23 文字:5

  • $members = $DirectoryEntry.Invoke("メンバー", $null)
  • CategoryInfo : NotSpecified: (:) []、MethodInvocationException
  • FullyQualifiedErrorId : DotNetMethodTargetInvocation

その点に注意してください

  1. 異なるドメインの複数の DC に対して再現しようとしましたが、失敗しました。特定の環境でのみ発生する
  2. この例外をオンラインで検索してみましたが、関連するものは見つかりませんでした
  3. ドメイン管理者を使用してこのコードを実行しています
  4. コードは、最新の更新プログラムを適用した Windows Server 2016 で実行されています
  5. 同じ動作を生成する PowerShell スクリプトがあります (以下にコピー)。
  6. ソース マシンとターゲット マシンの両方で問題が発生したことを示す関連エントリがイベント ビューアに表示されない

このコードがその 1 つの特定の環境でのみ AD グループのメンバーを取得できない理由を誰かが理解するのを手伝ってくれますか?

DC側で何がうまくいかなかったのかを理解する方法はありますか? おそらく、着信/試行コマンドの 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 ================================
4

2 に答える 2