以下代码写在一个组件里:
STDMETHODIMP Cuser::get_Value(BSTR ValueName,BSTR User, VARIANT* pVal)
{
// TODO: 在此添加实现代码
     // TODO: 在此添加实现代码
IADs* des=NULL;
HRESULT hr = ADsGetObject(L"LDAP://rootDSE",IID_IADs,(void**)&des);
VARIANT dnc;
des->Get(L"defaultNamingContext",&dnc);
des->Release();
IADsUser* user;
LPOLESTR spath = new OLECHAR[MAX_PATH];
wcscpy(spath,L"LDAP://CN=");
wcscat(spath,User);
wcscat(spath,L",");
wcscat(spath,L"CN=USERS,");
wcscat(spath,dnc.bstrVal);
hr = ADsGetObject(spath,IID_IADsUser,(void**)&user);
if (SUCCEEDED(hr))
{
hr=user->Get(ValueName,pVal);
user->Release();
if(hr==E_ADS_PROPERTY_NOT_FOUND)
Estring="查询的属性不存在";
else if(hr==E_FAIL)
GetError();
else
Estring="";
}
else
{
GetError();
}
return S_OK;
}STDMETHODIMP Cuser::put_Value(BSTR ValueName,BSTR User, VARIANT newVal)
{
// TODO: 在此添加实现代码
IADs* des=NULL;
HRESULT hr = ADsGetObject(L"LDAP://rootDSE",IID_IADs,(void**)&des);
VARIANT dnc;
des->Get(L"defaultNamingContext",&dnc);
des->Release();
IADsUser* user;
LPOLESTR spath = new OLECHAR[MAX_PATH];
wcscpy(spath,L"LDAP://CN=");
wcscat(spath,User);
wcscat(spath,L",");
wcscat(spath,L"CN=USERS,");
wcscat(spath,dnc.bstrVal);
hr = ADsGetObject(spath,IID_IADsUser,(void**)&user);
if (SUCCEEDED(hr))
{
hr=user->Put(ValueName,newVal);
hr=user->SetInfo();
user->Release();
if(hr==E_ADS_CANT_CONVERT_DATATYPE)
Estring="数据类型错误";
else if(!SUCCEEDED(hr))
GetError();
else
Estring="";
}
else
{
GetError();
}
return S_OK;
}void Cuser::GetError(void)
{
DWORD dwLastError;
        WCHAR szErrorBuf[MAX_PATH];
        WCHAR szNameBuf[MAX_PATH];
  ADsGetLastError( &dwLastError, szErrorBuf,
                                       MAX_PATH-1,
                                        szNameBuf,
                                       MAX_PATH-1);
  char temp[30];
  _ultoa(dwLastError,temp,10);
  CComBSTR mystring(L"Error Code:");
  mystring.Append(temp);
  mystring.Append("    Error Text:");
  mystring.Append(szErrorBuf);
  mystring.Append("     Provider:");
  mystring.Append(szNameBuf);
  Estring=mystring;
}然后由一个vbs来调用:
set VV=createobject("qweb.user")
bbb = "2007/8/19"
vv.Value("accountexpirationdate", "tryuser") = bbb
bbb = vv.Value("AccountExpirationDate", "tryuser")
msgbox bbb
Set vv = Nothing
总是提示“对象不支持此属性或方法‘bbb' vbscript运行时错误。"
如果把属性名改为”fullname“或其他属性或不存在的属性,或者换一个用户或者换一个不存在的用户,就不会出现提示。
更怪的是,我换了一个用户,读取FULLNAME属性正常,但读取AccountExpirationDate就是空值,而我明明手工给他赋了值。也没有办法用代码给他赋值。

解决方案 »

  1.   

    调试的时候,我建议你在调用
    hr = ADsGetObject(spath,IID_IADsUser,(void**)&user);
    之前,先检查一下spath是否正确。根据我的经验,在组合spath的时候容易出错。
    另外,你的vbs中多处调用bbb,到底是哪一句出了错?
      

  2.   

    spath不会错,我估计问题出在缓存,但如何能直接从目录中获得数据呢?
      

  3.   

    如果你怀疑是缓存出了问题,就在
    hr=user->Get(ValueName,pVal);
    之前先调用GetInfo方法,强制更新缓存。
      

  4.   

    objet.propertyname和object.get(“propertyname”)实现的功能是相同的,但他们具体实现过程是不同的。另外,ADSI对象的Properties对应的LDAP的Attributes在名称上也不一定相同。例如:
    varValue = objADs.Guid
    是正确的,可以正常工作,而
    varValue = objADs.Get("GUID")
    就不对了,GUID对应的LDAP的Attribute应该是objectGUID,所以,
    varValue = objADs.Get("objectGUID")
    才是正确的。
    我又看了一下你贴的源码,你调用的是IADsUser的AccountExpirationDate。这个Property对应的LDAP的Attribute应该是accountExpires。
    你再试试看。