Jak pomocí jazyka Visual Basic a ADsSecurity.dll správně objednávky ACE v seznam ACL

Prohlášení o odmítnutí odpovědnosti pro už nepodporovaný obsah KB

Tento článek byl napsán pro produkty, ke kterým již Microsoft nadále nenabízí podporu. Článek je tedy poskytován „tak, jak je“ a nebude už nadále aktualizován.

Souhrn

Tento článek ukazuje, jak použít ADsSecurity.dll získání popisovače zabezpečení (SD) k souboru, objekt služby Active Directory nebo klíč registru. Tento článek ukazuje, jak byl získán SD, načíst seznam řízení přístupu (ACL) z tohoto SD a pak přidat položky řízení přístupu (ACE) do správného umístění. Tento článek poskytuje jednoduchý algoritmus společně s Microsoft Visual Basic příklad kódu znázorňující způsob správně objednávky seznam ACL pak zapisovat seznam ACL SD.

Další informace

Metoda IADsAccessControlList::AddAce přidá ESO v horní části seznamu ACL. V některých případech přidáním ACE nahoře vytvoří nežádoucí zabezpečení přístupu. Mezipaměť vlastností služby rozhraní ADSI (Active Directory) na serveru Microsoft Windows Server 2003 a Microsoft Windows XP správně Seřadí seznam DACL před zápis zpět na objekt. Změna pořadí je požadována pouze v systému Microsoft Windows 2000. Správné pořadí ACE v seznamu ACL je následující:

Přístup odepřen ACE, které platí pro samotného objektu
Přístup odepřen ACE, které platí pro podřízený objekt, například sada vlastností nebo vlastnosti
Přístup povolen ACE, které platí pro samotného objektu
Přístup povolen ACE, které platí pro podřízený objekt, například sada vlastností nebo vlastnosti
V produktech uvedených v tomto článku rozhraní IADsAccessControlList nepodporuje metodu správně objednávky seznam ACL. Položky řízení přístupu musí být seřazeny do těchto pět skupin:

Přístup odepřen na objekt
Přístup odepřen na podřízené nebo vlastnost
Povolen přístup k objektu.
Povolen přístup na podřízené nebo vlastnost
Všechny zděděné ACE
Pořadí zděděných záznamů ACE by neměla být měněna. Všechny zděděné ACE jsou přidány pomocí operačního systému a jsou vhodným způsobem uspořádány. Programátor můžete určit, zda má být zděděna ACE a systém Windows 2000 nebo Windows NT se postará o šíření ACE na podřízené objekty.

Je výjimkou pravidla šíření. ACE přidán do seznamu řízení Přístupu objektu nebude získat automaticky použita existující objekty ve stromu. Je odpovědností programátora ukázat stromu a šíření ACE přidáním ACE existující objekty. ACE bude rozšířeno na nové objekty v podstromu.

Algoritmus pro řazení ACE v seznam ACL

  1. Získáte popisovač zabezpečení volitelného seznamu řízení Přístupu (DACL).
  2. Zkontrolujte, zda IADsAccessControlEntry::AceFlags zobrazíte, pokud byl ACE zděděna (Kontrola ADS_ACEFLAG_INHERITED_ACE bit).
  3. Zkontrolujte, zda IADsAccessControlEntry::AceType Chcete-li zjistit, jaký typ přístupu, kterou uděluje ESO a přístup udělen (samotného objektu nebo vlastnosti objektu). Následující seznam popisuje hodnoty typu ACE a jejich význam:
    ADS_ACETYPE_ACCESS_ALLOWED - udělí povolený přístup k celý objekt
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT - označuje, zda je povolen přístup k vlastnosti nebo sadu vlastností
    ADS_ACETYPE_ACCESS_DENIED - odepře přístup pro celý objekt
    ADS_ACETYPE_ACCESS_DENIED_OBJECT - odepírá přístup k vlastnosti nebo sadu vlastností.
  4. Místo ACE v příslušné dočasné DACL na základě hodnoty IADsAccessControlListEntry::AceType.
  5. Znovu sestavit seznam ACL ze samostatné seznamy ACL v následujícím pořadí:
    Typy ADS_ACETYPE_ACCESS_DENIED ACE
    Typy ADS_ACETYPE_ACCESS_DENIED_OBJECT ACE
    Typy ADS_ACETYPE_ACCESS_ALLOWED ACE
    Typy ADS_ACETYPE_ACCESS_ALLOWED_OBJECT ACE
    ACE s ADS_ACEFLAG_INHERITED_ACE příznak nastavit IADsAccessControlListEntry::AceFlags
  6. Nastavte nové ACL stejnou úroveň revize jako staré ACL.
  7. Nahrazení ACL na popisovač zabezpečení.

