Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

AD: comment retrouver les machines presentes sur un site

4 réponses
Avatar
StephaneB
Bonjour,

Comment puis-je faire pour obtenir la liste de toutes les machines
présentes sur un site dans Active Directory en executant un script sur
une des machines de ce site (avec les droits admin du domaine)

D'avance merci

4 réponses

Avatar
Gilles LAURENT
"StephaneB" a écrit dans le message de
news:Oq3K$
| Bonjour,

Bonjour,

| Comment puis-je faire pour obtenir la liste de toutes les machines
| présentes sur un site dans Active Directory en executant un script sur
| une des machines de ce site (avec les droits admin du domaine)
|
| D'avance merci

Je suppose qu'il n'y a aucune indication (dans le nom de la machine par
exemple) qui permette de déterminer facilement son appartenance à un
site. Si c'est la cas alors cela n'est pas simple car l'information sur
la relation site - machine n'est présente dans l'annuaire Active
Directory que pour les contrôleurs de domaine. De ce fait, une simple
requête ldap ne suffit pas. Toutefois une solution possible pour obtenir
cette liste consisterait à réaliser les opérations suivantes :
- déterminer le nom du site de la machine locale
- extraire les adresses de sous-réseau associées au site
- énumérer toutes les machines du domaine
- pour chaque machine faire un nslookup ou un ping
- comparer l'adresse IP obtenue avec les adresses de sous-réseau
- ajouter la machine à la liste si son IP est associée au site

Une autre solution, beaucoup moins performante, consisterait à
interroger toutes les machines du domaine pour connaître leur site en
exécutant un script en WSH Remote :
- déterminer le nom du site de la machine locale
- énumérer toutes les machines du domaine
- pour chaque machine exécuter le remotescript permettant de récupérer
le site
- comparer le nom du site de la machine distante avec celui de la
machine locale
- ajouter la machine à la liste si le nom du site est identique

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
Avatar
StephaneB
"StephaneB" a écrit dans le message de
news:Oq3K$
| Bonjour,

Bonjour,

| Comment puis-je faire pour obtenir la liste de toutes les machines
| présentes sur un site dans Active Directory en executant un script sur
| une des machines de ce site (avec les droits admin du domaine)
|
| D'avance merci

Je suppose qu'il n'y a aucune indication (dans le nom de la machine par
exemple) qui permette de déterminer facilement son appartenance à un
site. Si c'est la cas alors cela n'est pas simple car l'information sur
la relation site - machine n'est présente dans l'annuaire Active
Directory que pour les contrôleurs de domaine. De ce fait, une simple
requête ldap ne suffit pas. Toutefois une solution possible pour obtenir
cette liste consisterait à réaliser les opérations suivantes :
- déterminer le nom du site de la machine locale
- extraire les adresses de sous-réseau associées au site
- énumérer toutes les machines du domaine
- pour chaque machine faire un nslookup ou un ping
- comparer l'adresse IP obtenue avec les adresses de sous-réseau
- ajouter la machine à la liste si son IP est associée au site

Une autre solution, beaucoup moins performante, consisterait à
interroger toutes les machines du domaine pour connaître leur site en
exécutant un script en WSH Remote :
- déterminer le nom du site de la machine locale
- énumérer toutes les machines du domaine
- pour chaque machine exécuter le remotescript permettant de récupérer
le site
- comparer le nom du site de la machine distante avec celui de la
machine locale
- ajouter la machine à la liste si le nom du site est identique



Bonjour et merci pour la réponse,

Je pensais qu'on pouvais trouver directement dans AD une correspondance
entre une machine et un site. Puisque ce n'est pas le cas, et étant
donné que chaque site est regroupé dans une OU, je vais creer un fichier
ini dans lequel j'inscrirai ces correspondances. Cette étape est
nécessaire car le script sera lancé du DC du site, qui n'est pas dans la
même OU (Domain Controllers) que les autres machines du site.

Je classe quand même votre solution dans mes archives...

Avatar
Gilles LAURENT
"Gilles LAURENT" a écrit dans le message de
news:%23N$

[...]

