كيفية استخدام Visual Basic و ADsSecurity.dll لترتيب إدخالات التحكم بالوصول بشكل صحيح في ACL

ملخص

يوضح هذا المقال كيفية استخدام ADsSecurity.dll للحصول على واصف أمان (SD) لملف أو كائن "Active Directory"، أو مفتاح التسجيل. توضح هذه المقالة كيفية إجراء ذلك، مجرد SD الحصول، استرداد قائمة التحكم بالوصول المستقل (ACL) من أن التنمية المستدامة ثم قم بإضافة إدخال تحكم الوصول (ACE) في الموقع المناسب. كما توفر المقالة خوارزمية بسيطة جنبا إلى جنب مع مثال التعليمات برمجية ل Microsoft Visual Basic توضيح كيفية ترتيب ACL بشكل صحيح ثم اكتب قائمة التحكم في الوصول إلى التنمية المستدامة.

مزيد من المعلومات

إضافة أسلوب IADsAccessControlList::AddAce ACE في أعلى قائمة التحكم في الوصول. في بعض الحالات، سيتم إنشاء إضافة إدخال ACE أعلى الوصول الأمن غير مرغوب فيها. ترتيب واجهات خدمة الدليل النشط (ADSI) تخزين الخاصية المؤقت على نظام التشغيل Microsoft Windows Server 2003 ونظام التشغيل Windows XP بشكل صحيح DACL قبل كتابة مرة أخرى على الكائن. إعادة ترتيب مطلوب فقط على نظام التشغيل Microsoft Windows 2000. يتم ترتيب إدخالات التحكم بالوصول في ACL الصحيحة كما يلي:

تم رفض الوصول إلى إدخالات التحكم بالوصول التي تنطبق على الكائن نفسه
تم رفض الوصول إلى إدخالات التحكم بالوصول التي تنطبق على يكون تابعا للكائن، مثل تعيين الخاصية أو الخصائص
يسمح الوصول إلى إدخالات التحكم بالوصول التي تنطبق على الكائن نفسه
الوصول المسموح به إدخالات التحكم بالوصول التي تنطبق على يكون تابعا للكائن، مثل تعيين الخاصية أو الخصائص
في المنتجات المسردة في هذه المقالة، لا يعتمد واجهة IADsAccessControlList أسلوب أوامر ACL بشكل صحيح. يجب أن يتم فرز الأوراق الرابحة في هذه المجموعات الخمس:

تم رفض الوصول للكائن
تم رفض الوصول على التابعة أو الخاصية
السماح بالوصول للكائن
يسمح الوصول على التابعة أو الخاصية
كافة وراثة إدخالات التحكم بالوصول
الطلب الأس الموروثة ينبغي عدم تغيير. كافة ACEs الموروثة تمت إضافتها من قبل نظام التشغيل ومرتبة على النحو المناسب. تحديد مبرمج أنه يجب توارث ACE ونظام التشغيل Windows 2000 أو Windows NT سيتولى نشر ACE على الكائنات التابعة.

وهناك استثناء من قواعد النشر. إضافة إلى ACL كائن الأس لن تلقائياً الحصول على تطبيق للكائنات الموجودة في الشجرة. أنها مسؤولية المبرمج لتقود الشجرة ونشر ACE عن طريق إضافة ACE إلى كائنات موجودة. سيتم نشر ACE على كائنات جديدة في الشجرة الفرعية.

خوارزمية فرز إدخالات التحكم بالوصول في ACL

  1. الحصول على ACL المستقل (DACL) من واصف الأمان.
  2. تحقق من IADsAccessControlEntry::AceFlags لمعرفة ما إذا كان ACE الموروثة (التحقق من وجود ADS_ACEFLAG_INHERITED_ACE بت).
  3. تحقق من IADsAccessControlEntry::AceType لمعرفة نوع الوصول ACE منح وما يمنح الوصول (الكائن نفسه أو خصائص الكائن). توضح القائمة التالية قيم نوع إس والمقصود بها:
    ADS_ACETYPE_ACCESS_ALLOWED-تمنح الوصول المسموح به للكائن بأكمله
    يشير إلى ADS_ACETYPE_ACCESS_ALLOWED_OBJECT-مسموح بالوصول إلى خاصية أو مجموعة الخصائص
    ADS_ACETYPE_ACCESS_DENIED-يرفض الوصول إلى الكائن بأكمله
    ADS_ACETYPE_ACCESS_DENIED_OBJECT-يرفض الوصول إلى خاصية أو مجموعة الخصائص.
  4. وضع الأس في DACL المؤقتة المناسبة استناداً إلى قيمة IADsAccessControlListEntry::AceType.
  5. إعادة إنشاء ACL من Acl منفصلة بالترتيب التالي:
    أنواع الأس ADS_ACETYPE_ACCESS_DENIED
    أنواع الأس ADS_ACETYPE_ACCESS_DENIED_OBJECT
    أنواع الأس ADS_ACETYPE_ACCESS_ALLOWED
    أنواع الأس ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
    تعيين إدخالات التحكم بالوصول باستخدام علامة ADS_ACEFLAG_INHERITED_ACE في IADsAccessControlListEntry::AceFlags
  6. تعيين ACL جديدة إلى نفس مستوى المراجعة ACL القديم.
  7. استبدال ACL على واصف الأمان.

خطوات استخدام التعليمات البرمجية ل Visual Basic الموضح في هذه المقالة.

  1. تسجيل ADsSecurity.dll.


    ADsSecurity.dll جزء من واجهات خدمة الدليل النشط (ADSI) 2.5 Resource Kit. لتحميل مجموعة ADSI 2.5 الموارد، قم بزيارة موقع Microsoft التالي على الويب:استخدام Regsvr32 لتسجيل ADsSecurity.dll. إذا لم يتم تسجيل DLL بشكل صحيح، يشير هذا السلوك ADSI غير مثبت. إذا كان يتم تشغيل التعليمات البرمجية على جهاز كمبيوتر يستند إلى نظام التشغيل Microsoft Windows NT أو على جهاز كمبيوتر يستند إلى نظام التشغيل Microsoft Windows 98، تثبيت "ملحق العميل الدليل النشط" المناسب. لمزيد من المعلومات حول كيفية الحصول على هذه الأجهزة العميلة، راجع قسم "المراجع".
  2. بدء تشغيل Visual Basic. وبعد ذلك، إنشاء مشروع EXE قياسي.
  3. تتيح عرض مراجع المشروع. تأكد من أن المتابعة محددة:
    • مكتبة النوع DS النشطة
    • مكتبة النوع أدسيكوريتي مقاس 2.5 بوصة
  4. جعل زر أمر في النموذج.
  5. انقر نقراً مزدوجاً فوق زر الأمر. ثم قم بلصق التعليمة البرمجية التالية في معالج الأمر Command1_Click .

Visual Basic نموذج التعليمات البرمجية يوضح كيفية تنفيذ خوارزمية الفرز

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.

المراجع

للحصول على معلومات إضافية، انقر فوق رقم المقالة التالي لعرضها في "قاعدة معارف Microsoft":

كيفية استخدام Visual c + + لترتيب إدخالات التحكم بالوصول بشكل صحيح في ACL 269175

كيفية استخدام ADsSecurity.dll لإضافة إدخال تحكم بوصول إلى مجلد NTFS 279682

للحصول على معلومات إضافية حول كيفية تثبيت "ملحق العميل الدليل النشط"، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":

كيفية تثبيت ملحق العميل دليل Active 288358

خصائص

رقم الموضوع: 269159 - آخر مراجعة: 12‏/01‏/2017 - المراجعة: 1

تعليقات