Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Definieren der SetRight-Funktion
Im folgenden Codebeispiel wird eine Funktion definiert, die der DACL (Discretionary Access Control List) des Sicherheitsdeskriptors eines angegebenen Objekts in Active Directory Domain Services einen Zugriffssteuerungseintrag (Access Control Entry, ACE) hinzufügt. Die Unterroutine ermöglicht Folgendes:
- Gewähren oder Verweigern des Zugriffs auf das gesamte Objekt.
- Gewähren oder Verweigern des Zugriffs auf eine bestimmte Eigenschaft für das Objekt.
- Gewähren oder Verweigern des Zugriffs auf eine Reihe von Eigenschaften für das Objekt.
- Erteilen oder verweigern Sie das Recht, einen bestimmten Typ von untergeordnetem Objekt zu erstellen.
- Legen Sie eine ACE fest, die von allen untergeordneten Objekten oder von untergeordneten Objekten einer angegebenen Objektklasse geerbt werden kann.
Im Folgenden dieses Visual Basic-Codebeispiels sind mehrere Codebeispiele aufgeführt, die zeigen, wie Sie die SetRight--Funktion verwenden, um verschiedene Typen von ACEs festzulegen.
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;
}
Gewähren oder Verweigern des Zugriffs auf das gesamte Objekt
Im folgenden Visual Basic-Codebeispiel wird eine Bindungszeichenfolge für den Benutzercontainer erstellt und anschließend die SetRight--Funktion aufgerufen, um eine ACE für den Benutzercontainer festzulegen. In diesem Beispiel wird eine ACE festgelegt, die dem Trustee das Recht gewährt, eine eigenschaft für das Objekt zu lesen oder zu schreiben.
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
Im folgenden C++-Codebeispiel wird eine ACE festgelegt, die dem Trustee die Berechtigung zum Lesen oder Schreiben von Eigenschaften für das Objekt gewährt. Im Codebeispiel wird davon ausgegangen, dass pObject- und szTrustee- auf gültige Werte festgelegt sind. Weitere Informationen finden Sie unter Festlegen von Zugriffsrechten für ein Objekt.
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
);
Gewähren oder Verweigern des Zugriffs auf eine bestimmte Eigenschaft für das Objekt
In diesem Codebeispiel wird die SetRight--Funktion aufgerufen, um dem Trustee das Recht zum Lesen oder Schreiben einer bestimmten Eigenschaft für das Objekt zu gewähren. Beachten Sie, dass Sie die schemaIDGUID- der Eigenschaft angeben müssen, und Sie müssen ADS_ACETYPE_ACCESS_ALLOWED_OBJECT angeben, um anzugeben, dass es sich um eine objektspezifische ACE handelt. In diesem Codebeispiel wird auch das ADS_ACEFLAG_INHERIT_ACE Flag angegeben, das angibt, dass die ACE von untergeordneten Objekten geerbt werden kann.
' 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
);
Gewähren oder Verweigern des Zugriffs auf eine Reihe von Eigenschaften für das Objekt
In diesem Codebeispiel wird die SetRight--Funktion aufgerufen, um dem Trustee das Recht zu gewähren, einen bestimmten Satz von Eigenschaften für das Objekt zu lesen oder zu schreiben. Geben Sie ADS_ACETYPE_ACCESS_ALLOWED_OBJECT an, um anzugeben, dass es sich um eine objektspezifische ACE handelt.
Ein Eigenschaftensatz wird durch ein controlAccessRight-Objekt im Container "Erweiterte Rechte" der Konfigurationspartition definiert. Um den Eigenschaftensatz in der ACE zu identifizieren, geben Sie die rightsGUID- Eigenschaft eines controlAccessRight--Objekts an. Beachten Sie, dass diese Eigenschaftensatz-GUID auch in der attributSecurityGUID- Eigenschaft jedes attributSchema- Objekts festgelegt wird, das im Eigenschaftensatz enthalten ist. Weitere Informationen finden Sie unter Control Access Rights.
In diesem Codebeispiel werden auch Vererbungskennzeichnungen angegeben, die die ACE als vererbbar von untergeordneten Objekten festlegen, jedoch ineffektiv für das unmittelbare Objekt. Darüber hinaus gibt das Beispiel die GUID der User-Klasse an, die angibt, dass die ACE nur von Objekten dieser Klasse geerbt werden kann.
' 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
);
Erteilen oder Verweigern der Berechtigung zum Erstellen eines bestimmten Typs untergeordneten Objekts
Im folgenden Codebeispiel wird die SetRight--Funktion aufgerufen, um einem angegebenen Truste das Recht zum Erstellen und Löschen von Benutzerobjekten in der Unterstruktur unter dem angegebenen Objekt zu gewähren. Beachten Sie, dass das Beispiel die GUID der User-Klasse angibt. Dies bedeutet, dass die ACE nur das Erstellen von Benutzerobjekten und nicht von Objekten anderer Klassen zulässt. Geben Sie ADS_ACETYPE_ACCESS_ALLOWED_OBJECT an, um anzugeben, dass es sich um eine objektspezifische ACE handelt.
' 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
);
Weitere Informationen und die schemaIDGUID- eines vordefinierten Attributs oder einer vordefinierten Klasse finden Sie auf der Attribut- oder Klassenreferenzseite im Active Directory-Schema Referenz. Weitere Informationen und ein Codebeispiel, das zum programmgesteuerten Abrufen eines schemaIDGUID- verwendet werden kann, finden Sie unter Reading attributeSchema und classSchema Objects.