Postup použití kódu jazyka Visual Basic, které jsou uvedeny v tomto článku

  1. Registrovat ADsSecurity.dll.


    ADsSecurity.dll je součástí sady Resource Kit služby rozhraní ADSI (Active Directory) 2.5. Stáhnout ADSI 2.5 Resource kit, navštivte následující Web společnosti Microsoft:Regsvr32 použijte k evidenci ADsSecurity.dll. Pokud tato Knihovna nezaregistruje správně, označuje toto chování, že rozhraní ADSI není nainstalována. Pokud používáte kód v počítači se systémem Microsoft Windows NT nebo v počítači se systémem Microsoft Windows 98, nainstalujte příslušné rozšíření klienta služby Active Directory. Další informace o získání těchto klientů naleznete v části "Odkazy".
  2. Spusťte aplikaci Visual Basic. Vytvořte Standardní EXE projektu.
  3. Zobrazte odkazy pro tento projekt. Ujistěte se, zda jsou vybrány sledování:
    • Knihovna typů Active DS
    • Knihovna typů ADsSecurity 2.5
  4. Vytvořit příkazové tlačítko ve formuláři.
  5. Poklepejte na příkazové tlačítko. Vložte následující kód v obslužné rutině příkaz Command1_Click .

Ukázkový kód jazyka Visual Basic ukazuje, jak implementovat algoritmus třídění

Dim sec As New ADsSecurityDim sd As IADsSecurityDescriptor
Dim dacl As IADsAccessControlList
Dim ace As IADsAccessControlEntry
Dim newAce As New AccessControlEntry
'
' Declare temporary ACLs for sorting the original
' ACL
'
Dim newdacl As New AccessControlList
Dim ImpDenyDacl As New AccessControlList
Dim ImpDenyObjectDacl As New AccessControlList
Dim InheritedDacl As New AccessControlList
Dim ImpAllowDacl As New AccessControlList
Dim impAllowObjectDacl As New AccessControlList

Private Sub Command1_Click()
'
' Be sure to register ADsSecurity.Dll using RegSvr32 and
' adding the ADsSecurity2.5 Type Library to you references for
' the project.
'
' Using the ADsSecurity object, retrieve a SD for an object. Just
' Replace the LDAP:// path with the path of an object that contains a
' SD. For additional details on valid path strings, review
' the information stored in the Platform SDK ADSI samples starting with
' "<Platform SDK Root>\Samples\NetDs\ADSI\rtk.htm"
'
Set sec = CreateObject("ADsSecurity")<BR/>
' TODO : replace the servername and DN of the object you want to modify.
Set sd = sec.GetSecurityDescriptor("LDAP://MyDCname/cn=MyUser,cn=Users,dc=MyDom,dc=com")

'Displaying the ACE in the DACL --- it's the same way you display ACEs for File, File Share, Registry, Exchange, and Active Directory's ACL.

Set dacl = sd.DiscretionaryAcl
Debug.Print Date & Time & "Initial Values of DACL"
For Each ace In dacl
Debug.Print ace.Trustee
Debug.Print Hex(ace.AccessMask)
Debug.Print Hex(ace.AceType)
Debug.Print Hex(ace.AceFlags)
Debug.Print Hex(ace.Flags)
Next

Debug.Print dacl.AceCount

