OVH Cloud OVH Cloud

DHCP encore et toujours !

20 réponses
Avatar
Vincent
Bonjour,

Je suis en train de me tuer à essayer de scripter la modification de la
Class DHCP sur les postes de travail. Je pars du code suivant:

On Error Resume Next
strComputer = "."
Set StdOut = WScript.StdOut
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

'****************** definition de la classe ***********************
dim shell
set shell = wscript.createobject("wscript.shell")
r=shell.run ("ipconfig /setclassid " & Chr(34) & "Connexion au réseau local"
& Chr(34) & " NEWCLASS",,true)

'*********** renew de la conf dhcp pour toutes les cartes ****************
For Each objNetCard in colNetCards
objNetCard.RenewDHCPLease()
Next

Mes problèmes sont les suivants:
1) Les cartes réseaux n'ont pas toutes le même nom, de plus pour les
portables il y a aussi la carte sur la station d'accueil à prendre en compte
(toutefois,appliquer la modif sur toutes les cartes est envisageable). y a
t'il un moyen de faire la modif sur toutes les cartes ?

2) Je voulais gérer cette modif via une GPO mais on me demande de faire
différemment :-( à savoir en récupérant le nom des machines via une
connection LDAP (ça je sais faire) ou un fichier (je sais faire aussi), et
d'appliquer la modif à chaque machine.

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, Location from
'LDAP://ou=workstations,ou=SIEGE,dc=mycompany,dc=fr' " _
& "Where objectClass='computer'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst

Le pb est que je n'arrive pas à intégrer les 2 codes ci-dessus, en clair
pousser une commande Netsh sur des machines distantes !

3) Il faut aussi créer un fichier de résultat contenant les machines ayant
reçu la modif et celles non modifiées. Vu que le nom de la classe n'apparaît
pas dans le registre, cette info n'est pas facile à récuperer, ou alors via
un IPCONFIG /SHOWCLASSID renvoyé dans un fichier et revenir lire l'info dans
ce fichier mais ça ne me paraît pas être la solution la plus simple !

Voilà, si quelqu'un de généreux peux me filer un coup de main, j'accepte
avec grand plaisir :-)

Vincent

10 réponses

1 2
Avatar
Vincent

"Vincent" a écrit dans le message
de news:

[...]

| Non. J'exécute le script via une invite de commande (CSCRIPT
| monscript.vbs) et il reste planté sur "Processing Machine1 ... "

Pouvez-vous mettre en commentaire la ligne suivante de votre script :
On Error Resume Next


Bien joué ! -> permission denied, pourtant j'utilise un compte admin du
domaine

Et cependant, j'ai essayé cette commande qui passe correctement:
objFSO.CopyFile "SetClassID.VBS" , "" & strComputer & "admin$"

Je vais vérifier ...


--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD





Avatar
Gilles LAURENT
"Vincent" a écrit dans le message
de news:

[...]

| Bien joué ! -> permission denied, pourtant j'utilise un compte admin
| du domaine
|
| Et cependant, j'ai essayé cette commande qui passe correctement:
| objFSO.CopyFile "SetClassID.VBS" , "" & strComputer & "admin$"

Sous XP SP2 il est nécessaire de modifier un paramètre de stratégie sur
le poste maître (celui qui déclenche l'exécution du script
'setClassId.vbs' sur le poste distant) :
Lancez gpedit.msc sur le poste maître
Paramètres Windows
Paramètres de sécurité
Stratégies locales
Options de sécurité
DCOM: Restrictions d'accès ordinateur ...
ANONYMOUS LOGON
[x] Accès local
[x] Accès distant

>gpupdate /force

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
Avatar
Vincent
Bonjour Gilles,

J'ai effectivement trouvé cette info hier soir dans des forums. Je l'ai
appliqué et je n'ai plus le message "permission denied". Par contre j'ai eu
ensuite une erreur ActiveX que j'ai resolu en appliquant la commande WScript
-regserver sur le poste client.

Finalement, le script fonctionne maintenant pour le spostes XP. Par contre,
le problème avec NetConnectionID sur les postes W2000 persiste ...

Si vous avez encore un peu de temps à me consacrer ... ! ;-)

Bonne journée,

Vincent


"Vincent" a écrit dans le message
de news:

[...]

| Bien joué ! -> permission denied, pourtant j'utilise un compte admin
| du domaine
|
| Et cependant, j'ai essayé cette commande qui passe correctement:
| objFSO.CopyFile "SetClassID.VBS" , "" & strComputer & "admin$"

