2

私の .NET 2.0 C# アプリケーションでは、ユーザー (パスワード付き) が Active Directory のオプションを変更 (書き込み) できるかどうかを判断する必要があります。ADで新しいオブジェクトを作成してから削除せずにDirectoryEntryを使用する方法があることを願っています。

ご協力ありがとうございました。

4

2 に答える 2

9

オリーブが言ったように、自分でそれを正しく行うのは難しい. アクセス許可は Active Directory グループを介してユーザー アカウントに渡される可能性があるため、正しく行うのは困難です。したがって、特定のユーザー アカウントの有効な権限を確認するには、そのユーザーが属するすべてのグループを確認する必要があります。

幸いなことに、Active Directory には、構築された属性 と呼ばれる特別な種類の属性があります。デフォルトでは、AD Explorer または ADSI Edit を使用してオブジェクトを参照している場合、これらの種類の属性は表示されません。ADSI Edit では、これらの構築された属性を含めるようにフィルターを設定できます。ここで構築された有用な属性の 1 つは、allowedAttributesEffectiveです。これは複数値の属性であり、現在のユーザーが書き込み権限を持つすべての属性が含まれています。これは、Active Directory によってオンザフライで計算されます。すべての継承、オーバーライドの拒否、およびグループのアクセス許可を処理します。cn属性への書き込み権限がある場合、 cnが値の 1 つとして表示されます。

特定のユーザーが、Active Directory 上の特定のオブジェクトの特定の属性セットに対する書き込み権限を持っていることを確認するサンプルを次に示します。

static bool CheckWritePermission(string path, string username, string password, string[] properties)
{
    using (DirectoryEntry de = new DirectoryEntry(path, username, password))
    {
        de.RefreshCache(new string[] {"allowedAttributesEffective"});
        return properties.All( property => de.Properties["allowedAttributesEffective"].Contains(property));
    }
}

はい、それはまさにあなたが望むものではありません。ユーザーがWriteAllProperties権限を持っているかどうかを確認するよう求めています。実際、WriteAllPropertiesアクセス許可は、さまざまな属性に対する書き込みプロパティ アクセス許可のコレクションです。アプリケーションが本当に気にかけている属性を見つけるために、下調べをする必要があるかもしれません。次に、それらの属性を渡すだけです。

どの属性をチェックすればよいかわからない場合は、これで十分です。

static bool CheckWritePermission(string path, string username, string password)
{
    using (DirectoryEntry de = new DirectoryEntry(path, username, password))
    {
        de.RefreshCache(new string[] { "allowedAttributesEffective" });
        return de.Properties["allowedAttributesEffective"].Value != null;
    }            
}

ここでは、返されたallowedAttributesEffectiveが null かどうかを確認しています。null の場合、どの属性にも書き込む権限がないことを意味します。管理者がすべての書き込みプロパティのアクセス許可を付与するか、すべての書き込みプロパティを拒否すると想定しています。ほとんどの場合、これは有効な仮定だと思います。

于 2011-02-09T05:37:41.213 に答える
0

私の質問でわかるように、AD内の特定のオブジェクトに対するランダムユーザーの権限を単純に見つけることはできないようです。

誰かが簡単な方法を知っているなら、私に知らせてください。

于 2011-02-08T10:59:13.147 に答える