| - déterminer le nom du site de la machine locale
| - extraire les adresses de sous-réseau associées au site
| - énumérer toutes les machines du domaine
| - pour chaque machine faire un nslookup ou un ping
| - comparer l'adresse IP obtenue avec les adresses de sous-réseau
| - ajouter la machine à la liste si son IP est associée au site

Ci-dessous le script VBScript 'enumComputersInSite.vbs' permettant de
constituer la liste des ordinateurs appartenant au même site que
l'ordinateur sur lequel le script s'exécute.

+++ Pré requis
Tous les ordinateurs doivent posséder un enregistrement dans le système
DNS.

+++ Usage
Sur un ordinateur du site pour lequel constituer la liste :
>cscript enumComputersInSite.vbs

-- Coupez ici : enumComputersInSite.vbs --

Option Explicit

Dim colSubnets, colComputers
Dim strSiteName, strComputer, strComputerIPAddress, strSubnet
Dim nNumIPAddr, nMaskBits, nLoNumIPAddr, nHiNumIPAddr

' détermination du site pour la machine locale
strSiteName = GetCurrentMachineSiteName
WScript.Echo "[" & strSiteName & "]"

' lecture des sous-réseaux associés au site
colSubnets = GetSubnetsForSite (strSiteName)

' énumération des comptes d'ordinateur présents dans l'annuaire
colComputers = GetAllDomainObjects ("computer")

' traitement de chaque compte d'ordinateur
For Each strComputer In colComputers

' détermination de l'adresse IP à partir du nom
' l'ordinateur doit posséder un enregistrement DNS
strComputerIPAddress = NSLookup (strComputer)
If strComputerIPAddress <> "" Then

' conversion de l'adresse IP au format numérique
nNumIPAddr = _
ConvertIPAddressToNumeric (strComputerIPAddress)

' détermination de la présence de l'adresse IP dans les
' sous-réseaux associés au site
For Each strSubnet In colSubnets

' extraction du masque de bits
nMaskBits = Split (strSubnet, "/")

' calcul des limites d'adressage pour le sous-réseau
nLoNumIPAddr = _
ConvertIPAddressToNumeric (nMaskBits (0))
nHiNumIPAddr = _
nLoNumIPAddr + (2 ^ (32 - nMaskBits (1))) - 1

' test de la présence de l'adresse IP dans le sous-réseau
If nNumIPAddr => nLoNumIPAddr And _
nNumIPAddr <= nHiNumIPAddr Then

' l'ordinateur se situe dans le site
WScript.Echo strComputer & _
" (" & strComputerIPAddress & ")"
Exit For
End If
Next
Else
' le nom de hôte n'a pas été résolu
WScript.Echo "#" & strComputer & " (unable to resolve)"
End If
Next

' conversion de l'adresse IP au format numérique
Function ConvertIPAddressToNumeric (IPAddress)

Dim Bytes

Bytes = Split (IPAddress, ".")
ConvertIPAddressToNumeric = Bytes (0) * (2 ^ 24) + _
Bytes (1) * (2 ^ 16) + _
Bytes (2) * (2 ^ 8) + _
Bytes (3)

End Function

' lecture du nom du site auquel la machine locale appartient
Function GetCurrentMachineSiteName

Dim oSysInfo

Set oSysInfo = CreateObject ("ADSystemInfo")
GetCurrentMachineSiteName = oSysInfo.SiteName

End Function

' lecture des sous-réseaux définis pour le site
Function GetSubnetsForSite (strSiteName)

Dim oSite
Dim colSiteObjectBL
Dim strSiteObjectBL, strSubnets

Set oSite = GetObject ("LDAP://cn=" & strSiteName & _
",cn=Sites," & getObject("LDAP://rootDse"). _
get("configurationNamingContext"))

oSite.GetInfoEx Array ("siteObjectBL"), 0
colSiteObjectBL = oSite.GetEx ("siteObjectBL")

For Each strSiteObjectBL In colSiteObjectBL
strSubnets = strSubnets & _
Split (Split (strSiteObjectBL, ",")(0), _
"=")(1) & VbCrLf
Next

