ADSI GetObjectでHRESULT 80072030を解決するには?

解決


さんぽ道  2009-06-04 17:36:37  No: 70271  IP: [192.*.*.*]

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 だと思うのですが
なぜ何もないと判断されてしまうんでしょうか?

編集 削除
aetos  2009-06-05 12:32:37  No: 70272  IP: [192.*.*.*]

Active Directory 環境が用意できないので検証できませんが…

ドメインサーバーの OS は何ですか?
これが原因かどうかはわかりませんが、検索してヒットするのはこれだけですね。
http://support.microsoft.com/kb/923354/ja

編集 削除
さんぽ道  2009-06-05 13:01:03  No: 70273  IP: [192.*.*.*]

Windows 2003server SP2になります。

>Microsoft がこのがかかわる問題ことを確認済み、Microsoft 製品を対象製>品」に記載にします。 この問題は、Windows Server 2003 Service Pack 2 で>修正済みです。

test.comにユーザを作成する場合のコーディングは、どのようにしたらよいのでしょうか?

編集 削除
aetos  2009-06-05 13:52:34  No: 70274  IP: [192.*.*.*]

> Windows 2003server SP2になります。

ということは、この問題は修正済みのはずですね。

> test.comにユーザを作成する場合のコーディングは、どのようにしたらよいのでしょうか?

やりたいことはユーザーの追加なのですか?
であれば、IADsContainer::Create かと。

検索したら参考になりそうなページがありました。
http://www.upken.jp/wiki/index.php?ADSI%2FIADsContainer

編集 削除
さんぽ道  2009-06-05 18:46:59  No: 70275  IP: [192.*.*.*]

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

編集 削除
さんぽ道  2009-06-05 22:08:14  No: 70276  IP: [192.*.*.*]

ちなみに、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

編集 削除
さんぽ道  2009-06-05 22:14:31  No: 70277  IP: [192.*.*.*]

一部転記ミスがありましたので再度アップ。

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

編集 削除
さんぽ道  2009-06-08 11:08:26  No: 70278  IP: [192.*.*.*]

userPrincipalNameメソッドとsetPasswordメソッドを追記するだけで
エラー番号が消えました。

編集 削除