1

次のコマンドレットを実行して、その出力を $query 変数に保存しようとしています。

$query = Get-ADObject -Server $ldapServer -Credential $account -LDAPFilter "(&(objectCategory=Person)(objectClass=User)(!userAccountControl:1.2.840.113556.1.4.803:=2))" -SearchBase $ldapDN  -Properties "GivenName", "Mail" 


LDAP クエリはかなりうまく実行されます (6000 以上の LDAP データベースで約 10 秒)。返された結果セットには、約 150 のユーザー オブジェクトが含まれています。次のように $query 変数を繰り返し処理しようとすると、奇妙なことが起こります。

$query

または:

foreach($object in $query){$object}

反復は信じられないほど遅い (オブジェクトごとに約 10 ~ 30 秒)

コマンドを実行するなど、クエリが変数に保存されていない場合、すべてが正常かつ高速に機能します。

Get-ADObject -Server $ldapServer -Credential $account -LDAPFilter "(&(objectCategory=Person)(objectClass=User)(!userAccountControl:1.2.840.113556.1.4.803:=2))" -SearchBase $ldapDN  -Properties "GivenName", "Mail" 


また、次のような書式設定コマンドレットを使用する場合:

$query = Get-ADObject -Server $ldapServer -Credential $account -LDAPFilter "(&(objectCategory=Person)(objectClass=User)(!userAccountControl:1.2.840.113556.1.4.803:=2))" -SearchBase $ldapDN  -Properties "GivenName", "Mail" | ft


ただし、反復には「オブジェクト」が必要です。したがって、テキスト出力を保存しても、ここでは役に立ちません。さらに紛らわしいのは、'$query' を呼び出すだけで 1 回繰り返すと、一度印刷されたオブジェクトへの次の呼び出しが、以降のすべての呼び出しで高速に処理されることです。 また、「Get-ADObject」コマンドレットから「-Properties」パラメーターを除外すると、$query 変数に保存された結果も高速に処理されます。「-Properties」パラメーターが原因で速度が低下しているようです (十分な空きメモリがあることを考えると、メモリ制限とは関係ないと思います)。

誰か知っていますか:

  1. なぜこれが起こるのですか?

  2. -properties を使用した場合にのみ発生するのはなぜですか?

  3. 問題の解決方法/回避策 (「DirectorySearcher」クラスは使用できません。そのクラスの「LDAP」クエリを実行するユーザーを指定することはできず、「runas」を呼び出すことはオプションではないためです)。

4

2 に答える 2

1

select-objectその変換$queryを試してくださいpscustomobject

$query = Get-ADObject -Server $ldapServer -Credential $account `
-LDAPFilter "(&(objectCategory=Person)(objectClass=User)(!userAccountControl:1.2.840.113556.1.4.803:=2))"  -SearchBase $ldapDN `
 -Properties "GivenName", "Mail" | select givenname, mail
于 2012-11-28T16:29:47.013 に答える