Sous XP SP2 il est nécessaire de modifier un paramètre de stratégie sur
le poste maître (celui qui déclenche l'exécution du script
'setClassId.vbs' sur le poste distant) :
Lancez gpedit.msc sur le poste maître
Paramètres Windows
Paramètres de sécurité
Stratégies locales
Options de sécurité
DCOM: Restrictions d'accès ordinateur ...
ANONYMOUS LOGON
[x] Accès local
[x] Accès distant

>gpupdate /force

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD





Avatar
Vincent
Bonsoir Gilles,

Pour faire suite à nos différents échanges, je vous confirme que les
solutions que vous m'avez proposées m'ont permis de finaliser mon script
concernant les postes XP, et je vous en remercie.

Concernant les postes W2000, je viens de passer cette journée entière à
faire des recherches et des tests cependant négatifs. Je n'ai pas trouvé de
solution pour ce type de poste, en utilisant la fonction de remote script.
Par contre, j'ai toujours la solution GPO qui elle fonctionne pour l'ensemble
des postes mais qui ne convient pas forcément car nous ne voulons pas
centraliser ce processus. En fait, une partie des taches d'administration est
déléguée aux différentes régions, et la gestion du service DHCP (client et
serveur) en fait partie. (et la gestion des GPO est elle centralisée sur le
siège)

Si vous aviez la moindre idée pour contourner l'incompatibilté de
NetConnectionID sur les postes W2000, j'en serais très heureux.

Très cordialement,

Vincent





"Vincent" a écrit dans le message
de news:

[...]

| Bien joué ! -> permission denied, pourtant j'utilise un compte admin
| du domaine
|
| Et cependant, j'ai essayé cette commande qui passe correctement:
| objFSO.CopyFile "SetClassID.VBS" , "" & strComputer & "admin$"

Sous XP SP2 il est nécessaire de modifier un paramètre de stratégie sur
le poste maître (celui qui déclenche l'exécution du script
'setClassId.vbs' sur le poste distant) :
Lancez gpedit.msc sur le poste maître
Paramètres Windows
Paramètres de sécurité
Stratégies locales
Options de sécurité
DCOM: Restrictions d'accès ordinateur ...
ANONYMOUS LOGON
[x] Accès local
[x] Accès distant

>gpupdate /force

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD





Avatar
Gilles LAURENT
"Vincent" a écrit dans le message
de news:
| Bonsoir Gilles,

Bonsoir Vincent,

| Pour faire suite à nos différents échanges, je vous confirme que les
| solutions que vous m'avez proposées m'ont permis de finaliser mon
| script concernant les postes XP, et je vous en remercie.

Merci pour ce retour.

[...]

| Si vous aviez la moindre idée pour contourner l'incompatibilté de
| NetConnectionID sur les postes W2000, j'en serais très heureux.

Comme vous pourrez le constater, dans le but visant à assurer la
compatibilité 2K/XP, il ne m'a pas été possible de (ou alors je n'ai pas
trouvé comment) continuer à m'appuyer sur les classes WMI pour récupérer
le nom des interfaces réseau et plus précisément le nom de l'interface
compatible avec l'outil ipconfig. La nouvelle technique utilisée
s'appuie sur la manipulation de la sortie de commande 'ipconfig /all'.
Cette sortie de commande est "localisée" et de plus dépendante de la
version du système d'exploitation. J'ai porté une attention particulière
à n'utiliser aucune référence locale Fr. Toutefois, j'attire votre
attention sur le fait que les kanji ou autres caractères cabalistiques
ne sont pas supportés :-)

Ci-dessous le script 'setClassId.vbs' testé sous W2K SP4 Fr, XP SP1/SP2
Fr

+++ Pré requis
WSH 5.6

-- Coupez ici : setClassId.vbs --

Option Explicit

' déclaration des variables
Dim oSh, oEx, oRe
Dim colNetCards
Dim strLines, strNetCard

'----------------------------------------------------------------------
' initialisation
Set oSh = CreateObject ("WScript.Shell")
set oRe = CreateObject ("VBScript.RegExp")

' préparation du pattern utilisé pour filtrer la sortie 'ipconfig'
oRe.Global = True
oRe.Pattern = "[^A-Za-z0-9 rnxFF]"

' recherche des interfaces réseau installées
' l'utilisation de l'expression régulière permet de ne pas "localiser"
' le script. Toutes les lignes correspondent à une interface réseau
Set oEx = oSh.Exec ("%comspec% /c ipconfig /all | findstr " & _
Chr (34) & "^[A-Z].*:$" & Chr (34))

