ディレクトリ オブジェクトに ACE を設定するコード例
SetRight 関数を定義する
次のコード例では、Active Directory ドメイン Services の指定したオブジェクトのセキュリティ記述子の随意アクセス制御リスト (DACL) にアクセス制御エントリ (ACE) を追加する関数を定義します。 サブルーチンを使用すると、次のことが可能になります。
- オブジェクト全体へのアクセスを許可または拒否します。
- オブジェクトの特定のプロパティへのアクセスを許可または拒否します。
- オブジェクトの一連のプロパティへのアクセスを許可または拒否します。
- 特定の種類の子オブジェクトを作成する権限を付与または拒否します。
- すべての子オブジェクトまたは指定したオブジェクト クラスの子オブジェクトによって継承できる ACE を設定します。
次の Visual Basic コード例は、SetRight 関数を使用してさまざまな種類の ACE を設定する方法を示すいくつかのコード例です。
Const ACL_REVISION_DS = &H4
Public Function SetRight(objectDN As String, _
accessrights As Long, _
accesstype As Long, _
aceinheritflags As Long, _
objectGUID As String, _
inheritedObjectGUID As String, _
trustee As String) As Boolean
Dim dsobject As IADs
Dim sd As IADsSecurityDescriptor
Dim dacl As IADsAccessControlList
Dim newace As New AccessControlEntry
Dim lflags As Long
On Error GoTo Cleanup
' Bind to the specified object.
Set dsobject = GetObject(objectDN)
' Read the security descriptor on the object.
Set sd = dsobject.Get("ntSecurityDescriptor")
' Get the DACL from the security descriptor.
Set dacl = sd.DiscretionaryAcl
' Set the properties of the new ACE.
newace.AccessMask = accessrights
newace.AceType = accesstype
newace.AceFlags = aceinheritflags
newace.trustee = trustee
' Set the GUID for the object type or inherited object type.
lflags = 0
If Not objectGUID = vbNullString Then
newace.ObjectType = objectGUID
lflags = lflags Or &H1 'ADS_FLAG_OBJECT_TYPE_PRESENT
End If
If Not inheritedObjectGUID = vbNullString Then
newace.InheritedObjectType = inheritedObjectGUID
lflags = lflags Or &H2 'ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT
End If
If Not (lflags = 0) Then newace.Flags = lflags
' Set the ACL Revision.
dacl.AclRevision = ACL_REVISION_DS
' Add the ACE to the DACL and to the security descriptor.
dacl.AddAce newace
sd.DiscretionaryAcl = dacl
' Apply it to the object.
dsobject.Put "ntSecurityDescriptor", sd
dsobject.SetInfo
SetRight = True
Exit Function
Cleanup:
Set dsobject = Nothing
Set sd = Nothing
Set dacl = Nothing
Set newace = Nothing
SetRight = False
End Function
HRESULT SetRight(
IADs *pObject,
long lAccessMask,
long lAccessType,
long lAccessInheritFlags,
LPOLESTR szObjectGUID,
LPOLESTR szInheritedObjectGUID,
LPOLESTR szTrustee)
{
VARIANT varSD;
HRESULT hr = E_FAIL;
IADsAccessControlList *pACL = NULL;
IADsSecurityDescriptor *pSD = NULL;
IDispatch *pDispDACL = NULL;
IADsAccessControlEntry *pACE = NULL;
IDispatch *pDispACE = NULL;
long lFlags = 0L;
// The following code example takes the szTrustee in an expected naming format
// and assumes it is the name for the correct trustee.
// The application should validate the specified trustee.
if (!szTrustee || !pObject)
return E_INVALIDARG;
VariantInit(&varSD);
// Get the nTSecurityDescriptor.
// Type should be VT_DISPATCH - an IDispatch pointer to the security descriptor object.
hr = pObject->Get(_bstr_t("nTSecurityDescriptor"), &varSD);
if ( FAILED(hr) || varSD.vt != VT_DISPATCH ) {
wprintf(L"get nTSecurityDescriptor failed: 0x%x\n", hr);
return hr;
}
hr = V_DISPATCH( &varSD )->QueryInterface(IID_IADsSecurityDescriptor,(void**)&pSD);
if ( FAILED(hr) ) {
wprintf(L"QueryInterface for IADsSecurityDescriptor failed: 0x%x\n", hr);
goto cleanup;
}
// Get the DACL.
hr = pSD->get_DiscretionaryAcl(&pDispDACL);
if (SUCCEEDED(hr))
hr = pDispDACL->QueryInterface(IID_IADsAccessControlList,(void**)&pACL);
if ( FAILED(hr) ) {
wprintf(L"Could not get DACL: 0x%x\n", hr);
goto cleanup;
}
// Create the COM object for the new ACE.
hr = CoCreateInstance(
CLSID_AccessControlEntry,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsAccessControlEntry,
(void **)&pACE
);
if ( FAILED(hr) ) {
wprintf(L"Could not create ACE object: 0x%x\n", hr);
goto cleanup;
}
// Set the properties for the new ACE.
// Set the mask that specifies the access right.
hr = pACE->put_AccessMask( lAccessMask );
// Set the trustee.
hr = pACE->put_Trustee( szTrustee );
// Set AceType.
hr = pACE->put_AceType( lAccessType );
// Set AceFlags to specify whether other objects can inherit the ACE from the specified object.
hr = pACE->put_AceFlags( lAccessInheritFlags );
// If an szObjectGUID is specified, add ADS_FLAG_OBJECT_TYPE_PRESENT
// to the lFlags mask and set the ObjectType.
if (szObjectGUID)
{
lFlags |= ADS_FLAG_OBJECT_TYPE_PRESENT;
hr = pACE->put_ObjectType( szObjectGUID );
}
// If an szInheritedObjectGUID is specified, add ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT
// to the lFlags mask and set the InheritedObjectType.
if (szInheritedObjectGUID)
{
lFlags |= ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT;
hr = pACE->put_InheritedObjectType( szInheritedObjectGUID );
}
// Set flags if ObjectType or InheritedObjectType were set.
if (lFlags)
hr = pACE->put_Flags(lFlags);
// Add the ACE to the ACL to the SD to the cache to the object.
// Call the QueryInterface method for the IDispatch pointer to pass to the AddAce method.
hr = pACE->QueryInterface(IID_IDispatch, (void**)&pDispACE);
if (SUCCEEDED(hr))
{
// Set the ACL revision.
hr = pACL->put_AclRevision(ACL_REVISION_DS);
// Add the ACE.
hr = pACL->AddAce(pDispACE);
if (SUCCEEDED(hr))
{
// Write the DACL.
hr = pSD->put_DiscretionaryAcl(pDispDACL);
if (SUCCEEDED(hr))
{
// Write the ntSecurityDescriptor property to the property cache.
hr = pObject->Put(CComBSTR("nTSecurityDescriptor"), varSD);
if (SUCCEEDED(hr))
{
// Call SetInfo to update the property on the object in the directory.
hr = pObject->SetInfo();
}
}
}
}
cleanup:
if (pDispACE)
pDispACE->Release();
if (pACE)
pACE->Release();
if (pACL)
pACL->Release();
if (pDispDACL)
pDispDACL->Release();
if (pSD)
pSD->Release();
VariantClear(&varSD);
return hr;
}
オブジェクト全体へのアクセスを許可または拒否する
次の Visual Basic コード例では、Users コンテナーのバインド文字列をビルドし、SetRight 関数を呼び出して Users コンテナーに ACE を設定します。 次の使用例は、オブジェクトのプロパティを読み書きする権限をトラスティに付与する ACE を設定します。
Dim rootDSE As IADs
Dim objectDN As String
Dim bResult As Boolean
Const ADS_RIGHT_READ_PROP = &H10
Const ADS_RIGHT_WRITE_PROP = &H20
' Bind to the Users container in the local domain.
Set rootDSE = GetObject("LDAP://rootDSE")
objectDN = "LDAP://cn=users," & rootDSE.Get("defaultNamingContext")
' Grant trustee the right to read/write any property.
bResult = SetRight objectDN, _
ADS_RIGHT_READ_PROP Or ADS_RIGHT_WRITE_PROP, _
ADS_ACETYPE_ACCESS_ALLOWED, _
0, _
vbNullString, _
vbNullString, _
"someone@fabrikam.com" ' Trustee
If bResult = True Then
MsgBox ("The trustee can read or write any property.")
Else
MsgBox ("An error occurred.")
End If
次の C++ コード例では、オブジェクトのプロパティを読み書きするためのトラスティ アクセス許可を付与する ACE を設定します。 このコード例では、 pObject と szTrustee が有効な値に設定されていることを前提としています。 詳細については、「オブジェクトに対するアクセス権の設定」を参照してください。
HRESULT hr;
IADs *pObject;
LPWSTR szTrustee;
hr = SetRight(
pObject, // IADs pointer to the object
ADS_RIGHT_READ_PROP | ADS_RIGHT_WRITE_PROP,
ADS_ACETYPE_ACCESS_ALLOWED,
0, // Not inheritable
NULL, // No object type GUID
NULL, // No inherited object type GUID
szTrustee
);
オブジェクトの特定のプロパティへのアクセスを許可または拒否する
このコード例では、SetRight 関数を呼び出して、トラスティにオブジェクトの特定のプロパティの読み取りまたは書き込みの権限を付与します。 プロパティの schemaIDGUID を指定する必要があり、これがオブジェクト固有の ACE であることを示すADS_ACETYPE_ACCESS_ALLOWED_OBJECTを指定する必要があることに注意してください。 このコード例では、ACE が 子オブジェクトによって継承できることを示すADS_ACEFLAG_INHERIT_ACE フラグも指定します。
' Grant trustee the right to read the Telephone-Number property
' of all child objects in the Users container.
' {bf967a49-0de6-11d0-a285-00aa003049e2} is the schemaIDGUID of
' the Telephone-Number property.
bResult = SetRight objectDN, _
ADS_RIGHT_WRITE_PROP Or ADS_RIGHT_READ_PROP, _
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT, _
ADS_ACEFLAG_INHERIT_ACE, _
"{bf967a49-0de6-11d0-a285-00aa003049e2}", _
vbNullString, _
"someone@fabrikam.com" ' Trustee
If bResult = True Then
MsgBox ("The trustee can read the telephone number property.")
Else
MsgBox ("An error occurred.")
End If
// Grant trustee the right to read the Telephone-Number property
// of all child objects in the Users container.
// {bf967a49-0de6-11d0-a285-00aa003049e2} is the schemaIDGUID of
// the Telephone-Number property.
hr = SetRight(
pObject, // IADs pointer to the object.
ADS_RIGHT_READ_PROP | ADS_RIGHT_WRITE_PROP,
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT,
ADS_ACEFLAG_INHERIT_ACE,
L"{bf967a49-0de6-11d0-a285-00aa003049e2}",
NULL, // No inherited object type GUID.
szTrustee
);
オブジェクトの一連のプロパティへのアクセスを許可または拒否する
このコード例では、SetRight 関数を呼び出して、トラスティにオブジェクトの特定のプロパティ セットの読み取りまたは書き込みの権限を付与します。 ADS_ACETYPE_ACCESS_ALLOWED_OBJECTを指定して、これがオブジェクト固有の ACE であることを示します。
プロパティ セットは、Configuration パーティションの Extended Rights コンテナー内の controlAccessRight オブジェクトによって定義されます。 ACE で設定されたプロパティを識別するには、controlAccessRight オブジェクトの rightsGUID プロパティを 指定 します。 このプロパティ セット GUID は、プロパティ セットに含まれるすべての attributeSchema オブジェクトの attributeSecurityGUID プロパティにも設定されていることに注意してください。 詳細については、「アクセス権の制御」を参照してください。
このコード例では、ACE を子オブジェクトによって継承可能として設定するが、イミディエイト オブジェクトでは効果がない継承フラグも指定します。 さらに、サンプルでは User クラスの GUID を指定します。これは、ACE がそのクラスのオブジェクトによってのみ継承できることを示します。
' Grant trustee permission to read or write a set of properties.
' {77B5B886-944A-11d1-AEBD-0000F80367C1} is a GUID that identifies
' a property set.
' {bf967aba-0de6-11d0-a285-00aa003049e2} is a GUID that identifies the
' User class, so this ACE is inherited only by objects of that class.
bResult = SetRight objectDN, _
ADS_RIGHT_READ_PROP Or ADS_RIGHT_WRITE_PROP, _
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT, _
ADS_ACEFLAG_INHERIT_ACE Or ADS_ACEFLAG_INHERIT_ONLY_ACE, _
"{77B5B886-944A-11d1-AEBD-0000F80367C1}", _
"{bf967aba-0de6-11d0-a285-00aa003049e2}", _
"someone@fabrikam.com" ' Trustee
If bResult = True Then
MsgBox ("The trustee can read or write a set of properties.")
Else
MsgBox ("An error occurred.")
End If
// Grant trustee the right to read or write a set of properties.
// {77B5B886-944A-11d1-AEBD-0000F80367C1} is a GUID that identifies
// a property set (rightsGUID of a controlAccessRight object).
// {bf967aba-0de6-11d0-a285-00aa003049e2} is the schemaIDGUID of the
// User class, so this ACE is inherited only by objects of that class.
hr = SetRight(
pObject, // IADs pointer to the object.
ADS_RIGHT_READ_PROP | ADS_RIGHT_WRITE_PROP,
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT,
ADS_ACEFLAG_INHERIT_ACE | ADS_ACEFLAG_INHERIT_ONLY_ACE,
L"{77B5B886-944A-11d1-AEBD-0000F80367C1}",
L"{bf967aba-0de6-11d0-a285-00aa003049e2}",
szTrustee
);
特定の種類の子オブジェクトを作成するためのアクセス許可を付与または拒否する
次のコード例では、SetRight 関数を呼び出して、指定したトラスティに、指定したオブジェクトの下のサブツリー内の User オブジェクトを作成および削除する権限を付与します。 サンプルでは User クラスの GUID を指定していることに注意してください。つまり、ACE はトラスティのみが他のクラスのオブジェクトではなく User オブジェクトを作成することを許可します。 ADS_ACETYPE_ACCESS_ALLOWED_OBJECTを指定して、これがオブジェクト固有の ACE であることを示します。
' Grant trustee the right to create or delete User objects
' in the specified object.
' {bf967aba-0de6-11d0-a285-00aa003049e2} is a GUID that identifies the
' User class.
bResult = SetRight objectDN, _
ADS_RIGHT_DS_CREATE_CHILD Or ADS_RIGHT_DS_DELETE_CHILD, _
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT, _
0, _
"{bf967aba-0de6-11d0-a285-00aa003049e2}", _
vbNullString, _
"jeffsmith@fabrikam.com" 'trustee
If bResult = True Then
MsgBox ("The trustee can create or delete User objects.")
Else
MsgBox ("An error occurred.")
End If
// Grant trustee the right to create or delete User objects
// in the specified object.
// {bf967aba-0de6-11d0-a285-00aa003049e2} is the schemaIDGUID of the
// User class.
hr = SetRight(
pObject, // IADs pointer to the object.
ADS_RIGHT_DS_CREATE_CHILD | ADS_RIGHT_DS_DELETE_CHILD,
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT,
0, // Not inheritable.
L"{bf967aba-0de6-11d0-a285-00aa003049e2}",
NULL, // No inherited object type GUID.
szTrustee
);
詳細と、定義済みの属性またはクラスの schemaIDGUID については、Active Directory スキーマ リファレンスの属性またはクラスのリファレンス ページを参照してください。 詳細と、プログラムで schemaIDGUID を取得するために使用できるコード例については、「attributeSchema オブジェクトと classSchema オブジェクトの読み取り」を参照してください。