ADSIにて、GetObject関数を発行すると、HRESULT 80072030が返却され
解決方法に困っています。
Administratrで実行しており、Domain Adminsに含まれている状態です。
以下にコードを添付します。
void GetADSIObject(IADsContainer* contain){
CComPtr<IDispatch> comdispat;
CComPtr<IADsGroup> comgroup;
HRESULT hres = cont->GetObject(CComBSTR("group"), CComBSTR("CN=Domain Admins,OU=Users"), &disp);
if (FAILED(hres)) {
wprintf(L"An error occurred.\n HRESULT: %x\n",hr);
if (HRESULT_FACILITY(hres)==FACILITY_WIN32){
DWORD dwLastError;
WCHAR szErrorBuf[MAX_PATH];
WCHAR szNameBuf[MAX_PATH];
HRESULT hr_return =S_OK;
hr_return = ADsGetLastError( &dwLastError,
szErrorBuf,
MAX_PATH,
szNameBuf,
MAX_PATH);
if (SUCCEEDED(hr_return)){
wprintf(L"Error Code: %d\n Error Text: %ws\n Provider: %ws\n", dwLastError, szErrorBuf, szNameBuf);
}
}
}
}
==========================================================
CComBSTR strcon("LDAP://test.com");
IADsContainer* contain;
HRESULT resu = ADsGetObject(strcon, IID_IADsContainer,(LPVOID*) &contain);
if (FAILED(resu)) {
printf("ログインに失敗 ==[%s]\n",strcon);
}
GetADSIObject(cont);//ここで呼び出し
実行すると
An error occurred.
HRESULT: 80072030
Error Code: 8333
Error Text: 0000208D: NameErr: DSID-031001CD, problem 2001 (NO_OBJECT), data 0,
best match of:
'DC=test,DC=com'
このエラーは、There is no such object だと思うのですが
なぜ何もないと判断されてしまうんでしょうか?
Active Directory 環境が用意できないので検証できませんが…
ドメインサーバーの OS は何ですか?
これが原因かどうかはわかりませんが、検索してヒットするのはこれだけですね。
http://support.microsoft.com/kb/923354/ja
Windows 2003server SP2になります。
>Microsoft がこのがかかわる問題ことを確認済み、Microsoft 製品を対象製>品」に記載にします。 この問題は、Windows Server 2003 Service Pack 2 で>修正済みです。
test.comにユーザを作成する場合のコーディングは、どのようにしたらよいのでしょうか?
> Windows 2003server SP2になります。
ということは、この問題は修正済みのはずですね。
> test.comにユーザを作成する場合のコーディングは、どのようにしたらよいのでしょうか?
やりたいことはユーザーの追加なのですか?
であれば、IADsContainer::Create かと。
検索したら参考になりそうなページがありました。
http://www.upken.jp/wiki/index.php?ADSI%2FIADsContainer
CComBSTR strcon("LDAP://test.com);
IADsUser *pADsUse = NULL;
IDispatch *pDisp = NULL;
IADsContainer* contain;
HRESULT hres = ADsGetObject( strcon, IID_IADsContainer, (LPVOID*) &contain);
hres = cont->Create(CComBSTR("person"),CComBSTR("cn=JeffSmith"), &pDisp);
hres = pDisp->QueryInterface(IID_IADsUser, (void**) &pADsUse);
hres = pADsUse->Put(CComBSTR("sn"), CComVariant("JeffSmith"));
hres = pADsUse->Put(CComBSTR("cn"), CComVariant("JeffSmith"));
hres = pADsUse->Put(CComBSTR("distinguishedName"), CComVariant("JeffSmith"));
hres = pADsUse->SetInfo();
wprintf(L"An error occurred.\n HRESULT: %x\n",hr);
DWORD dwLastError;
WCHAR szErrorBuf[MAX_PATH];
WCHAR szNameBuf[MAX_PATH];
HRESULT hr_return =S_OK;
hr_return = ADsGetLastError( &dwLastError,
szErrorBuf,
MAX_PATH,
szNameBuf,
MAX_PATH);
if (SUCCEEDED(hr_return)){
wprintf(L"Error Code: %d\n Error Text: %ws\n Provider: %ws\n", dwLastError, szErrorBuf, szNameBuf);
}
上記だと、ネーミング例外のようなコードが返却されました。
ドつぼにはまってしまいました。
どうしたら、よいのでしょう。
助けて下さい。
An error occurred.
HRESULT: 80072037
Error Code: 8345
Error Text: 00002099: NameErr: DSID-03050EB2, problem 2005 (NAMING_VIOLATION),
data 0, best match of:
'DC=test,DC=com'
Provider: LDAP Provider
ちなみに、WSHで作成した以下のコードは、
正常に終了し、登録できました。
ますます、わからなくなりました。
Option Explicit
Const CstrDomain = "test.com"
Const CstrOUDN = "DC=abc,DC=com"
Const CstrUserName = "testuser22"
Const CstrPassword = "P@ssw0rd"
Const UF_SCRIPT = &H1
Const UF_ACCOUNT_DISABLE = &H2
Const UF_HOMEDIR_REQUIRED = &H8
Const UF_ACCOUNT_LOCKOUT = &H10
Const UF_PASSWORD_NOT_REQD = &H20
Const UF_PASSWORD_CANT_CHANGE = &H40
Const UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = &H80
Const UF_DONT_EXPIRE_PASSWORD = &H10000
fUserAdd CstrDomain, CstrOUDN, CstrUserName, CstrPassword
WScript.Echo "end"
Function fUserAdd( strDomain, strOUDN, strUserName, strPassword )
Dim adsOU
Dim adsUser
Dim userFrags
Set adsOU = GetObject( "LDAP://" & strOUDN )
Set adsUser = adsOU.Create( "user", "cn=" & strUserName )
adsUser.Put "sAMAccountName", strUserName
adsUser.Put "userPrincipalName", strUserName & "@" & strDomain
adsUser.SetInfo
adsUser.GetInfo
adsUser.SetPassword strPassword
adsUser.IsAccountLocked = False
adsUser.AccountDisabled = False
adsUser.SetInfo
' パスワードを無期限、パスワード変更不可
userFrags = adsUser.Get("userAccountControl")
userFrags = userFrags Or UF_DONT_EXPIRE_PASSWORD
userFrags = userFrags Or UF_PASSWORD_CANT_CHANGE
adsUser.Put "userAccountControl", userFrags
adsUser.SetInfo
fUserAdd = True
End Function
一部転記ミスがありましたので再度アップ。
Option Explicit
Const CstrDomain = "test.com"
Const CstrOUDN = "DC=test,DC=com"
Const CstrUserName = "testuser22"
Const CstrPassword = "P@ssw0rd"
Const UF_SCRIPT = &H1
Const UF_ACCOUNT_DISABLE = &H2
Const UF_HOMEDIR_REQUIRED = &H8
Const UF_ACCOUNT_LOCKOUT = &H10
Const UF_PASSWORD_NOT_REQD = &H20
Const UF_PASSWORD_CANT_CHANGE = &H40
Const UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = &H80
Const UF_DONT_EXPIRE_PASSWORD = &H10000
fUserAdd CstrDomain, CstrOUDN, CstrUserName, CstrPassword
WScript.Echo "end"
Function fUserAdd( strDomain, strOUDN, strUserName, strPassword )
Dim adsOU
Dim adsUser
Dim userFrags
Set adsOU = GetObject( "LDAP://" & strOUDN )
Set adsUser = adsOU.Create( "user", "cn=" & strUserName )
adsUser.Put "sAMAccountName", strUserName
adsUser.Put "userPrincipalName", strUserName & "@" & strDomain
adsUser.SetInfo
adsUser.GetInfo
adsUser.SetPassword strPassword
adsUser.IsAccountLocked = False
adsUser.AccountDisabled = False
adsUser.SetInfo
' パスワードを無期限、パスワード変更不可
userFrags = adsUser.Get("userAccountControl")
userFrags = userFrags Or UF_DONT_EXPIRE_PASSWORD
userFrags = userFrags Or UF_PASSWORD_CANT_CHANGE
adsUser.Put "userAccountControl", userFrags
adsUser.SetInfo
fUserAdd = True
End Function
userPrincipalNameメソッドとsetPasswordメソッドを追記するだけで
エラー番号が消えました。