8

C# で自分のコンピューターが属している最も具体的な OU を見つけたいと考えています。必要な情報を取得するコードがありますが、堅牢ではなく、複雑な解析が必要になります。より良い代替手段はありますか?考え?どんな助けでも大歓迎です!

本当に私が欲しいのは、コマンドプロンプトコマンドと同等のものです:

dsquery computer -name COMP-HERE

しかし、問題があることが判明している C# で必要です。

DirectorySearcher d = new DirectorySearcher("CN=COMP-HERE");
d.PropertiesToLoad.Add("adspath");
SearchResultCollection results = d.FindAll();
foreach (SearchResult searchResult in results) {
    foreach (string propertyKey in searchResult.Properties.PropertyNames) {
        ResultPropertyValueCollection valueCollection = searchResult.Properties[propertyKey];
        foreach (Object propertyValue in valueCollection) {
            Console.WriteLine(
            "{0}:{1}",
            propertyKey,
            propertyValue.ToString());
        }
    }
}
Console.ReadLine();
4

3 に答える 3

4

名前空間でPrincipalContextandを使用したソリューションを次にComputerPrincipal示します。System.DirectoryServices.AccountManagement

string machineOU;
using (var context = new PrincipalContext(ContextType.Domain))
using (var comp = ComputerPrincipal.FindByIdentity(context, Environment.MachineName))
{
    machineOU = String.Join(",", comp.DistinguishedName.Split(',')
                                                       .SkipWhile(s => !s.StartsWith("OU="))
                                                       .ToArray());
}

マシンの識別名の Linq 処理は、それをコンポーネント要素に分割し、最初の要素の前にある要素をスキップしてOU=...、残りを再結合します。これにより、含まれている OU の識別名が残ります。

より詳しい情報

名前空間のクラスは、System.DirectoryServices.AccountManagementさまざまな種類のセキュリティ プリンシパル (アカウント) のかなり高レベルの抽象化を提供します。

PrincipalContext、基本的にアカウント リポジトリの抽象化です。マシンのアカウント データベース ( PrincipalType.Machine)、Active Directory ドメインまたはグローバル カタログ ( PrincipalType.Domain)、または Active Directory アプリケーション パーティション ( PrincipalType.ApplicationDirectory) を参照できます。

new PrincipalContext(ContextType.Domain)PrincipalContextローカル Active Directory ドメインを表す を作成します。

このコンテキストを取得したらFindBy...()、さまざまなプリンシパル タイプ ( UserPrincipalComputerPrincipalまたはGroupPrincipal) で静的メソッドを使用して、探している AD オブジェクトを見つけることができます。

于 2012-08-01T23:20:01.807 に答える
0

私はグーグルで簡単な検索をして、これに関する多くの情報を見つけました。私はあなたが良い方向にいると思います、多分あなたのコードをこれらのリンクと比較してください:

ActiveDirectoryまたはここでスタックオーバーフローの組織単位のリストを取得する方法

于 2012-08-01T23:07:57.403 に答える
0

これは私のために働いたものです

IEnumerable<string> machineOU;
using (var context = new PrincipalContext(ContextType.Domain))
using (var comp = ComputerPrincipal.FindByIdentity(context, Environment.MachineName))
{
  machineOU = comp.DistinguishedName.Split(',').Where(s => s.StartsWith("OU="));
}
于 2012-11-14T16:51:31.443 に答える