IADs::Get 方法 (iads.h)

IADs::Get 方法从属性缓存中检索给定名称的属性。 属性可以是单值或多值。 属性值表示为单值属性的变体或变体数组 (VARIANT 或字节) 允许多个值的属性。

语法

HRESULT Get(
  [in]  BSTR    bstrName,
  [out] VARIANT *pvProp
);

parameters

[in] bstrName

包含指定属性名称的 BSTR

[out] pvProp

指向接收 属性值的 VARIANT 的指针。 对于多值属性, pvPropVARIANT 的变体数组,除非属性是二进制类型。 在后一种情况下, pvProp 是字节 (VT_U1 或VT_ARRAY) 的变体数组。 对于引用对象的 属性, pvProp 是指向所引用对象的VT_DISPATCH指针。

返回值

此方法支持标准返回值以及以下值。

有关详细信息,请参阅 ADSI 错误代码

注解

IADs::Get 方法要求调用方以不同的方式处理单值和多值属性值。 因此,如果知道感兴趣的属性是单值或多值,请使用 IADs::Get 方法来检索属性值。 下面的代码示例演示了调用方在调用此方法时如何处理单值和多值属性。

当属性未初始化时,调用此方法会调用 对 IADs::GetInfo 方法的隐式调用。 这会从基础目录加载,存储缓存中尚未设置的受支持属性的值。 对 IADs::Get 的任何后续调用仅处理缓存中的属性值。 有关对 IAD::GetInfo 的隐式和显式调用行为的详细信息,请参阅 IADs::GetInfo

还可以使用 IADs::GetEx 从属性缓存中检索属性值。 但是,这些值作为 VARIANT的变体数组返回,无论它们是单值还是多值。 也就是说,ADSI 尝试以一致的数据格式打包返回的属性值。 当不确定返回的数据具有单个或多个值时,这可节省调用方验证数据类型的工作量。

示例

下面的代码示例使用 IADs::Get 检索对象的安全描述符。

Dim x As IADs
Dim Desc As IADsSecurityDescriptor
On Error GoTo ErrTest:
 
Set x = GetObject("LDAP://CN=Administrator,CN=Users,DC=Fabrikam,DC=com")
 
' Single-valued properties.
Debug.Print "Home Phone Number is: " & x.Get("homePhone")
 
' Some property values represents other ADSI objects. 
' Consult your provider documentation.
Set Desc = x.Get("ntSecurityDescriptor")
 
' Multi-valued property, assuming that multiple values were
' assigned to the "otherHomePhone" properties. Caller must 
' enumerate all the available values.
Debug.Print "Other Phone Numbers are: "
otherNumbers = x.Get("otherHomePhone")
For Each homeNum In otherNumbers
  Debug.Print homeNum
Next
 
Exit Sub
 
ErrTest:
  Debug.Print Hex(Err.Number)
  Set x = Nothing
  Set Desc = Nothing

下面的代码示例演示如何使用 IADs::Get 和 IADs::P ut 处理二进制数据的属性值。

Dim oTarget As IADs
Dim Octet(5) As Byte
Dim MultiOctet(2) As Variant
Dim i As Integer, j As Integer

On Error GoTo Cleanup
 
' Set up MultiOctetString.
For i = 0 To 2
    For j = 0 To 5
        Octet(j) = CByte(i * j)
    Next j
    MultiOctet(i) = Octet
Next i
 
' Bind to the object and set MultiOctetString.
Set oTarget=GetObject("LDAP://CN=SomeUser,CN=Users,DC=Fabrikam, DC=COM")
oTarget.Put "multiOctetString", MultiOctet
oTarget.SetInfo
 
Dim GetOctet As Variant
Dim Temp As Variant
 
' Read back and print MultiOctetString.
GetOctet = oTarget.Get("multiOctetString")
For i = LBound(GetOctet) To UBound(GetOctet)
    Temp = GetOctet(i)
    For j = LBound(Temp) To UBound(Temp)
        Debug.Print Temp(j)
    Next j
    Debug.Print "----"
Next i

Exit Sub

Cleanup:
   MsgBox("An error has occurred. " & Err.Number)
   Set oTarget = Nothing

下面的代码示例演示如何使用 IADs::Get 检索对象的可选属性的值。

<HTML>
<head><title></title></head>

<body>
<%
Dim x 
 
On error resume next
Set x = GetObject("WinNT://Fabrikam/Administrator")
Response.Write "Object Name: " & x.Name & "<br>"
Response.Write "Object Class: " & x.Class & "<br>"
 
' Get optional property values of this object.
Set cls = GetObject(x.Schema)

For Each op In cls.OptionalProperties
   v = obj.Get(op)
   if err.Number = 0 then
       Response.Write "Optional Property: " & op & "=" & v & "<br>"
   end if
Next
%>

</body>
</html>

下面的代码示例使用 IADs::Get 读取具有单值和多个值的属性。

HRESULT hr;
IADs *pUsr=NULL;
 
CoInitialize(NULL);
 
///////////////////////////////
// Bind to a directory object.
///////////////////////////////
hr = ADsGetObject(L"WinNT://Fabrikam/Administrator,user", IID_IADs, (void**) &pUsr );
if ( !SUCCEEDED(hr) ) { return hr; }
 
//////////////////////////////////
// Get a single-valued attribute.
//////////////////////////////////
VARIANT var;
VariantInit(&var);
 
hr = pUsr->Get(CComBSTR("FullName"), &var );
if ( SUCCEEDED(hr) )
{
    printf("FullName: %S\n", V_BSTR(&var) );
    VariantClear(&var);
}
 
if ( pUsr )
{
    pUsr->Release();
}
 
///////////////////////////////////////////////////////
// Get a multi-valued attribute from a service object.
///////////////////////////////////////////////////////
IADs *pSvc = NULL;
 
hr = ADsGetObject(L"WinNT://Fabrikam/Account/Browser,service", IID_IADs, (void**) &pSvc );
if ( !SUCCEEDED(hr) )
{
    return hr;
}
 
hr = pSvc->Get(CComBSTR("Dependencies"), &var );
if ( SUCCEEDED(hr) )
{
    LONG lstart, lend;
    SAFEARRAY *sa = V_ARRAY( &var );
    VARIANT varItem;
 
    // Get the lower and upper bound.
    hr = SafeArrayGetLBound( sa, 1, &lstart );
    hr = SafeArrayGetUBound( sa, 1, &lend );
 
    // Iterate and print the content.
    VariantInit(&varItem);
    printf("Getting service dependencies using IADs :\n");
    for ( long idx=lstart; idx <= lend; idx++ )
    {
        hr = SafeArrayGetElement( sa, &idx, &varItem );
        printf("%S ", V_BSTR(&varItem));
        VariantClear(&varItem);
    }
    printf("\n");
 
    VariantClear(&var);
}
 
// Cleanup.
if ( pSvc )
{
    pSvc->Release();
}

要求

   
最低受支持的客户端 Windows Vista
最低受支持的服务器 Windows Server 2008
目标平台 Windows
标头 iads.h
DLL Activeds.dll

另请参阅

IAD

IADs::GetEx

IADs::GetInfo

IADs::P ut

IADs::P utEx

属性缓存