strSubnets = Left (strSubnets, Len (strSubnets) - 2)
GetSubnetsForSite = Split (strSubnets, VbCrLf)

End Function

' recherche des objets présents dans l'annuaire
Function GetAllDomainObjects (strCategory)

Dim oConn, oRS
Dim strComputers

Set oConn = CreateObject ("ADODB.Connection")
oConn.Open "Provider­sDSOObject;"

' exécution de la requête ldap
set oRS = oConn.Execute ("<LDAP://" & _
getObject("LDAP://rootDse"). _
get("defaultNamingContext") & ">;" & _
"(&(objectCategory=" & strCategory & ")" & _
");name;subtree")

' lecture des objets et constitution d'une collection
Do until oRS.EOF
strComputers = strComputers & _
UCase (oRS.Fields("name")) & VbCrLf
oRS.MoveNext
Loop

strComputers = Left (strComputers, Len (strComputers) - 2)
GetAllDomainObjects = Split (strComputers, VbCrLf)

End Function

' recherche de l'adresse IP d'une machine via l'outil nslookup
Function NSLookup (strComputer)

Dim oSh, oEx
Dim strLine, strIPAddress

' initialisation
Set oSh = CreateObject ("WScript.Shell")

' exécution d'une commande externe
Set oEx = oSh.Exec ("%comspec% /c nslookup " & strComputer)

' attente de la fin de la commande externe
Do While oEx.Status = 0

' temporisation
WScript.Sleep (10)

Loop

' lecture de la sortie de commande
Do While Not oEx.Stdout.AtEndOfStream
strLine = Trim (oEx.Stdout.Readline)
If Left (strLine, 5) = "Nom :" Then

' le nom de hôte a été résolu
strLine = Split (oEx.Stdout.Readline, ":")
strIPAddress = Trim (strLine (1))
Exit Do
End If
Loop

NSLookup = strIPAddress

End Function

-- Coupez ici : enumComputersInSite.vbs --

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
Avatar
StephaneB
"Gilles LAURENT" a écrit dans le message de
news:%23N$

[...]

| - déterminer le nom du site de la machine locale
| - extraire les adresses de sous-réseau associées au site
| - énumérer toutes les machines du domaine
| - pour chaque machine faire un nslookup ou un ping
| - comparer l'adresse IP obtenue avec les adresses de sous-réseau
| - ajouter la machine à la liste si son IP est associée au site

Ci-dessous le script VBScript 'enumComputersInSite.vbs' permettant de
constituer la liste des ordinateurs appartenant au même site que
l'ordinateur sur lequel le script s'exécute.

+++ Pré requis
Tous les ordinateurs doivent posséder un enregistrement dans le système
DNS.

+++ Usage
Sur un ordinateur du site pour lequel constituer la liste :
>cscript enumComputersInSite.vbs

-- Coupez ici : enumComputersInSite.vbs --

Option Explicit

Dim colSubnets, colComputers
Dim strSiteName, strComputer, strComputerIPAddress, strSubnet
Dim nNumIPAddr, nMaskBits, nLoNumIPAddr, nHiNumIPAddr

' détermination du site pour la machine locale
strSiteName = GetCurrentMachineSiteName
WScript.Echo "[" & strSiteName & "]"

' lecture des sous-réseaux associés au site
colSubnets = GetSubnetsForSite (strSiteName)

' énumération des comptes d'ordinateur présents dans l'annuaire
colComputers = GetAllDomainObjects ("computer")

' traitement de chaque compte d'ordinateur
For Each strComputer In colComputers

' détermination de l'adresse IP à partir du nom
' l'ordinateur doit posséder un enregistrement DNS
strComputerIPAddress = NSLookup (strComputer)
If strComputerIPAddress <> "" Then

' conversion de l'adresse IP au format numérique
nNumIPAddr = _
ConvertIPAddressToNumeric (strComputerIPAddress)

' détermination de la présence de l'adresse IP dans les
' sous-réseaux associés au site
For Each strSubnet In colSubnets

' extraction du masque de bits
nMaskBits = Split (strSubnet, "/")