' lecture du flux stdout
strLines = oEx.Stdout.ReadAll

' remplacement des caractères oem par '?'
' cela permet de s'affranchir de la conversion ansi en oem
' sachant que l'outil ipconfig supporte les caractères de remplacement
strLines = oRe.Replace (strLines, "?")

' découpage du flux stdout en lignes
' une ligne par interface
colNetCards = split (Left (strLines, Len (strLines) - 2), VBCrLf)

' énumération des interfaces réseau disponibles
For Each strNetCard In colNetCards

' lecture du nom complet de l'interface
strNetCard = Left (strNetCard, Len (strNetCard) - 2)

' le nom de l'interface se termine par le code ascii 255
' note : sous windows 2000 uniquement !
If Right (strNetCard, 1) = Chr (255) Then _
strNetCard = Left (strNetCard, Len (strNetCard) - 1)

' extraction du nom de l'interface (compatible ipconfig)
strNetCard = Mid (strNetCard, InStr ( _
InStr (strNetCard, " ") + 1, strNetCard, " ") + 1)

' début du traitement
WScript.Echo "Processing [" & strNetCard & "] ..."

' modification de la classe dhcp
oSh.Run "ipconfig /setclassid " & _
Chr (34) & strNetCard & Chr (34) & " " & "MyClassId", 0, True

' renouvellement du bail
oSh.Run "ipconfig /renew " & _
Chr (34) & strAdapterName & Chr (34), 0, True
Next

-- Coupez ici : setClassId.vbs --

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
Avatar
Vincent
Encore moi !

Finalement, je viens d'avoir une idée, toute simple :

Je vais énumérer les GUID de chaque interfaces réseaux en faisant une
requète WMI sur le registre
(HKLMsystemccsetservicestcpipparametersinterfaces) et pour chaque GUID
dont la valeur ENABLEDHCP est à 1 je vais créer une valeur DHCPCLASSID.
Ensuite je balance un Ipconfig /renew et l'affaire est dans le sac ! De plus,
pas besoin de reboot.

Bon, je testerai ça demain et vous tiens au courant.

VB




"Vincent" a écrit dans le message
de news:

[...]

| Bien joué ! -> permission denied, pourtant j'utilise un compte admin
| du domaine
|
| Et cependant, j'ai essayé cette commande qui passe correctement:
| objFSO.CopyFile "SetClassID.VBS" , "" & strComputer & "admin$"

Sous XP SP2 il est nécessaire de modifier un paramètre de stratégie sur
le poste maître (celui qui déclenche l'exécution du script
'setClassId.vbs' sur le poste distant) :
Lancez gpedit.msc sur le poste maître
Paramètres Windows
Paramètres de sécurité
Stratégies locales
Options de sécurité
DCOM: Restrictions d'accès ordinateur ...
ANONYMOUS LOGON
[x] Accès local
[x] Accès distant

>gpupdate /force

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD





Avatar
Vincent
Bonjour Gilles ,

C'est nickel çà fonctionne super bien, merci mille fois pour votre
disponibilité et efficacité !!

Cependant ... juste un petit truc à regler: je renseigne une valeur dans
l'attribut "Info" du compte ordinateur afin de savoir quelles machines ont
été modifiées. Ma requete LDAP initiale énumère objets 'computers' se
trouvant dans l'OU "Workstations" et dont l'attribut "info" a telle valeur. A
ce point, la requete s'applique automatiquement aux sous OU. Cependant, pour
modifier un attribut, il faut spécifier le DistinguishedName (ne va pas
chercher dans les sous OU). Y a t'il un moyen de spécifier 2 chemins LDAP ?
Ma requete initiale porte sur une OU "Workstations" qui contient les OU
"Desktops" et "Laptops".

J'utilise le code suivant:

Set objComputer = GetObject _
("LDAP://CN=" & strComputer & ",ou=Workstations, ...
objComputer.Put "info" , "VEOLIA-ES"
objComputer.SetInfo


"Vincent" a écrit dans le message
de news:
| Bonsoir Gilles,

Bonsoir Vincent,

| Pour faire suite à nos différents échanges, je vous confirme que les
| solutions que vous m'avez proposées m'ont permis de finaliser mon
| script concernant les postes XP, et je vous en remercie.

Merci pour ce retour.

[...]

| Si vous aviez la moindre idée pour contourner l'incompatibilté de
| NetConnectionID sur les postes W2000, j'en serais très heureux.

Comme vous pourrez le constater, dans le but visant à assurer la
compatibilité 2K/XP, il ne m'a pas été possible de (ou alors je n'ai pas
trouvé comment) continuer à m'appuyer sur les classes WMI pour récupérer
le nom des interfaces réseau et plus précisément le nom de l'interface
compatible avec l'outil ipconfig. La nouvelle technique utilisée
s'appuie sur la manipulation de la sortie de commande 'ipconfig /all'.
Cette sortie de commande est "localisée" et de plus dépendante de la
version du système d'exploitation. J'ai porté une attention particulière
à n'utiliser aucune référence locale Fr. Toutefois, j'attire votre
attention sur le fait que les kanji ou autres caractères cabalistiques
ne sont pas supportés :-)

