使用 ADSI 時,您會讀取控件訪問許可權 ACE,就像在 ACL 中讀取任何其他 ACE 一樣。 請注意,您也可以使用 Win32 安全性 API 讀取目錄物件上的 ACL。 不過,控制存取權限會使用 IADsAccessControlEntry 介面的屬性,其專屬於授與和拒絕控制存取權限:
- AccessMask 必須包含 ADS_RIGHT_DS_CONTROL_ACCESS。
- 旗標 值為 ADS_FLAG_OBJECT_TYPE_PRESENT。
- ObjectType 是控件訪問許可權 rightsGUID 屬性的字串形式。 GUID 的字串格式與 StringFromGUID2 COM 連結庫函式相同。
- AceTypeADS_ACETYPE_ACCESS_ALLOWED_OBJECT 授予給受託人控制訪問許可權,或 ADS_ACETYPE_ACCESS_DENIED_OBJECT 拒絕受託人控制訪問許可權。
- 信任人 是安全性主體;這是 ACE 套用至的使用者、群組、計算機等等。
使用下列程式讀取 ADSI 物件的 ACE。 下列程式適用於 C 和 C++ 應用程式。
讀取 ADSI 物件的 ACE
- 取得物件的 IADs 介面指標。
- 使用 IADs::Get 方法來取得對象的安全性描述元。 包含安全性描述元的屬性名稱是 「nTSecurityDescriptor」。。 屬性會以包含 IDispatch 指標的 VARIANT 傳回。 請注意,vt 成員 VT_DISPATCH。 在該 IDispatch 上呼叫 QueryInterface 指標,以取得 IADsSecurityDescriptor 介面,以使用該介面上的 方法來存取安全性描述元 ACL。
- 使用 IADsSecurityDescriptor::get_DiscretionaryAcl 方法來取得 ACL。 方法會傳回 IDispatch 指標。 在該 IDispatch 上呼叫 QueryInterface 指標,以取得 IADsAccessControlList 介面,以使用該介面上的方法存取 ACL 中的個別 ACE。
- 使用 IADsAccessControlList::get__NewEnum 方法來列舉 ACE。 方法會傳回一個 IUnknown 指標。 在該 IUnknown 指標上呼叫 QueryInterface,以取得 IEnumVARIANT 介面。
- 使用 IEnumVARIANT::Next 方法來列舉 ACL 中的 ACE。 屬性會以包含 IDispatch 指標的 VARIANT 傳回。 請注意,成員 vt 是 VT_DISPATCH。 在該 IDispatch 指標上呼叫 QueryInterface,以取得 IADsAccessControlEntry 介面以讀取 ACE。
- 呼叫 IADsAccessControlEntry::get_AccessMask 方法來取得 AccessMask,並確認 ADS_RIGHT_DS_CONTROL_ACCESS 旗標的 AccessMask 值。 如果具有此旗標,ACE 會包含控制訪問權限。
- 呼叫 IADsAccessControlEntry::get_Flags 方法來取得物件類型的旗標。
- 檢查 旗標ADS_FLAG_OBJECT_TYPE_PRESENT 旗標的值。 如果 Flags 設定為 ADS_FLAG_OBJECT_TYPE_PRESENT,請呼叫 IADsAccessControlEntry::get_ObjectType 方法來取得字元串,其中包含 ACE 套用之控件訪問許可權的 rightsGUID。
- 呼叫 IADsAccessControlEntry::get_AceType 方法來取得 ACE 類型。 此類型會是 ADS_ACETYPE_ACCESS_ALLOWED_OBJECT,以授與信任者控件訪問許可權,或 ADS_ACETYPE_ACCESS_DENIED_OBJECT 拒絕控件訪問許可權。
- 呼叫 IADsAccessControlEntry::get_Trustee 方法來取得安全性主體;即套用 ACE 的使用者、群組、計算機等等。
- 完成 ObjectType 和 Trustee 字串時,請使用 SysFreeString 釋放這些字串的記憶體。
- 當完成介面作業後,呼叫 Release 以遞減或釋放所有介面參考。