Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RÉCUPÉRATION DOMAINES CONTRÔLEURS DE DOMAINE DANS UNE FORÊT ACTIVE DIRECTORY


Information sur la source

Catégorie :VBScript Classé sous : domaine, dc, controleur, ado Niveau : Initié Date de création : 06/03/2006 Vu : 8 677

Note :
7,25 / 10 - par 4 personnes
7,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

Description

J'utilise ce script dans le cadre d'une surveillance de l'état de réplication des partitions d'annuaire de mon architecture Active Directory
 

Source

  • 'Récupération d'information de la forêt ou d'un domaine enfant
  • 'appel du script sans argument ou en passant le DN du domaine racine:
  • 'Retour des informations pour la forêt
  • 'appel du script en passant le DN d'un domaine enfant existant:
  • 'Retour des informations pour ce domaine enfant
  • 'Retour des informations pour la forêt
  • '
  • 'Retourne les domaines, ses subref et les DC sous la syntaxe suivante:
  • 'nom_dns_du_domaine#dn_du_domaine#subrefs_du_domaine1;subrefs_du_domaine2;..; subrefs_du_domainen#dn_des_dc_du_domaine1;dn_des_dc_du_domaine2;...;dn_des_dc_du_domainen
  • 'Création d'un objet pour la lecture d'argument
  • Set objArgs = WScript.Arguments
  • 'Création d'une connexion avec ADO
  • Set con = CreateObject("ADODB.Connection")
  • Set objCommand = CreateObject("ADODB.Command")
  • con.Open "Provider=ADsDSOObject;"
  • objCommand.ActiveConnection = con
  • 'Lecture du DN du domaine de recherche
  • if (objArgs.Count = 0) then
  • 'Si pas d'argument, alors on retourne tous les DC de la forêt
  • Set objRootDSE = GetObject("LDAP://rootDSE")
  • DN_Domaine=objRootDSE.Get("rootdomainNamingContext")
  • else
  • DN_Domaine=objArgs(0)
  • end if
  • 'Positionnement du filtre
  • filtreDC="(objectClass=domain)"
  • 'Positionnement des champs à retourner
  • retourattributs="distinguishedname,canonicalname,masteredby,subrefs" 'attributs à retourner
  • 'Profondeur de la recherche
  • scope="subtree" 'profondeur de recherche
  • scopeone="onelevel"
  • 'Nb d'objets à retourner
  • objCommand.Properties("Page Size")= 5000 '5000 enregistrements max à retourner
  • 'Constitution de la requête
  • requeterechercheDC="<GC://" & DN_Domaine & ">;" & filtreDC & ";" & retourattributs & ";" & scope
  • 'Exécution de la requête de récupération des DC par domaines
  • objCommand.CommandText=requeterechercheDC
  • Set rs=objCommand.Execute
  • out=""
  • if (rs.RecordCount > 0) then
  • rs.MoveFirst
  • do
  • For Each dom In rs.Fields("canonicalname").value
  • 'Récup du Canonical Name
  • CNDOM=left(dom,len(dom)-1)
  • 'Récup du Distinguished Name
  • DNDOM=rs.Fields("distinguishedname").value
  • 'Récup des SubRefs
  • DNSDOM=""
  • if not(IsNull(rs.Fields("subrefs").value)) then
  • For Each sdom In rs.Fields("subrefs").value
  • DNSDOM=DNSDOM & sdom & ";"
  • next
  • 'Retrait du dernier ;
  • DNSDOM=left(DNSDOM,len(DNSDOM)-1)
  • end if
  • next
  • 'Récup des DC du domaine
  • DNDC=""
  • if not(IsNull(rs.Fields("masteredby").value)) then
  • For Each dc In rs.Fields("masteredby").value
  • DNDC=DNDC & dc & ";"
  • next
  • 'Retrait du dernier ;
  • DNDC=left(DNDC,len(DNDC)-1)
  • end if
  • rs.movenext
  • out=out & CNDOM & "#" & DNDOM & "#" & DNSDOM & "#" & DNDC & vbcrlf
  • loop while Not rs.EOF
  • 'Retrait du dernier retour chariot
  • out=left(out,len(out)-1)
  • end if
  • 'Affichage de la sortie
  • wscript.echo out