Ci-dessous le script 'setClassId.vbs' testé sous W2K SP4 Fr, XP SP1/SP2
Fr

+++ Pré requis
WSH 5.6

-- Coupez ici : setClassId.vbs --

Option Explicit

' déclaration des variables
Dim oSh, oEx, oRe
Dim colNetCards
Dim strLines, strNetCard

'----------------------------------------------------------------------
' initialisation
Set oSh = CreateObject ("WScript.Shell")
set oRe = CreateObject ("VBScript.RegExp")

' préparation du pattern utilisé pour filtrer la sortie 'ipconfig'
oRe.Global = True
oRe.Pattern = "[^A-Za-z0-9 rnxFF]"

' recherche des interfaces réseau installées
' l'utilisation de l'expression régulière permet de ne pas "localiser"
' le script. Toutes les lignes correspondent à une interface réseau
Set oEx = oSh.Exec ("%comspec% /c ipconfig /all | findstr " & _
Chr (34) & "^[A-Z].*:$" & Chr (34))

' lecture du flux stdout
strLines = oEx.Stdout.ReadAll

' remplacement des caractères oem par '?'
' cela permet de s'affranchir de la conversion ansi en oem
' sachant que l'outil ipconfig supporte les caractères de remplacement
strLines = oRe.Replace (strLines, "?")

' découpage du flux stdout en lignes
' une ligne par interface
colNetCards = split (Left (strLines, Len (strLines) - 2), VBCrLf)

' énumération des interfaces réseau disponibles
For Each strNetCard In colNetCards

' lecture du nom complet de l'interface
strNetCard = Left (strNetCard, Len (strNetCard) - 2)

' le nom de l'interface se termine par le code ascii 255
' note : sous windows 2000 uniquement !
If Right (strNetCard, 1) = Chr (255) Then _
strNetCard = Left (strNetCard, Len (strNetCard) - 1)

' extraction du nom de l'interface (compatible ipconfig)
strNetCard = Mid (strNetCard, InStr ( _
InStr (strNetCard, " ") + 1, strNetCard, " ") + 1)

' début du traitement
WScript.Echo "Processing [" & strNetCard & "] ..."

' modification de la classe dhcp
oSh.Run "ipconfig /setclassid " & _
Chr (34) & strNetCard & Chr (34) & " " & "MyClassId", 0, True

' renouvellement du bail
oSh.Run "ipconfig /renew " & _
Chr (34) & strAdapterName & Chr (34), 0, True
Next

-- Coupez ici : setClassId.vbs --

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD





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

Bonjour Vincent,

| C'est nickel çà fonctionne super bien, merci mille fois pour votre
| disponibilité et efficacité !!

C'est super ;-)

[...]

| Cependant, pour modifier un attribut, il
| faut spécifier le DistinguishedName (ne va pas chercher dans les sous
| OU). Y a t'il un moyen de spécifier 2 chemins LDAP ? Ma requete
| initiale porte sur une OU "Workstations" qui contient les OU
| "Desktops" et "Laptops".

La solution consiste à rechercher l'objet Computer dans l'annuaire
Active Directory dans le but de récupérer le DN. Ensuite il suffira
simplement d'utiliser le DN pour mettre à jour l'attribut de l'objet. Le
script VBScript ci-dessous recherche le compte d'ordinateur strComputer
puis met à jour son attribut 'info'. L'objet Computer est recherché à
partir de la racine de l'annuaire.

-- Coupez ici : setInfo.vbs --

Option Explicit

' déclaration des variables
Dim oConn, oRS, oComputer
Dim strComputer

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

' recherche du compte d'ordinateur dans l'annuaire
WScript.Echo "Searching for " & strComputer & " ..."

