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 : 7 674

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 champ memo access et ado [ par sylvae34 ] Je voudrais récupéré ce que j'ai dans un rtxbox et l'enregistrer dans un champ mémo d'une base access, mais le champs reste toujours vide.Merci de vot Update method sur un controle ADO [ par philagui ] Apprenti en Visual Basic.Bonjour,ayant créé une form avec un controle ADO lié à une base de données Access, j'ai expérimenté la chose suivante: lorsqu Save et ADO [ par MrHyDe ] Bonjour a tous,je veux enregistrer le contenu d'un adodb.recordset dans un fichier texte pour ensuite l'importer sous excel. J'utilise la méthode gets Accès à une BD avec ADO [ par eren ] J'ai crée un Form ave le contrôle Microsoft ADO Data Control (adodc1)Dans le champ RecordSource de ce controle, j'ai choisi une requête et toutfonctio PB DE TRANSACTION AVEC CONNEXION ADO [ par sonia2002 ] SLT tt le monde,j'ai un probleme lors de la creation d'une transaction sous VB6 en utilisant une connexion ADO, voici le code que j'ai ecris:....initi HELP SVP ADO/SQL........................... [ par spiderone ] UcnnADO.Provider = "Microsoft.jet.OLEDB.4.0"UcnnADO.CursorLocation = adUseClientUchaineADO = TPathFileDest.Text'&gt;&gt;&gt; est la chaine contenue da Problemes ado [ par shaoni ] bonjour à tous voila j'ai un petit probleme avec ADO je fait strSQL = "DROP TABLE FactTemp"ensuite strSQL = "SELECT * INTO FactTemp from Facture et Connection ADO et ACCESS XP :(( [URGENT] [ par Killermanx ] Hello ! Bon voilà mon pb...impossible de créer la connexion ADO avec une base de donnée Access XP !SI qqu1 pouvait m'aider se serait vraiment sympa..


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode

Téléchargements

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



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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,36 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é.