Comment puis-je obtenir la liste de tous mes ordinateurs Windows Server 2003 ?

S'il vous plaît Monsieur Script...

Hey, Scripting Guy!

Bienvenue dans cette section TechNet, dans laquelle le Monsieur Script de Microsoft répond aux questions récurrentes sur les scripts d'administration système.

Question du jour : comment puis-je obtenir la liste de tous mes ordinateurs Windows Server 2003 ?

Comment puis-je obtenir la liste de tous mes ordinateurs Windows Server 2003 ?Comment puis-je obtenir la liste de tous mes ordinateurs Windows Server 2003 ?

S'il vous plaît Monsieur Script... Comment puis-je obtenir les noms de tous les ordinateurs de mon domaine qui exécutent Windows Server 2003 ?

-- AS

Bonjour AS. Lorsque nous sélectionnons les questions auxquelles nous allons répondre dans cette rubrique, nous essayons de choisir des questions dans des domaines de script distincts. Cette démarche présente pour nous deux avantages : elle garantit la diversité du contenu et évite que vous ayez l'impression de voir les mêmes questions et réponses revenir sans cesse. Il faut cependant avouer que nous devenons parfois un peu fainéants et, dans ce cas, nous faisons souvent appel à l'une de nos anciennes solutions de secours : rechercher dans Active Directory.

Comme vous pouvez vous en douter, nous avons aujourd'hui choisi d'être fainéants. Comment pouvez-vous obtenir les noms de tous les ordinateurs de votre domaine qui exécutent Windows Server 2003 ? Eh bien, en recherchant dans Active Directory.

Voici un script qui renvoie un écho des noms de tous les ordinateurs du domaine fabrikam.com qui exécutent Windows Server 2003 :

Const ADS_SCOPE_SUBTREE = 2

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"

Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = _
    "SELECT Name FROM 'LDAP://DC=fabrikam,DC=com' WHERE objectClass='computer' " & _
        "and operatingSystemVersion = '5.2 (3790)'"  
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst

Do Until objRecordSet.EOF
    Wscript.Echo "Computer Name: " & objRecordSet.Fields("Name").Value
    objRecordSet.MoveNext
Loop

À l'instar de tous les scripts de recherche Active Directory, la clé de ce script repose sur la requête SQL. Dans cette requête, nous recherchons tous les ordinateurs (objectClass='ordinateur') dont la version du système d'exploitation est Windows Server 2003 (operatingSystemVersion = '5.2 (3790)'). Nous ne faisons que renvoyer les noms de tous les ordinateurs pour lesquels l'attribut operatingSystemVersion possède la valeur  5.2 (3790), car c'est ainsi que le numéro de version de Windows Server 2003 est stocké dans Active Directory.

Et comment avons-nous pu savoir que le numéro de version de Windows Server 2003 stocké dans Active Directory était 5.2 (3790) ? C'est très simple, nous sommes les Messieurs Script, alors nous savons absolument tout !

D'accord, trêve de plaisanterie, nous avons ouvert la console Utilisateurs et ordinateurs Active Directory et localisé un ordinateur qui, à notre connaissance, exécutait Windows Server 2003. Nous avons cliqué avec le bouton droit sur le nom de cet ordinateur, puis nous avons cliqué sur Propriétés. Nous avons ensuite recherché, sous l'onglet Système d'exploitation, la version du système d'exploitation.

Nous aurions également pu utiliser un script pour extraire tous les systèmes d'exploitation et les numéros de version à partir d'Active Directory. Malheureusement, Active Directory ne prenant pas en charge le type de requête SQL SELECT DISTINCT, il est impossible d'extraire uniquement les 2, 3 ou 4 systèmes d'exploitation en cours d'utilisation. Nous aurions dû alors extraire tous les ordinateurs et leurs systèmes d'exploitation, puis parcourir la liste afin d'identifier les versions uniques. Mais, ceci pourrait être un bon exercice pour vous : essayez de trouver le moyen d'insérer dans ce script une sorte de filtre afin qu'il n'affiche que les versions de système d'exploitation uniques (distinctes). (Suggestion : vous pourriez envisager de créer un objet Dictionnaire pour y stocker les versions. Cela vous permettrait de vérifier facilement si la version existe déjà dans le Dictionnaire et, si c'est le cas, de ne pas y ajouter les doublons.)

Et voici le script :

Const ADS_SCOPE_SUBTREE = 2

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"

Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = _
    "Select operatingSystem, operatingSystemVersion from " & _
        "'LDAP://DC=fabrikam,DC=com' where objectClass='computer' ORDER BY operatingSystem"  
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst

Do Until objRecordSet.EOF
    Wscript.Echo objRecordSet.Fields("operatingSystem").Value, _
        objRecordSet.Fields("operatingSystemVersion").Value
    objRecordSet.MoveNext
Loop
Pour en savoir plus

Consultez les archives de S'il vous plaît Monsieur Script... site en anglais