IADsSecurityDescriptor
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
ADSI セキュリティ記述子オブジェクトのプロパティへのアクセスを提供します。
解説(Remarks)
このインターフェイスは、Active Directory ディレクトリ サービス オブジェクトへのアクセス制御を調べたり変更したりするために使用します。また、セキュリティ記述子のコピーを作成するためにも使用できます。このインターフェイスを取得するには、IADs.Get メソッドを使用してオブジェクトの ntSecurityDescriptor 属性を取得します。新しいセキュリティ記述子を作成してオブジェクトに設定する方法の詳細については、新しいディレクトリ オブジェクトのセキュリティ記述子の作成およびNull DACL と空の DACLを参照してください。
多くの場合、セキュリティ記述子のすべての部分を変更できるとは限りません。たとえば、現在のユーザーがオブジェクトに対する完全な制御権を持っていても、管理者ではなく、そのオブジェクトの所有者でもない場合、ユーザーは DACL を変更できますが、所有者は変更できません。この場合、ntSecurityDescriptor の更新時にエラーが発生します。この問題を回避するには、IADsObjectOptions インターフェイスを使用して、セキュリティ記述子のうち変更する特定の部分を指定できます。
例
次のコード例は、IADsObjectOptions インターフェイスを使用して、セキュリティ記述子の特定の部分のみを変更する方法を示しています。
Const ADS_OPTION_SECURITY_MASK = 3
Const ADS_SECURITY_INFO_OWNER = 1
Const ADS_SECURITY_INFO_GROUP = 2
Const ADS_SECURITY_INFO_DACL = 4
Dim obj as IADs
Dim sd as IADsSecurityDescriptor
Dim oOptions as IADsObjectOptions
' Bind to the object.
Set obj = GetObject("LDAP://.....")
' Get the IADsSecurityDescriptor.
Set sd = obj.Get("ntSecurityDescriptor")
' Modify the DACL as required.
' Get the IADsObjectOptions for the object - not the IADsSecurityDescriptor.
Set oOptions = obj
' Set options so that only the DACL will be updated.
oOptions.SetOption ADS_OPTION_SECURITY_MASK, ADS_INFO_DACL
' Update the security descriptor.
obj.Put "ntSecurityDescriptor", sd
obj.SetInfo
次のコード例は、セキュリティ記述子からデータを表示する方法を示しています。
' Get the security descriptor.
Dim x As IADs
Dim sd As IADsSecurityDescriptor
On Error GoTo Cleanup
Set x = GetObject("LDAP://DC=Fabrikam,DC=com")
Set sd = x.Get("ntSecurityDescriptor")
Debug.Print sd.Control
Debug.Print sd.Group
Debug.Print sd.Owner
Debug.Print sd.Revision
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set x = Nothing
Set sd = Nothing
次のコード例は、ディレクトリ オブジェクトのセキュリティ記述子からデータを表示する方法を示しています。
HRESULT DisplaySD(IADs *pObj)
{
IADsSecurityDescriptor *pSD = NULL;
BSTR bstr = NULL;
long lVal = 0;
HRESULT hr = S_OK;
VARIANT var;
VariantInit(&var);
if(pObj==NULL)
{
return E_FAIL;
}
hr = pObj->Get(CComBSTR("ntSecurityDescriptor"), &var);
if(FAILED(hr)){goto Cleanup;}
hr = V_DISPATCH(&var)->QueryInterface(IID_IADsSecurityDescriptor,(void**)&pSD);
if(FAILED(hr)){goto Cleanup;}
hr = pSD->get_Control(&lVal);
printf("SD Control = %d\n",lVal);
hr = pSD->get_Owner(&bstr);
printf("SD Owner = %S\n",bstr);
SysFreeString(bstr);
hr = pSD->get_Group(&bstr);
printf("SD Group = %S\n",bstr);
SysFreeString(bstr);
hr = pSD->get_Revision(&lVal);
printf("SD Revision= %d\n",lVal);
Cleanup:
VariantClear(&var);
if(pSD) pSD->Release();
return hr;
}
メソッド 21
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
| retval | INT* | out | セキュリティ記述子のリビジョン番号を受け取る出力先。INT*で返る。 |
| lnRevision | INT | in | 設定するセキュリティ記述子のリビジョン番号を指定する。 |
| retval | INT* | out | セキュリティ記述子の制御フラグを受け取る出力先。SE_*のビット値。 |
| lnControl | INT | in | 設定する制御フラグ(SE_*のビット値)を指定する。 |
| retval | LPWSTR* | out | 所有者のセキュリティプリンシパル名を受け取る出力先。BSTRで返る。 |
| bstrOwner | LPWSTR | in | 設定する所有者のセキュリティプリンシパル名をBSTRで指定する。 |
| retval | VARIANT_BOOL* | out | 所有者が既定値由来かを受け取る出力先。VARIANT_TRUEで既定由来。 |
| fOwnerDefaulted | VARIANT_BOOL | in | 所有者を既定値由来とするかを指定する。VARIANT_TRUEで既定由来。 |
| retval | LPWSTR* | out | プライマリグループ名を受け取る出力先。BSTRで返る。 |
| bstrGroup | LPWSTR | in | 設定するプライマリグループ名をBSTRで指定する。 |
| retval | VARIANT_BOOL* | out | グループが既定値由来かを受け取る出力先。VARIANT_TRUEで既定由来。 |
| fGroupDefaulted | VARIANT_BOOL | in | グループを既定値由来とするかを指定する。VARIANT_TRUEで既定由来。 |
| retval | IDispatch** | out | 任意アクセス制御リスト(DACL)を受け取る出力先。IDispatch**で返る。 |
| pDiscretionaryAcl | IDispatch* | inoptional | 設定する任意アクセス制御リスト(DACL)をIDispatch*で指定する。 |
| retval | VARIANT_BOOL* | out | DACLが既定値由来かを受け取る出力先。VARIANT_TRUEで既定由来。 |
| fDaclDefaulted | VARIANT_BOOL | in | DACLを既定値由来とするかを指定する。VARIANT_TRUEで既定由来。 |
| retval | IDispatch** | out | システムアクセス制御リスト(SACL、監査用)を受け取る出力先。IDispatch**で返る。 |
| pSystemAcl | IDispatch* | inoptional | 設定するシステムアクセス制御リスト(SACL)をIDispatch*で指定する。 |
| retval | VARIANT_BOOL* | out | SACLが既定値由来かを受け取る出力先。VARIANT_TRUEで既定由来。 |
| fSaclDefaulted | VARIANT_BOOL | in | SACLを既定値由来とするかを指定する。VARIANT_TRUEで既定由来。 |
IADsSecurityDescriptor::CopySecurityDescriptor メソッドは、オブジェクトに関するセキュリティ データを保持する ADSI セキュリティ記述子オブジェクトをコピーします。
| ppSecurityDescriptor | IDispatch** | out | セキュリティ記述子オブジェクトへのポインターへのポインター。 |
戻り値
このメソッドは、S_OK のほか、E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED、E_FAIL などの標準的な戻り値を返します。その他の戻り値の詳細については、ADSI エラー コードを参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IADsSecurityDescriptor "{B8C787CA-9BDD-11D0-852C-00C04FD8D503}" #usecom global IADsSecurityDescriptor IID_IADsSecurityDescriptor "{}" #comfunc global IADsSecurityDescriptor_get_Revision 7 var #comfunc global IADsSecurityDescriptor_put_Revision 8 int #comfunc global IADsSecurityDescriptor_get_Control 9 var #comfunc global IADsSecurityDescriptor_put_Control 10 int #comfunc global IADsSecurityDescriptor_get_Owner 11 var #comfunc global IADsSecurityDescriptor_put_Owner 12 wstr #comfunc global IADsSecurityDescriptor_get_OwnerDefaulted 13 var #comfunc global IADsSecurityDescriptor_put_OwnerDefaulted 14 int #comfunc global IADsSecurityDescriptor_get_Group 15 var #comfunc global IADsSecurityDescriptor_put_Group 16 wstr #comfunc global IADsSecurityDescriptor_get_GroupDefaulted 17 var #comfunc global IADsSecurityDescriptor_put_GroupDefaulted 18 int #comfunc global IADsSecurityDescriptor_get_DiscretionaryAcl 19 sptr #comfunc global IADsSecurityDescriptor_put_DiscretionaryAcl 20 sptr #comfunc global IADsSecurityDescriptor_get_DaclDefaulted 21 var #comfunc global IADsSecurityDescriptor_put_DaclDefaulted 22 int #comfunc global IADsSecurityDescriptor_get_SystemAcl 23 sptr #comfunc global IADsSecurityDescriptor_put_SystemAcl 24 sptr #comfunc global IADsSecurityDescriptor_get_SaclDefaulted 25 var #comfunc global IADsSecurityDescriptor_put_SaclDefaulted 26 int #comfunc global IADsSecurityDescriptor_CopySecurityDescriptor 27 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_IADsSecurityDescriptor "{B8C787CA-9BDD-11D0-852C-00C04FD8D503}" #usecom global IADsSecurityDescriptor IID_IADsSecurityDescriptor "{}" #comfunc global IADsSecurityDescriptor_get_Revision 7 sptr #comfunc global IADsSecurityDescriptor_put_Revision 8 int #comfunc global IADsSecurityDescriptor_get_Control 9 sptr #comfunc global IADsSecurityDescriptor_put_Control 10 int #comfunc global IADsSecurityDescriptor_get_Owner 11 sptr #comfunc global IADsSecurityDescriptor_put_Owner 12 wstr #comfunc global IADsSecurityDescriptor_get_OwnerDefaulted 13 sptr #comfunc global IADsSecurityDescriptor_put_OwnerDefaulted 14 int #comfunc global IADsSecurityDescriptor_get_Group 15 sptr #comfunc global IADsSecurityDescriptor_put_Group 16 wstr #comfunc global IADsSecurityDescriptor_get_GroupDefaulted 17 sptr #comfunc global IADsSecurityDescriptor_put_GroupDefaulted 18 int #comfunc global IADsSecurityDescriptor_get_DiscretionaryAcl 19 sptr #comfunc global IADsSecurityDescriptor_put_DiscretionaryAcl 20 sptr #comfunc global IADsSecurityDescriptor_get_DaclDefaulted 21 sptr #comfunc global IADsSecurityDescriptor_put_DaclDefaulted 22 int #comfunc global IADsSecurityDescriptor_get_SystemAcl 23 sptr #comfunc global IADsSecurityDescriptor_put_SystemAcl 24 sptr #comfunc global IADsSecurityDescriptor_get_SaclDefaulted 25 sptr #comfunc global IADsSecurityDescriptor_put_SaclDefaulted 26 int #comfunc global IADsSecurityDescriptor_CopySecurityDescriptor 27 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。