'
' Initialize all of the new ACLs
'
' If you are doing this in VBSscript you will need to use
' The following methods of creating the ACL bins instead of
' using the Dim As New statements above.
'
'Set newAce = CreateObject("AccessControlEntry")
'Set newdacl = CreateObject("AccessControlList")
'Set InheritedDacl = CreateObject("AccessControlList")
'Set ImpAllowDacl = CreateObject("AccessControlList")
'Set InhAllowDacl = CreateObject("AccessControlList")
'Set ImpDenyObjectDacl = CreateObject("AccessControlList")
'Set ImpAllowObjectDacl = CreateObject("AccessControlList")
'
'
' Create a new ace, this one
' sets an extended right on the user object that allows the
' trustee to read and write the userAccountControl property of an
' user object.
'
' TODO : Replace the trustee with an appropriate trustee on the domain
' in question.
'
newAce.Trustee = "MyDomain\Myuser"
newAce.Flags = ADS_FLAG_OBJECT_TYPE_PRESENT
newAce.ObjectType = "{BF967A68-0DE6-11D0-A285-00AA003049E2}"
newAce.AccessMask = ADS_RIGHT_DS_READ_PROP Or ADS_RIGHT_DS_WRITE_PROP
newAce.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
newAce.AceFlags = ADS_ACEFLAG_INHERIT_ACE
'
' Place the new ace in the DACL
'
dacl.AddAce newAce
'
' Sift the DACL into 5 bins:
' Inherited Aces
' Implicit Deny Aces
' Implicit Deny Object Aces
' Implicit Allow Aces
' Implicit Allow object aces
'
For Each ace In dacl
'
' Sort the original ACEs into their appropriate
' ACLs
'
Debug.Print ace.Trustee
If ((ace.AceFlags And ADS_ACEFLAG_INHERITED_ACE) = ADS_ACEFLAG_INHERITED_ACE) Then
'
' Do not really care about the order of inherited aces. Since we are
' adding them to the top of a new list, when they are added back
' to the Dacl for the object, they will be in the same order as
' they were originally. Just a positive side effect of adding items
' of a LIFO (Last In First Out) type list.
'
InheritedDacl.AddAce ace
Else
'
' We have an Implicit ACE, let's put it the proper pool
'
Select Case ace.AceType
Case ADS_ACETYPE_ACCESS_ALLOWED
'
' We have an implicit allow ace
'
ImpAllowDacl.AddAce ace
Case ADS_ACETYPE_ACCESS_DENIED
'
' We have an implicit Deny ACE
'
ImpDenyDacl.AddAce ace
Case ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
'
' We have an object allowed ace
' Does it apply to a property? or an Object?
'
impAllowObjectDacl.AddAce ace
Case ADS_ACETYPE_ACCESS_DENIED_OBJECT
'
' We have an object Deny ace
'
ImpDenyObjectDacl.AddAce ace
Case Else
'
' Missed a bin?
'
Debug.Print "Bad ace...." & Hex(ace.AceType)
End Select
End If
Next
'
' Combine the ACEs in the proper order
' Implicit Deny
' Implicit Deny Object
' Implicit Allow
' Implicit Allow Object
' Inherited aces
'
' Implicit Deny
'
For Each ace In ImpDenyDacl
newdacl.AddAce ace
Next
'
' Implicit Deny Object
'
For Each ace In ImpDenyObjectDacl
newdacl.AddAce ace
Next
'
' Implicit Allow
'
For Each ace In ImpAllowDacl
newdacl.AddAce ace
Next
'
' Implicit Allow Object
'
For Each ace In impAllowObjectDacl
newdacl.AddAce ace
Next
'
' Inherited Aces
'
For Each ace In InheritedDacl
newdacl.AddAce ace
Next

sd.DiscretionaryAcl = newdacl
Debug.Print Date
For Each ace In newdacl
Debug.Print ace.Trustee
Debug.Print "Ace Mask: " & Hex(ace.AccessMask)
Debug.Print "Ace Type: " & Hex(ace.AceType)
Debug.Print "Ace Flags: " & Hex(ace.AceFlags)
Debug.Print "Object Type value: " & Hex(ace.Flags)
Debug.Print "Object Guid : " & ace.ObjectType
Next
'
' Set the appropriate revision level
' for the DACL
'
newdacl.AclRevision = dacl.AclRevision
'
' Replace the Security Descriptor
'
sec.SetSecurityDescriptor sd
' If this generates the error -214023559 or 80070539 check your TODO
' strings. This error is most likely a problem with DNS name resolution.

Odkazy

Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:

Jak 269175 správně objednávky ACE v seznam ACL pomocí Visual C++

Jak přidat položku řízení přístupu do složky NTFS pomocí ADsSecurity.dll 279682

Další informace o instalaci rozšíření klienta služby Active Directory klepněte na následující číslo článku databáze Microsoft Knowledge Base:

288358 postupy: Instalace rozšíření klienta služby Active Directory

Vlastnosti

ID článku: 269159 - Poslední kontrola: 12. 1. 2017 - Revize: 1

Váš názor