'Récupération d'information de la forêt ou d'un domaine enfant
'appel du script sans argument ou en passant le DN du domaine racine:
'Retour des informations pour la forêt
'appel du script en passant le DN d'un domaine enfant existant:
'Retour des informations pour ce domaine enfant
'Retour des informations pour la forêt
'
'Retourne les domaines, ses subref et les DC sous la syntaxe suivante:
'nom_dns_du_domaine#dn_du_domaine#subrefs_du_domaine1;subrefs_du_domaine2;..; subrefs_du_domainen#dn_des_dc_du_domaine1;dn_des_dc_du_domaine2;...;dn_des_dc_du_domainen

'Création d'un objet pour la lecture d'argument
Set objArgs = WScript.Arguments

'Création d'une connexion avec ADO
Set con = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
con.Open "Provider=ADsDSOObject;"
objCommand.ActiveConnection = con


'Lecture du DN du domaine de recherche
if (objArgs.Count = 0) then
	'Si pas d'argument, alors on retourne tous les DC de la forêt
	Set objRootDSE = GetObject("LDAP://rootDSE")
	DN_Domaine=objRootDSE.Get("rootdomainNamingContext")
else
	DN_Domaine=objArgs(0)
end if

'Positionnement du filtre
filtreDC="(objectClass=domain)"

'Positionnement des champs à retourner
retourattributs="distinguishedname,canonicalname,masteredby,subrefs" 'attributs à retourner

'Profondeur de la recherche
scope="subtree" 'profondeur de recherche
scopeone="onelevel"

'Nb d'objets à retourner
objCommand.Properties("Page Size")= 5000 '5000 enregistrements max à retourner


'Constitution de la requête
requeterechercheDC="<GC://" & DN_Domaine & ">;" & filtreDC & ";" & retourattributs & ";" & scope


'Exécution de la requête de récupération des DC par domaines
objCommand.CommandText=requeterechercheDC
Set rs=objCommand.Execute
out=""
if (rs.RecordCount > 0) then
	rs.MoveFirst
	do
		For Each dom In rs.Fields("canonicalname").value
			'Récup du Canonical Name
			CNDOM=left(dom,len(dom)-1)
			'Récup du Distinguished Name
			DNDOM=rs.Fields("distinguishedname").value
			'Récup des SubRefs
			DNSDOM=""
			if not(IsNull(rs.Fields("subrefs").value)) then
				For Each sdom In rs.Fields("subrefs").value
					DNSDOM=DNSDOM & sdom & ";"
				next
				'Retrait du dernier ;
				DNSDOM=left(DNSDOM,len(DNSDOM)-1)
			end if
		next
		'Récup des DC du domaine
		DNDC=""
		if not(IsNull(rs.Fields("masteredby").value)) then
			For Each dc In rs.Fields("masteredby").value
				DNDC=DNDC & dc & ";"
			next
			'Retrait du dernier ;
			DNDC=left(DNDC,len(DNDC)-1)
		end if
		rs.movenext
		out=out & CNDOM & "#" & DNDOM & "#" & DNSDOM & "#" & DNDC & vbcrlf
	loop while Not rs.EOF
	'Retrait du dernier retour chariot
	out=left(out,len(out)-1)
end if
'Affichage de la sortie
wscript.echo out

Commentaires et avis

signaler à un administrateur
Commentaire de econs le 07/03/2006 14:10:28 administrateur CS

C'est propre, bien construit, bien commenté. Bref, agréable à lire.
C'est malheureusement spécifique à un problème que tu as rencontré, donc pas forcément réutilisable par tous.
Ton code est cependant tellement clair qu'il pourrait bien inspirer de futurs débutants avec ADO.

signaler à un administrateur
Commentaire de Baddante le 13/03/2006 18:09:22

Bonjour,

attention à vérifier la réussite de la connexion ADO, dans le cadre d'une supervision cela pourrait déclencher des alertes non légitime.

objCommand.Timeout=60 'pour les serveurs qui seraient derrière une routeur
objCommand.State = State_Enum ' valeurs possible :   adStateClosed,adStateOpen,adStateConnecting,adStateExecuting
,adStateFetching.

Un check routeur / IP en amont permet d'isoler immédiatement les problèmes de réseau / routeur : (les APIs SENS (sensapi) IsNetworkAlive , sont très simple à implémenter.

le script checkrepl.vbs fournit dans le Windows Resource kit de windows 2000 (20003 ?) est plus appropriée à mon avis, il utilise un composant COM dédié à ces opérations iadstools.dll.

Voir aussi le script FRSFLAGS.VBS à utilisé pour vérifier les réplications du GC (Global catalog) et aussi l'outil NTDSUTIL.exe en mode console.

