2012-01-24 3 views
3

WinAPI/C++を使用してローカルコンピュータ(Active Directoryに接続されている)が所属するOUの名前を調べる必要があります。何か案は?理論的にはローカルコンピュータが所属するOU(Organizational Unit)名をC++で取得する

+0

を見るには、http://stackoverflow.comを見て/ questions/8314496/is-it-possible-to-find-the-local-computer-in-ad-without-hardcoding-its-domain –

+0

ありがとうございますが、管理されたC++はオプションではありません... – ahmd0

答えて

1

管理C++がオプションである場合Lightweight Directory Access Protocol


void AfficheErreurLdap(char *fonction, ULONG rc); 

/* 
* 
*  Fonction d'entrée du programme 
* 
*/ 

void main(int argc, char* argv[]) 
{ 
    LDAP *pSessionLdap; // Pointeur vers la session LDAP 
    char *pHote;   // Pointeur vers la chaîne représentant le nom de l'hôte 
    char *pUtilisateur; // Pointeur vers la chaîne représentant l'utilisateur 
    char *pMotDePasse;  // Pointeur vers la chaîne représentant le mot de passe 
    char *pRacineLdap;  // Pointeur vers la racine Ldap 
    ULONG rc;    // Récupération du code de retour des appels 
    LDAPMessage *pResultat; // Pointeur vers le message résultat de la réquête LDAP 
    LDAPMessage *pEntree;  // Utilisée lors du parcours du résultat pour l'affichage 

    char *pDN;     // Pointeur vers le DN d'une entrée du résultat 
    char *pAttribut;  // Pointeur vers la chaîne représentant l'attribut 
    BerElement *pBer = NULL;// "curseur" interne à l'API LDAP pour le parcours des elts 
    char **pValeurs;   // Valeurs de l'attribut lors de l'affichage du résultat 
    int i;        // Indice pour la parcours des valeurs d'attribut 

    /* Analyse des Paramètres de lancement et affichage d’un message d’erreur si incorrect */ 
    if (argc != 5) 
    { 
    fprintf(stderr,"Syntaxe :\n\tex_cldap_1 Hote Utilisateur MotDePasse RacineLdap\n"); 
    exit (1); 
    } 
    /* Récupération des paramètres des lancement */ 
    pHote = argv[1]; 
    pUtilisateur = argv[2]; 
    pMotDePasse = argv[3]; 
    pRacineLdap = argv[4]; 

    /* Ouverture de la session LDAP et récupération du handle de session */ 
    pSessionLdap = ldap_open(pHote, 389); /* 389 est le numéro de port standard LDAP */ 

    if (pSessionLdap == NULL) 
    { 
    // En cas d'erreur : affichage du message d'erreur adéquat 
    perror("ldap_open"); 
    exit(2); 
    } 

    printf("Ouverture de la session réalisée\n"); 

    /* Authentification du client                            */ 
    /* Pour l'exemple, l'authentification est faite en tant qu'anonyme */ 
    rc = ldap_simple_bind_s(pSessionLdap, pUtilisateur, pMotDePasse); 
    if (rc != LDAP_SUCCESS) 
    { 
    // Erreur lors de l'authentification, on termine après affichage d'un message 
    AfficheErreurLdap("ldap_simple_bind_s", rc); 

    exit(3); 
    } 

    printf("Authentification réalisée\n"); 

    /*                                */ 
    /* Recherche des données dans l'annuaire     */ 
    /*                                */ 
    rc = ldap_search_s(pSessionLdap,   // Session LDAP 
    pRacineLdap,     // Base de la recherche 
    LDAP_SCOPE_SUBTREE, // Sccpe : LDAP_SCOPE_BASE, LDAP_SCOPE_ONELEVEL, LDAP_SCOPE_SUBTREE 
    "(objectClass=*)",  // Filtre de recherche 
    NULL,        // Attributs que l'on souhaite visualiser 
    0,          // Indique si l'on souhaite uniquement les types (1) ou 
    // Les attributs et les valeurs (0) 
    &pResultat) ;    // Pointeur vers le résultat 

    if (rc != LDAP_SUCCESS) 
    { 
    // Erreur lors de la recherche, on termine après affichage du message d'erreur 
    AfficheErreurLdap("ldap_search_s", rc); 
    exit (4); 
    } 

    printf("Requête réalisée\n"); 


    /* On va maintenant parcourir le résultat et afficher les couples */ 
    /* attributs, valeurs                               */ 

    pEntree = ldap_first_entry(pSessionLdap, pResultat); 

    while (pEntree != NULL) 
    { 
    // Récupération du DN, et affichage de celui-ci 
    pDN = ldap_get_dn(pSessionLdap, pEntree); 
    if (pDN != NULL) 
    { 
     printf("dn: %s\n", pDN); 

     // Libération de la mémoire allouée par l'API LDAP 
     ldap_memfree(pDN); 
    } 


    // Pour chaque attribut, on va lire le couple attribut, valeur 
    pAttribut = ldap_first_attribute(pSessionLdap, pEntree, &pBer); 
    while ( pAttribut != NULL) 
    { 
     // Récupération des valeurs associées à un attribut 
     pValeurs = ldap_get_values(pSessionLdap, pEntree, pAttribut); 

     if (pValeurs != NULL) 
     { 
     for (i = 0; pValeurs[i] != NULL; i++) 
      printf("%s: %s\n", pAttribut, pValeurs[i]); 

     // Libération des valeurs lues 
     ldap_value_free(pValeurs); 
     } 

     // Libération de la mémoire utilisée par l'attribut 
     ldap_memfree(pAttribut);  

     // Lecture de l'attribut suivant 
     pAttribut = ldap_next_attribute(pSessionLdap, pEntree, pBer); 
    } 

    // Passage à la ligne dans l'affichage 
    printf("\n\n"); 

    // Récupération de l'entrée suivante de l'annuaire 
    pEntree = ldap_next_entry(pSessionLdap, pEntree); 
    } 

    // Libération du message de résultat 
    ldap_msgfree(pResultat); 

    /* Fin de la session LDAP  */ 
    ldap_unbind(pSessionLdap); 
} 


