以下代码写在一个组件里:
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就是空值,而我明明手工给他赋了值。也没有办法用代码给他赋值。
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就是空值,而我明明手工给他赋了值。也没有办法用代码给他赋值。
hr = ADsGetObject(spath,IID_IADsUser,(void**)&user);
之前,先检查一下spath是否正确。根据我的经验,在组合spath的时候容易出错。
另外,你的vbs中多处调用bbb,到底是哪一句出了错?
hr=user->Get(ValueName,pVal);
之前先调用GetInfo方法,强制更新缓存。
varValue = objADs.Guid
是正确的,可以正常工作,而
varValue = objADs.Get("GUID")
就不对了,GUID对应的LDAP的Attribute应该是objectGUID,所以,
varValue = objADs.Get("objectGUID")
才是正确的。
我又看了一下你贴的源码,你调用的是IADsUser的AccountExpirationDate。这个Property对应的LDAP的Attribute应该是accountExpires。
你再试试看。