enfin dernier petit conseil, s'il y a des mots de passe très sensible, sécurisé le stockage des scripts avec des permissions NTFS et crypter vos scripts  contenant des comptes et mot de passe (Script Encoder).

Bravo à l'auteur tous mes encouragements.

signaler à un administrateur
Commentaire de toutou2000 le 29/06/2006 14:55:04

bonjour a tout le monde
est ce quelqu'un peus me aidé SVP
j'entraine de faire une synchronisation entre AD et open LDAP. pour ce faire
1.j'ai importer les objet d'AD sous format d'un fichiers LDIf et j'ai commancé à traité ce fichier par des scripte awk mais le probléme que j'ai rencontrer et le suivant. dans cette fichies il y a pas un champs qui répresente les mots de passe des utilisateurs meme crypté. est ce que quelle qu'un à des aidés comment récupérer les id/mots de passe d'AD sous format text meme si ce sont cryptés
merci.

signaler à un administrateur
Commentaire de Baddante le 29/06/2006 19:37:41

Salut,

faudrait savoir si les schémas AD et OpenLDAP sont identiques (DIT).
Dans Quel sens ce fait la synchro ? Es-ce que tu fais un import / export binaire en mode brut / trace (diag) avec quel jeux de caractères, unicode ? as-tu les permissions aux niveaux des 2 annuaires. Es-ce que tu as une session LDAP v. 2 ou 3 port LDAP standard (389) ou SSL ?

En ce qui concerne les "id" cela correspond à des comptes LDAP / AD mais pas forcément on peut avoir un ou plusieurs comptes LDAP et un ou plusieurs comptes NT liés ou pas.

Les mots de passe en général (API: NTLM et ADSI) ne sont pas exportable, sauf peut-être crypté mais j'en doute.
En général c'est une propriétée en "écriture seulement" et non lecture.

Extrait ADSI2.5 SDK:
unicodePwd :(property)
The unicodePwd property is the password for the user.
For setting the password of the user, you should use the IADsUser::ChangePassword method (if your script or application is allowing the user to change his/her own password) or IADsUser::SetPassword method (if your script or application is allowing an administrator to reset a password).

The password of the user in Windows NT (NT) one-way format (OWF). Windows 2000 uses the NT OWF. This property is used only by operating system. Note that you cannot derive the clear password back from the OWF form of the password.
(iads.h)

Enfin il faut pas oublier que même si c'est AD il utilise encore les SID sur certains objets : ACL (permissions) NTFS, ACL registre NT, ACL sur des shares.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

PB pour alimenter une Datagrid sans controleur ADO [ par tweeny ] BonjourJ'ai un problème pour alimenter une DataGrid sans un controleur ADO.J'ai créé un RECORSET, ma requette SQL fonctione, je fais un SET magrid.dat ADO DC Fournisseur ? [ par Algade ] AlgadeJ'ai compilé un pgm VB6 utilisant ADO et il s'installe correctement. Par contre, à l'exécution j'ai le message : ADODC impossible de trouver le Comment trouver le nom d'un controleur de domaine sur un domaine AD [ par philmaitre ] Bonjourje cherche une fonction vb6 qui me permettrait de trouver le nom de machine (hostname) ou adresse IP du controleurde domaine principal d'un dom Vb6 active directory [ par sodjess ] je voudrais afficher le contenu de mon annuaire à partir de active directory dans chaque colonne de lstbox . j'arrive afficher le nom de l'ordinate Requête ADO en VBA [ par DevConf ] Bonjour,Je développe actuellement un add-in Outlook communiquant avec une base de données Access.J'ai fait une requête SELECT qui marche très bien.Je Lister les DC 2000 de tous les domaines de ma Foret [ par orducom1 ] Bonjour tout le monde !Je me suis fait ce petit script pour me remonter les contrôleurs de domaine sous Win 2000 de tous les domaines de ma Foret.J'ai cours et exercice+solution de ado net [ par rexavry ] slt à tt le monde ,qlq'un m'aide de telecharger un cours de ado net contient des exercice et son corrigeSVPmerci à tt Erreur 70 à la copie de pst en VB [ par medou12 ] Bonjour à tous J'essaie en vain de mettre en place une copie des pst de nos collaborateurs sur un dossier du serveur de domaine. (où se situe le VB) J VB + ADO - Champs de type Varchar [ par zet63 ] Bonjour a tous,Je developpe un outils en vb.net + ado qui doit réorganiser des bases access 95.Ces bases sont ensuite utilisées par un logiicel tiers


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,998 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.