' exécution de la requête ldap
' Serverless binding via rootDse
set oRS = oConn.Execute ("<LDAP://" & _
getObject("LDAP://rootDse"). _
get("defaultNamingContext") & ">;" & _
"(&(objectCategory=Computer)" & _
"(samAccountName=" & strComputer & "$" & ")" & _
");distinguishedname;subtree")

' évaluation du traitement
If Not oRS.EOF Then

' le compte d'ordinateur a été trouvé
WScript.Echo "Found DN=" & oRS.Fields("distinguishedname")

' mise à jour de l'attribut 'info'
Set oComputer = GetObject ("LDAP://" & _
oRS.Fields("distinguishedname"))
oComputer.Put "info", "VEOLIA-ES"
oComputer.SetInfo

End If

-- Coupez ici : setInfo.vbs --

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
Avatar
Vincent
Bonsoir Gilles !

DHCP suite et ... fin ! enfin !!

Mon script pour la gestion des clients est enfin bouclé et fonctionne
parfaitement. Le dossier est donc clos ! Il m'aura fallu un peu plus de temps
que prévu pour le développer, car comme vous avez du vous en apercevoir, mes
connaissances en VBS sont plutôt limitées. Alors je vous dis encore merci
pour toute l'aide que vous m'avez apporté.

A bientôt peut-être sur un autre sujet ! ;-)


"Vincent" a écrit dans le message
de news:
| Bonjour Gilles ,

Bonjour Vincent,

| C'est nickel çà fonctionne super bien, merci mille fois pour votre
| disponibilité et efficacité !!

C'est super ;-)

[...]

| Cependant, pour modifier un attribut, il
| faut spécifier le DistinguishedName (ne va pas chercher dans les sous
| OU). Y a t'il un moyen de spécifier 2 chemins LDAP ? Ma requete
| initiale porte sur une OU "Workstations" qui contient les OU
| "Desktops" et "Laptops".

La solution consiste à rechercher l'objet Computer dans l'annuaire
Active Directory dans le but de récupérer le DN. Ensuite il suffira
simplement d'utiliser le DN pour mettre à jour l'attribut de l'objet. Le
script VBScript ci-dessous recherche le compte d'ordinateur strComputer
puis met à jour son attribut 'info'. L'objet Computer est recherché à
partir de la racine de l'annuaire.

-- Coupez ici : setInfo.vbs --

Option Explicit

' déclaration des variables
Dim oConn, oRS, oComputer
Dim strComputer

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

' recherche du compte d'ordinateur dans l'annuaire
WScript.Echo "Searching for " & strComputer & " ..."

' exécution de la requête ldap
' Serverless binding via rootDse
set oRS = oConn.Execute ("<LDAP://" & _
getObject("LDAP://rootDse"). _
get("defaultNamingContext") & ">;" & _
"(&(objectCategory=Computer)" & _
"(samAccountName=" & strComputer & "$" & ")" & _
");distinguishedname;subtree")

' évaluation du traitement
If Not oRS.EOF Then

' le compte d'ordinateur a été trouvé
WScript.Echo "Found DN=" & oRS.Fields("distinguishedname")

' mise à jour de l'attribut 'info'
Set oComputer = GetObject ("LDAP://" & _
oRS.Fields("distinguishedname"))
oComputer.Put "info", "VEOLIA-ES"
oComputer.SetInfo

End If

-- Coupez ici : setInfo.vbs --

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD





Avatar
Gilles LAURENT
"Vincent" a écrit dans le message
de news:
| Bonsoir Gilles !

Bonsoir Vincent,

| DHCP suite et ... fin ! enfin !!

Bravo !

| Mon script pour la gestion des clients est enfin bouclé et fonctionne
| parfaitement. Le dossier est donc clos ! Il m'aura fallu un peu plus
| de temps que prévu pour le développer, car comme vous avez du vous en
| apercevoir, mes connaissances en VBS sont plutôt limitées. Alors je
| vous dis encore merci pour toute l'aide que vous m'avez apporté.

Merci pour ce retour

| A bientôt peut-être sur un autre sujet ! ;-)

Ce sera bien évidemment avec plaisir. N'hésitez pas à revenir vers nous
;-)
Peut-être que d'ici là ce seront des questions concernant Windows
PowerShell ? Vous savez ! Le nouveau shell Microsoft pour les
plateformes Windows. C'est ici :
http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx

Je vous invite également à consulter le blog de Jacques Barathon [MS]
sur Windows PowerShell :
http://janel.spaces.msn.com/blog

A bientôt je l'espère ;-)

--
Gilles LAURENT
Me contacter : http://cerbermail.com/?zoTY7ZkLcD
1 2