在物件上設定訪問許可權

使用 ADSI COM 物件 IADsSecurityDescriptor (安全性描述元)、IADsAccessControlList (DACLs 和 SCL),以及 IADsAccessControlEntry (ACE) 將 ACE 新增至 ACL 時,您要變更屬性快取中指定物件的 nTSecurityDescriptor 属性。 這表示必須將方法放在包含新 ACE 和 IADs.SetInfo 方法的物件上,才能從屬性快取將更新的安全性描述元寫入目錄。

如需詳細資訊和在 Active Directory 網域服務 中設定物件 ACE 的程式代碼範例,請參閱在 Directory 物件上設定 ACE 的範例程式代碼。

使用下列一般程式建立 ACE 以取得存取權,並在物件的 DACL 上設定 ACE。

  1. 取得物件的 IADs 介面指標。

  2. 使用 IADs.Get 方法來取得物件的安全性描述元。 包含安全性描述元的屬性名稱是 nTSecurityDescriptor。 屬性會以包含 IDispatch 指標的 VARIANT 形式傳回(vt 成員為VT_DISPATCH)。 在該 IDispatch 指標上呼叫 QueryInterface,以取得 IADsSecurityDescriptor 介面,以使用該介面上的 方法來存取安全性描述元的 ACL。

  3. 使用 IADsSecurityDescriptor.DiscretionaryAcl 屬性來取得 DACL。 方法會傳 回 IDispatch 指標。 在該 IDispatch 指標上呼叫 QueryInterface,以取得 IADsAccessControlList 介面,以使用該介面上的 方法來存取 ACL 中的個別 ACE。

  4. 使用 CoCreateInstance 建立新 ACE 的 ADSI COM 物件,並取得該物件的 IADsAccessControlEntry 介面指標。 請注意,類別標識碼CLSID_AccessControlEntry。

  5. 使用 IADsAccessControlEntry 方法設定 ACE 的屬性:

    1. 使用 IADsAccessControlEntry::p ut_Trustee 來設定套用此 ACE 的受託人 信任者是使用者、群組或其他安全性主體。 您的應用程式應該使用您想要套用 ACE 之信任者之使用者或群組物件中適當屬性的值。 信任項會指定為 BSTR ,而且可以採用下列形式:
      • 網域帳戶(舊版 Windows NT 中使用的登入名稱)格式為 “domain\user account”,其中 “<domain>” 是包含使用者的 Windows NT 網域>名稱,而 “<user account>” 是指定使用者的 sAMAccountName 属性。<>< 例如:「fabrikam\jeffsmith」。。
      • 代表 Windows NT 安全性系統所定義之特殊身分識別的已知安全性主體,例如每個人、本機系統、主體自我、已驗證的使用者、建立者擁有者等等。 代表已知安全性主體的物件會儲存在組態容器下方的已知安全性主體容器中。 例如,匿名登入。
      • 內建群組,代表 Windows NT 安全性系統所定義的內建使用者群組。 其格式為 “BUILTIN\<group name”,其中 “<group name>>” 是內建使用者群組的名稱。 代表內建群組的物件會儲存在網域容器下方的 Builtin 容器中。 例如,“BUILTIN\管理員 istrators”。
      • 指定之使用者的 SID (字串格式),這是 指定之使用者的 objectSID 屬性。 您可以使用 Win32 安全性 API 中的 ConvertSidToStringSid 函式,轉換成字串表單 例如:「S-1-5-32-548」。。
    2. 使用 IADsAccessControlEntry.AccessMask 屬性來設定指定訪問許可權的遮罩。 ADS_RIGHTS_ENUM列舉會指定您可以在目錄物件上設定的訪問許可權。
    3. 使用 IADsAccessControlEntry.AceType 屬性來指定是否允許或拒絕 AccessMask設定的訪問許可權。 針對標準許可權,這可以是 ADS_ACETYPE_ACCESS_ALLOWEDADS_ACETYPE_ACCESS_DENIED。 對於物件特定許可權(適用於物件特定部分或特定物件類型的許可權),請使用 ADS_ACETYPE_ACCESS_ALLOWED_OBJECTADS_ACETYPE_ACCESS_DENIED_OBJECTADS_ACETYPE_ENUM列舉會指定您可以在 ACE 上設定的存取類型。
    4. 使用 IADsAccessControlEntry.AceFlags 屬性來指定指定指定物件底下的其他容器或物件是否可以繼承 ACE。 ADS_ACEFLAG_ENUM列舉會指定您可以在 ACE 上設定的繼承旗標。
    5. 使用 IADsAccessControlEntry.Flags 屬性來指定許可權是否套用至物件的特定部分、繼承的物件類型或兩者。
    6. 如果 Flags 設定為 ADS_FLAG_OBJECT_TYPE_PRESENT,請設定 IADsAccessControlEntry.ObjectType 屬性 o 指定包含物件類別 GUID 的字串串(ADS_RIGHT_DS_CREATE_CHILDADS_RIGHT_DS_DELETE_CHILD)、屬性集、屬性集、已驗證寫入或 ACE 套用的擴充許可權。 GUID 必須指定為 COM 連結庫中 StringFromGUID2 函式所產生的表單字串。
    7. 如果 Flags 設定為 ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT,請設定 IADsAccessControlEntry.InheritedObjectType 屬性,以指定包含 ACE 所套用之繼承物件類別 GUID 的字元串。 GUID 必須指定為 COM 連結庫中 StringFromGUID2 函式所產生的表單字串。
  6. 在 IADsAccessControlEntry 物件上使用 QueryInterface 方法來取得 IDispatch 指標。 IADsAccessControlList.AddAce 方法需要 ACE 的 IDispatch 介面指標。

  7. 使用 IADsAccessControlList.AddAce 將新的 ACE 新增至 DACL。 請注意,ACL 內的 ACE 順序可能會影響物件的存取權評估。 對對象的正確存取可能需要您建立新的 ACL、以正確的順序將 ACL 中的 ACL 新增至新的 ACL,然後將安全性描述符中的現有 ACL 取代為新的 ACL。 如需詳細資訊,請參閱 DACL 中的 ACE 順序。

  8. 使用 IADsSecurityDescriptor.DiscretionaryAcl 屬性,將包含新 ACE 的 DACL 寫入安全性描述元。 如需 DACL 的詳細資訊,請參閱 Null DACL 和空白 DACL

  9. 使用 IADs.Put 方法,將安全性描述元寫入物件的 nTSecurityDescriptor 屬性至屬性快取。

  10. 使用 IADs.SetInfo 方法來更新目錄中物件上的 屬性。