/* 
* 
* Fonction permettant d'afficher les erreurs des opérations LDAP 
* 
* 
*/ 
void AfficheErreurLdap(char *fonction, ULONG rc) 
{ 
    fprintf(stderr,"Erreur LDAP dans la fonction '%s', Code : %ld (0x%xld)\n", fonction, rc,rc); 
} 
+0

申し訳ありませんが、私はLDAPに精通していません。私が使用すべき実際のAPIを指すことができますか? – ahmd0

+0

@ ahmd0、私はいくつかのコードを追加、申し訳ありませんが、コメントはフランス語です。 – JPBlanc

+0

ありがとうございます。それは面白いアプローチです。私はそれを見なければならない... Googleの翻訳と;) – ahmd0

2

が、これは非常に簡単です:、ADsOpenObjectでサーバーに接続IDirectorySearchをインスタンス化し、そのExecuteSearchメソッドを呼び出し、それから(結果データを歩くためにGetFirstRowGetNextRowを使用しますが、このクエリのために、あなただけ期待します1行)。

しかし、実際にはこれはすべてCOMです。つまり、半分程度の関数呼び出しが、少なくとも100行のCOM-cruftinessで失われることを期待してください(そしてコードが堅牢で堅牢で、1000行に近いと驚くことはありません。そのほとんどはActive Directoryへの接続が目立ちません。

これを行う方法は他にもほとんどありますが、MSは少なくとも2つまたは3つの異なる方法でLDAPタイプのデータにアクセスしています。私はこれについていくつかのコードを書いたとき、私は最初に最もクリーンなものを見つけることを試みましたが、欲求不満であきらめました。その時、少なくとも私は「醜いがいくらか文書化された」と決着をつけた。シンプルなWINAPI(いないCOM)CでActive Directoryをアクセスもする方法やC++の場合

+0

Jerry、あなたの "醜い"コードを、たとえ大量の扱いにくいCOMなどでも共有できれば、本当に助けになるでしょう...私はWinAPI/C++のためのソリューションを見つけることを断念しました。 – ahmd0

+0

@ ahmd0:残念ながら、少なくとも合理的ではありません。以前の雇用主のために書かれたもので、投稿する許可を得ることは、おそらくそれを書き換えるよりも多くの仕事になるでしょう。 –

関連する問題