' calcul des limites d'adressage pour le sous-réseau
nLoNumIPAddr = _
ConvertIPAddressToNumeric (nMaskBits (0))
nHiNumIPAddr = _
nLoNumIPAddr + (2 ^ (32 - nMaskBits (1))) - 1

' test de la présence de l'adresse IP dans le sous-réseau
If nNumIPAddr => nLoNumIPAddr And _
nNumIPAddr <= nHiNumIPAddr Then

' l'ordinateur se situe dans le site
WScript.Echo strComputer & _
" (" & strComputerIPAddress & ")"
Exit For
End If
Next
Else
' le nom de hôte n'a pas été résolu
WScript.Echo "#" & strComputer & " (unable to resolve)"
End If
Next

' conversion de l'adresse IP au format numérique
Function ConvertIPAddressToNumeric (IPAddress)

Dim Bytes

Bytes = Split (IPAddress, ".")
ConvertIPAddressToNumeric = Bytes (0) * (2 ^ 24) + _
Bytes (1) * (2 ^ 16) + _
Bytes (2) * (2 ^ 8) + _
Bytes (3)

End Function

' lecture du nom du site auquel la machine locale appartient
Function GetCurrentMachineSiteName

Dim oSysInfo

Set oSysInfo = CreateObject ("ADSystemInfo")
GetCurrentMachineSiteName = oSysInfo.SiteName

End Function

' lecture des sous-réseaux définis pour le site
Function GetSubnetsForSite (strSiteName)

Dim oSite
Dim colSiteObjectBL
Dim strSiteObjectBL, strSubnets

Set oSite = GetObject ("LDAP://cn=" & strSiteName & _
",cn=Sites," & getObject("LDAP://rootDse"). _
get("configurationNamingContext"))

oSite.GetInfoEx Array ("siteObjectBL"), 0
colSiteObjectBL = oSite.GetEx ("siteObjectBL")

For Each strSiteObjectBL In colSiteObjectBL
strSubnets = strSubnets & _
Split (Split (strSiteObjectBL, ",")(0), _
"=")(1) & VbCrLf
Next

strSubnets = Left (strSubnets, Len (strSubnets) - 2)
GetSubnetsForSite = Split (strSubnets, VbCrLf)

End Function

' recherche des objets présents dans l'annuaire
Function GetAllDomainObjects (strCategory)

Dim oConn, oRS
Dim strComputers

Set oConn = CreateObject ("ADODB.Connection")
oConn.Open "Provider­sDSOObject;"

' exécution de la requête ldap
set oRS = oConn.Execute ("<LDAP://" & _
getObject("LDAP://rootDse"). _
get("defaultNamingContext") & ">;" & _
"(&(objectCategory=" & strCategory & ")" & _
");name;subtree")

' lecture des objets et constitution d'une collection
Do until oRS.EOF
strComputers = strComputers & _
UCase (oRS.Fields("name")) & VbCrLf
oRS.MoveNext
Loop

strComputers = Left (strComputers, Len (strComputers) - 2)
GetAllDomainObjects = Split (strComputers, VbCrLf)

End Function

' recherche de l'adresse IP d'une machine via l'outil nslookup
Function NSLookup (strComputer)

Dim oSh, oEx
Dim strLine, strIPAddress

' initialisation
Set oSh = CreateObject ("WScript.Shell")

' exécution d'une commande externe
Set oEx = oSh.Exec ("%comspec% /c nslookup " & strComputer)

' attente de la fin de la commande externe
Do While oEx.Status = 0

' temporisation
WScript.Sleep (10)

Loop

' lecture de la sortie de commande
Do While Not oEx.Stdout.AtEndOfStream
strLine = Trim (oEx.Stdout.Readline)
If Left (strLine, 5) = "Nom :" Then

' le nom de hôte a été résolu
strLine = Split (oEx.Stdout.Readline, ":")
strIPAddress = Trim (strLine (1))
Exit Do
End If
Loop

NSLookup = strIPAddress

End Function

-- Coupez ici : enumComputersInSite.vbs --

Bonjour,


çà marche nickel!


Merci Beaucoup.