次の方法で共有


セキュリティ記述子の管理

オブジェクトの属性を変更しても、すべてのタスクを実行できるわけではありません。ときには、オブジェクトのセキュリティ記述子を変更しなければならないこともあります。たとえば、既定では、通常のユーザーは各自の属性のほとんどを読み取ることができますが、変更はできません。場合によっては、ユーザーが自分の電話番号の読み取りと書き込みの両方を行えるようにする必要があります。これを行うには、アクセス制御エントリ (ACE : Access Control Entry) をユーザー オブジェクトの随意アクセス制御リスト (DACL : Discretionary Access Control List) に追加します。この ACE は、telephoneNumber プロパティへの書き込みアクセスを許可する Allow ACE です。telephoneNumber プロパティの詳細については、MSDN ライブラリ (https://go.microsoft.com/fwlink/?LinkID=27252) で telephoneNumber または Telephone-Number に関するページを参照してください。

.NET Framework の Version 1.0 および 1.1 では、Active Directory オブジェクトのセキュリティ記述子を変更するためのネイティブ サポートはありません。Active Directory オブジェクトのセキュリティ記述子を操作するには、ADSI を呼び出して、IADsSecurityDescriptor および関連付けられたインターフェイスを使用します。詳細については、「ADSI の呼び出し」を参照してください。IADsSecurityDescriptor インターフェイスの詳細については、MSDN ライブラリ (https://go.microsoft.com/fwlink/?LinkID=27252) で IADsSecurityDescriptor インターフェイスに関するページを参照してください。

.NET Framework 2.0 では、System.DirectoryServices 名前空間に、ADSI を呼び出すことなくセキュリティ記述子の操作を可能にするクラスがいくつか含まれています。Active Directory オブジェクト セキュリティ記述子と共に使用されるプライマリ クラスは ActiveDirectorySecurity です。ObjectSecurity プロパティを使用すると、Active Directory オブジェクトのセキュリティ記述子を表す ActiveDirectorySecurity オブジェクトを取得できます。

ActiveDirectorySecurity クラスには、オブジェクトの随意アクセス制御リストおよびセカンダリ アクセス制御リストの読み取りと変更を可能にするメソッドとプロパティがあります。

随意アクセス制御リストのアクセス制御エントリは、アクセス規則とも呼ばれます。アクセス規則を表すプライマリ クラスは、ActiveDirectoryAccessRule クラスです。ActiveDirectoryAccessRule クラスから派生し、特定の種類のアクセス規則を表すために使用されるクラスもいくつかあります。次の表に、これらの特定のクラスとその用途を示します。

クラス 用途

CreateChildAccessRule

Active Directory オブジェクトに対して子オブジェクトを作成する権限を許可または拒否するために使用されるアクセス規則を表します。

DeleteChildAccessRule

Active Directory オブジェクトに対して子オブジェクトを削除する権限を許可または拒否するために使用されるアクセス規則を表します。

DeleteTreeAccessRule

Active Directory オブジェクトに対してすべての子オブジェクトを削除する権限を許可または拒否するために使用されるアクセス規則を表します。

ExtendedRightAccessRule

Active Directory オブジェクトに対して拡張権利を許可または拒否するために使用されるアクセス規則を表します。

ListChildrenAccessRule

Active Directory オブジェクトに対して子オブジェクトを一覧表示する権限を許可または拒否するために使用されるアクセス規則を表します。

PropertyAccessRule

Active Directory プロパティへのアクセスを許可または拒否するために使用されるアクセス規則を表します。

PropertySetAccessRule

Active Directory プロパティ セットへのアクセスを許可または拒否するために使用されるアクセス規則を表します。

システム アクセス制御リストのアクセス制御エントリは、監査規則とも呼ばれます。これは、ActiveDirectoryAuditRule クラスによって表されます。

多くの場合、何かへのアクセスを許可または拒否するためにオブジェクトごとにアクセス規則を追加することは実用的ではありません。このような場合は、コンテナのセキュリティ記述子を変更し、アクセス規則を継承可能にする方法が適切です。また、これにより、新しいオブジェクトが作成されたときに、それらが適切なアクセス許可を自動的に取得するようになります。前の telephoneNumber の例では、すべてのユーザーに自分の電話番号への書き込みアクセスを許可しなければならないこともあります。これを行う最も簡単な方法は、組織単位などのコンテナに継承可能なアクセス規則を追加し、すべてのユーザーをその組織単位の下に配置することです。これを行う方法を次のコード例に示します。

次の Visual Basic .NET の例は、ユーザー オブジェクトであるコンテナの子すべてに telephoneNumber プロパティへの書き込みアクセスを許可するアクセス規則を、コンテナに追加する方法を示しています。telephoneNumber プロパティの詳細については、MSDN ライブラリ (https://go.microsoft.com/fwlink/?LinkID=27252) で telephoneNumber または Telephone-Number に関するページを参照してください。

Sub SetWritePhonePermission(ByVal container As DirectoryEntry)
    Try
        ' Get the ActiveDirectorySecurity for the container.
        Dim containerSecurity As ActiveDirectorySecurity
        containerSecurity = container.ObjectSecurity

        ' Create a SecurityIdentifier object for "self".
        Dim selfSid As New SecurityIdentifier(WellKnownSidType.SelfSid, _
            Nothing)

        ' Get the schema for the currently logged on user.
        Dim schema As ActiveDirectorySchema
        schema = ActiveDirectorySchema.GetCurrentSchema()

        ' Get the telephoneNumber schema property object.
        Dim phoneProperty As ActiveDirectorySchemaProperty
        phoneProperty = schema.FindProperty("telephoneNumber")

        ' Get the user schema class object.
        Dim userClass As ActiveDirectorySchemaClass
        userClass = schema.FindClass("user")

        ' Create a property access rule to allow a user to write to their own telephoneNumber property.
        Dim allowWritePhoneRule As New PropertyAccessRule(selfSid, _
            AccessControlType.Allow, _
            PropertyAccess.Write, _
            phoneProperty.SchemaGuid, _
            ActiveDirectorySecurityInheritance.Descendents, _
            userClass.SchemaGuid)

        ' Add the access rule to the DACL.
        container.ObjectSecurity.AddAccessRule(allowWritePhoneRule)

        ' Commit the changes.
        container.CommitChanges()

    Catch notFoundEx As ActiveDirectoryObjectNotFoundException
        ' The schema class or property could not be found.
    End Try

End Sub 'SetWritePhonePermission

次の C# の例は、ユーザー オブジェクトであるコンテナの子すべてに telephoneNumber プロパティへの書き込みアクセスを許可するアクセス規則を、コンテナに追加する方法を示しています。telephoneNumber プロパティの詳細については、MSDN ライブラリ (https://go.microsoft.com/fwlink/?LinkID=27252) で telephoneNumber または Telephone-Number に関するページを参照してください。

static void SetWritePhonePermission(DirectoryEntry container)
{
    try
    {
        // Get the ActiveDirectorySecurity for the container.
        ActiveDirectorySecurity containerSecurity = container.ObjectSecurity;

        // Create a SecurityIdentifier object for "self".
        SecurityIdentifier selfSid =
            new SecurityIdentifier(WellKnownSidType.SelfSid, null);

        // Get the schema for the currently logged on user.
        ActiveDirectorySchema schema = ActiveDirectorySchema.GetCurrentSchema();

        // Get the telephoneNumber schema property object.
        ActiveDirectorySchemaProperty phoneProperty = schema.FindProperty("telephoneNumber");

        // Get the user schema class object.
        ActiveDirectorySchemaClass userClass = schema.FindClass("user");

        // Create a property access rule to allow a user to write to their own telephoneNumber property.
        PropertyAccessRule allowWritePhoneRule =
            new PropertyAccessRule(
                selfSid,
                AccessControlType.Allow,
                PropertyAccess.Write,
                phoneProperty.SchemaGuid,
                ActiveDirectorySecurityInheritance.Descendents,
                userClass.SchemaGuid);

        // Add the access rule to the DACL.
        container.ObjectSecurity.AddAccessRule(allowWritePhoneRule);

        // Commit the changes.
        container.CommitChanges();
    }
    catch (ActiveDirectoryObjectNotFoundException)
    {
        // The schema class or property could not be found.
    }
}

関連項目

リファレンス

System.DirectoryServices
ActiveDirectorySecurity
ActiveDirectoryAccessRule
ActiveDirectoryAuditRule

概念

システム管理タスク

Send comments about this topic to Microsoft.

Copyright © 2007 by Microsoft Corporation. All rights reserved.