1

System.DirectoryServices を使用すると、highestCommittedUSN を次のように取得できます。

using(DirectoryEntry entry = new DirectoryEntry("LDAP://servername:636/RootDSE"))
{
     var usn = entry.Properties["highestCommittedUSN"].Value;
}

ただし、ADSI を利用しない System.DirectoryServices.Protocols を使用して、リモート ADLDS からこの情報を取得する必要があります。以下は、私がやろうとしていることの単純化されたコードサンプルです:

using(LdapConnection connection = GetWin32LdapConnection())
{
     var filter = "(&(highestCommittedUSN=*))";
     var searchRequest = new SearchRequest("RootDSE", filter, SearchScope.Subtree, "highestCommittedUSN");
     var response = connection.SendRequest(searchRequest) as SearchResponse;
     var usn = response.Entries[0].Attributes["highestCommittedUSN"][0];
}

残念ながら、これにより「DirectoryOperationException: 識別名に無効な構文が含まれています」というエラーが発生します。最初は GetWin32LdapConnection() に何か問題があるのではないかと思っていましたが、そのコードはディレクトリに接続するために他の多くの場所で呼び出され、エラーになることはありません。

何か案は?

4

1 に答える 1

5

アイデアをありがとう、ザイログ。どうやら RootDSE に接続するには、ルート コンテナーに null を指定する必要があります。また、フィルターを objectClass=* に切り替え、検索範囲を「base」に切り替えました。今それは動作します!

using(LdapConnection connection = GetWin32LdapConnection())
{
 var filter = "(&(objectClass=*))";
 var searchRequest = new SearchRequest(null, filter, SearchScope.Base, "highestCommittedUSN");
 var response = connection.SendRequest(searchRequest) as SearchResponse;
 var usn = response.Entries[0].Attributes["highestcommittedusn"][0];
}

これにより、将来誰かが時間を節約できることを願っています。

于 2013-10-31T13:24:37.863 に答える