WinAPI/C++を使用してローカルコンピュータ(Active Directoryに接続されている)が所属するOUの名前を調べる必要があります。何か案は?理論的にはローカルコンピュータが所属するOU(Organizational Unit)名をC++で取得する
答えて
管理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);
}
が、これは非常に簡単です:、ADsOpenObject
でサーバーに接続IDirectorySearch
をインスタンス化し、そのExecuteSearch
メソッドを呼び出し、それから(結果データを歩くためにGetFirstRow
とGetNextRow
を使用しますが、このクエリのために、あなただけ期待します1行)。
しかし、実際にはこれはすべてCOMです。つまり、半分程度の関数呼び出しが、少なくとも100行のCOM-cruftinessで失われることを期待してください(そしてコードが堅牢で堅牢で、1000行に近いと驚くことはありません。そのほとんどはActive Directoryへの接続が目立ちません。
これを行う方法は他にもほとんどありますが、MSは少なくとも2つまたは3つの異なる方法でLDAPタイプのデータにアクセスしています。私はこれについていくつかのコードを書いたとき、私は最初に最もクリーンなものを見つけることを試みましたが、欲求不満であきらめました。その時、少なくとも私は「醜いがいくらか文書化された」と決着をつけた。シンプルなWINAPI(いないCOM)CでActive Directoryをアクセスもする方法やC++の場合
Jerry、あなたの "醜い"コードを、たとえ大量の扱いにくいCOMなどでも共有できれば、本当に助けになるでしょう...私はWinAPI/C++のためのソリューションを見つけることを断念しました。 – ahmd0
@ ahmd0:残念ながら、少なくとも合理的ではありません。以前の雇用主のために書かれたもので、投稿する許可を得ることは、おそらくそれを書き換えるよりも多くの仕事になるでしょう。 –
- 1. webroleが所属するデプロイメントの名前と場所を取得する
- 2. TCL私が所属するproc名を取得
- 3. OpenLDAPでは2つの異なるOU(Organizational Unit)の下に1人のユーザ(エントリ)を割り当てることは可能ですか?
- 4. チェックボックスを取得するC#のカスタム属性名によるコントロール
- 5. C#で属性コンテキストを取得する
- 6. プログラムでC++クラス名を取得する
- 7. C#でプロパティ名を取得する
- 8. デフォルトの名前空間でxmlpathの属性を取得するC#
- 9. C++の構造体:名前で属性を取得
- 10. プロセス名を取得するC++
- 11. asp.netでxml要素の属性名を取得する方法
- 12. Herokuをローカルコンピュータでエミュレートする
- 13. LinuxのC/C++でユーザー名を取得する方法は?
- 14. 特定のOU内のユーザーの数を取得し、そのサブOUの
- 15. Active Directoryグループのユーザー名をCで取得する
- 16. Cでダウンロードする前にバイナリファイルの名前を取得する
- 17. ネットワークの場所からコンピュータ名を取得する
- 18. 現在の場所と都市名を取得するXamarin.Android
- 19. RoR:ファイル(添付ファイル)の名前/場所を取得する
- 20. NET START <SERVICE> - サービス名を取得する方法/場所
- 21. Test :: Unit :: TestCaseからスタックトレースを取得する方法
- 22. jQueryジオコードで住所を取得する
- 23. PostgreSQLのDB所有者名を取得
- 24. 連絡先が所属するグループを取得するにはどうすればよいですか?
- 25. SyntaxErrorのファイル名とリネオ属性を取得する方法
- 26. XSDスキーマから属性名と型を取得するXquery?
- 27. XMLノードの属性名を取得する方法 - GDataXMLNode
- 28. 指定されたテーブルのキー属性名を取得する
- 29. ユーザー名などのユーザーセッション属性を取得する方法は?
- 30. ユーザーが属しているOU内のグループ
を見るには、http://stackoverflow.comを見て/ questions/8314496/is-it-possible-to-find-the-local-computer-in-ad-without-hardcoding-its-domain –
ありがとうございますが、管理されたC++はオプションではありません... – ahmd0