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

[VBS] Epuration du groupe admin local

20 réponses
Avatar
Eric Galais
Bonjour tout le monde,

Je reviens vers vous aujourd'hui par manque de temps perso pour mener à bien
mon script.
En général j'ai le temps mais là, le temps presse. Pourriez vous me donner
un gros coup de main svp?

Mon besoin est de faire un script qui nettoi le groupe admin local de tous
les postes de mon parc (2500 machines)
Ma démarche est la suivante:
1-En s'appuyant sur une liste globale de machines (pas direct AD car
exclusion de certaines machines)
2-Récupération des comptes/groupes dans le grp local Administrateurs(Garder
un log de trace de ces comptes/grps)
3-Filtrer les comptes/groupes légitimes (Administrateur, Admins du domaine,
Tec_admin_local)
4-Utiliser cette nouvelle liste (si non vide) pour les supprimer du groupe
5-Loger les machines touchées et non joignables.

En plus de ça j'aimerais que le lancement répété de ce script ne touche pas
les machines déjà nettoyées.
(Une nouvelle liste de machine qui s'incrémente et qui sert de test de
présence avant lancement du script sur une machine de la liste globale)

J'ai déjà commencé par la partie récup d'infos pour une seule machine (pas
de gestion de liste)
=====================================
Dim ObjWMI, colItems, Reponse_scan, nom_machine
Dim fso, oWshShell, oWMI
Dim InvInfo
Dim strValue

Const cSeparator = ";"
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Const HKEY_LOCAL_MACHINE = &H80000002

set oWshShell = WScript.CreateObject("Wscript.shell")
Set fso=WScript.CreateObject("Scripting.FileSystemObject")

Reponse_scan = MsgBox ("Machine isolée?", vbQuestion+vbyesNo, "Type de
scan")
If Reponse_scan = vbYes then
nom_machine=inputbox("Machine à modifier","Epuration des groupes admin
locaux")
Else msgbox "toto" 'Gestion liste à faire
End If

'Set objNetwork = CreateObject("WScript.Network")
'strComputer = objNetwork.ComputerName
strComputer = nom_machine
strGroup = "Administrateurs"

'Création du fichier de log machine
If not FSO.FileExists(oWshShell.CurrentDirectory & "\Machines\" &
strComputer & ".txt") Then
Set machine_log=fso.CreateTextFile(oWshShell.CurrentDirectory &
"\Machines\" & strComputer & ".txt")
else
Set machine_log=fso.OpenTextFile(oWshShell.CurrentDirectory & "\Machines\"
& strComputer & ".txt", ForWriting)
end if


Set objGroup = GetObject("WinNT://" & strComputer & "/" & strGroup &
",group")
For Each objMember In objGroup.Members
machine_log.WriteLine(objMember.Name)
Next
machine_log.close
msgbox "Fin"
============================================


Merci d'avance
Eric

10 réponses

1 2
Avatar
Eric Galais
Bien vu l'aveugle.
Mais mon problème c'est qu'on a aussi des TabletPc qui sont aussi sur
batterie.

J'ai presque sauté de joie mais merci quand même :-)

Eric

"Patrick PALAIS" a écrit dans le
message de news:
"Eric Galais" wrote:

Je viens de tester une GPO de ce type c'est nickel.
Mais le problème que j'avais oublié de mentionner, c'est que je ne veux
pas
toucher toutes les machines mais seulement les portables.


Bonjour Eric,

il est possible d'appliquer un filtre WMI pour ne toucher que les
portables.
Voici un filtre qui recherche si la machine est équipée d'un baterie ou
pas,
si oui c'est un portable :

SELECT * FROM Win32_Battery Where Availability > 0

Ce filtre fonctionne bien sur mon AD depuis 2ans.

Patrick



Avatar
Eric Galais
Hello,

Bon, j'ai un souci avec la fonction For j=0 To UBound(arrComputerOk) dans le
début de mon script.
(adaptation d'une partie de code de Gilles)
Je m'en serts pour vérifier sir la machine n'a pas déjà été faite (lecture
du fichier Machines_Ok.txt)
Mais mon test se fait en lecture ligne par ligne alors que je pensais que ca
mettait tout dans une matrice et
que ca cherchait dans l'intégralité avant de valider ou invalider le test.
(n'étant pas du tout développeur à la base
ce genre de chose m'arrive régulièrement).

vulgairement ce que j'aimerais mettre en place c'est:

Lire nom machine dans Machines.txt
charger en mémoire la liste des machines déjà modifiées
comparer les deux pour lancer ou non la modif sur la machine en cours

Loger les groupes/comptes de la machine avant et apres modif
(strComputer.txt et strComputer_del.txt)
Loger les machines gérées (Deploiement.csv)
Loger les machines terminées (Machines_Ok.txt)
Loger les machines HorsLan ou bloquées par le firewall (Hors_Lan.csv)

reste à débugger:
Test de lancement de la modif
Log de Machine_Ok qui grossi meme si la machine est déjà modifiée.(il ne
devrait apparaitre que 1 nom de la meme machine)
Vérifier la fonctionnalité si aucun groupe/compte n'est trouvé après
filtrage.

J'esprère avoir été claire. Pour le reste tout marche.

Petit coup de pouce souhaité svp.


pré requis:
Répertoire .Machines (héberge les logs des machines modifiées)
Computers.txt (Liste des machines à scan/modifier)
AdminMembres.txt (comptes/groupes de filtrage)

ci-joint mon code actuel. (bardé de msgbox)

=========================== Const cSeparator = ";"
Const ForReading = 1, ForWriting = 2, ForAppending = 8

set oWshShell = WScript.CreateObject("Wscript.shell")
Set oFs=CreateObject("Scripting.FileSystemObject")
Set oFile=oFs.OpenTextFile("AdminMembers.txt")
Set ts1=oFs.OpenTextFile(oWshShell.CurrentDirectory & "Computers.txt")
arrMembers=Split(oFile.ReadAll,VBCrLf)

'Ouverture/création du fichier: Machines modifiées
If not oFs.FileExists(oWshShell.CurrentDirectory & "Machines_Ok.txt") Then
Set CptOk=oFs.CreateTextFile(oWshShell.CurrentDirectory &
"Machines_Ok.txt")
CptOk.Close
end if
Set CptOk=oFs.OpenTextFile(oWshShell.CurrentDirectory & "Machines_Ok.txt")
arrComputerOk=Split(CptOk.ReadAll,VBCrLf)
CptOk.Close

Set CptOk=oFs.OpenTextFile(oWshShell.CurrentDirectory & "Machines_Ok.txt",
ForAppending)

'Ouverture/création du fichier: Machines Hors Lan
If not oFs.FileExists(oWshShell.CurrentDirectory & "Hors_Lan.csv") Then
Set HorsLan=oFs.CreateTextFile(oWshShell.CurrentDirectory &
"Hors_Lan.csv")
HorsLan.WriteLine("Date" & cSeparator & "Time" & cSeparator & "Machine")
else
Set HorsLan=oFs.OpenTextFile(oWshShell.CurrentDirectory & "Hors_Lan.csv",
ForAppending)
end if

'Ouverture/création du fichier: Suivi du déploiement
If not oFs.FileExists(oWshShell.CurrentDirectory & "Deploiement.csv") Then
Set Logfinal=oFs.CreateTextFile(oWshShell.CurrentDirectory &
"Deploiement.csv")
Logfinal.WriteLine("Date" & cSeparator & "Time" & cSeparator & "Machine")
else
Set Logfinal=oFs.OpenTextFile(oWshShell.CurrentDirectory &
"Deploiement.csv", ForAppending)
end if


strGroup = "Administrateurs"

'Corps du script

MsgBox "CleanLocalGroup", vbInformation,"Lancement du Scan"
while not ts1.AtEndOfStream
strComputer=ts1.ReadLine
msgbox strComputer,, "Ligne lue dans le fichier des machines a faire"
For j=0 To UBound(arrComputerOk)
Msgbox arrComputerOk(j),,"machine de comparaison dans l'array"
If strComputer=arrComputerOk(j) Then
msgbox "Bloqué",, "Sub blocage"
Exit For
Else
msgbox arrComputerOk(j),,"sub si computer different de array"
End If
LogFinal.WriteLine(date & cSeparator & Time & cSeparator &
strComputer)
If strComputer <> "" Then
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._
ExecQuery("select * from Win32_PingStatus where address = '"_
& strComputer & "'")
For Each objStatus in objPing
If objStatus.StatusCode=0 Then
'cré/ouvre le fichier de suivi des groupes avant modif
If not oFs.FileExists(oWshShell.CurrentDirectory & "Machines" &
strComputer & ".txt") Then
Set machine_log=oFs.CreateTextFile(oWshShell.CurrentDirectory &
"Machines" & strComputer & ".txt")
else
Set machine_log=oFs.OpenTextFile(oWshShell.CurrentDirectory &
"Machines" & strComputer & ".txt", ForAppending)
end if
'cré/ouvre le fichier de suivi des Comptes supprimés
If not oFs.FileExists(oWshShell.CurrentDirectory & "Machines" &
strComputer & "_del.txt") Then
Set del_log=oFs.CreateTextFile(oWshShell.CurrentDirectory &
"Machines" & strComputer & "_del.txt")
else
Set del_log=oFs.OpenTextFile(oWshShell.CurrentDirectory &
"Machines" & strComputer & "_del.txt", ForAppending)
end if

'Alimente le fichier de suivi des groupes avant modif
Set objGroup = GetObject("WinNT://" & strComputer & "/" & strGroup &
",group")
'vérifie si l'élément trouvé est dans AdminMembers.txt
For Each objMember In objGroup.Members
bFoundúlse
machine_log.WriteLine(objMember.Name)
For i=0 To UBound(arrMembers)
If objMember.Name=arrMembers(i) Then
bFound=True
Exit For
End If
Next
'Supprime l'élément si non présent dans AdminMembers.txt
If Not bFound Then
del_log.WriteLine(objMember.Name)
WScript.Echo "Removing " & strComputer & "" & objMember.Name & "
..."
objGroup.Remove(objMember.AdsPath)
End If
Next
CptOk.WriteLine(StrComputer)
Else
HorsLan.WriteLine(date & cSeparator & Time & cSeparator & strComputer)
End If

Next
End If
'Ferme les fichiers liés aux machines si elles ont été touchée
If oFs.FileExists(oWshShell.CurrentDirectory & "Machines" &
strComputer & ".txt") Then
machine_log.WriteBlankLines(1)
machine_log.close
End If
If oFs.FileExists(oWshShell.CurrentDirectory & "Machines" &
strComputer & "_del.txt") Then
del_log.WriteBlankLines(1)
del_log.close
End If
Next

strcomputer = ""
Wend

LogFinal.WriteBlankLines(1)
HorsLan.WriteBlankLines(1)
LogFinal.Close
HorsLan.Close
CptOk.close
msgbox "Fin"

===========================================
"Eric Galais" a écrit dans le message de news:

Héhé, c'est comme ça que je l'avais vu aussi.
Mais J'ai préférer l'intégrer dans le code, je vous proposerais ce que
j'en ai fais une fois mon dernier souci réglé.

En tous cas ça marche au poil, merci Gilles.

Eric




Avatar
Patrick PALAIS
"Eric Galais" wrote:

Bien vu l'aveugle.
Mais mon problème c'est qu'on a aussi des TabletPc qui sont aussi sur
batterie.



Sinon, tu peux essayer de passer par la propriété ChassisTypes de
Win32_SystemEnclosures avec les valeurs suivantes :

1 Other
2 Unknown
3 Desktop
4 Low Profile Desktop
5 Pizza Box
6 Mini Tower
7 Tower
8 Portable
9 Laptop
10 Notebook
11 Hand Held
12 Docking Station
13 All in One
14 Sub Notebook
15 Space-Saving
16 Lunch Box
17 Main System Chassis
18 Expansion Chassis
19 SubChassis
20 Bus Expansion Chassis
21 Peripheral Chassis
22 Storage Chassis
23 Rack Mount Chassis
24 Sealed-Case PC


Donc si, tu ne veux que les laptop et Portables, tu fais ton extraction
comme ceci :

SELECT * FROM Win32_SystemEnclosure Where ChassisTypes = 8 or ChassisTypes = 9

Le problème c'est que suivant les constructeurs de PC ces infos ne sont pas
toujours renseignées...
Rien à voir mais, tu connais Frédéric Pierre ?

Patrick

Avatar
Eric Galais
Je vais voir ce que retournent mes 3 tabletPC différentes.
Merci pour le tuyeau.

Concernant Fred, oui j'ai très bien connu un Frédéric Pierre; on bossait
dans une SSII concurente pour le siège social d'un labo pharma sur paris.
Si te le vois passe lui le bonjour :-)
"Patrick PALAIS" a écrit dans le
message de news:


"Eric Galais" wrote:

Bien vu l'aveugle.
Mais mon problème c'est qu'on a aussi des TabletPc qui sont aussi sur
batterie.



Sinon, tu peux essayer de passer par la propriété ChassisTypes de
Win32_SystemEnclosures avec les valeurs suivantes :

1 Other
2 Unknown
3 Desktop
4 Low Profile Desktop
5 Pizza Box
6 Mini Tower
7 Tower
8 Portable
9 Laptop
10 Notebook
11 Hand Held
12 Docking Station
13 All in One
14 Sub Notebook
15 Space-Saving
16 Lunch Box
17 Main System Chassis
18 Expansion Chassis
19 SubChassis
20 Bus Expansion Chassis
21 Peripheral Chassis
22 Storage Chassis
23 Rack Mount Chassis
24 Sealed-Case PC


Donc si, tu ne veux que les laptop et Portables, tu fais ton extraction
comme ceci :

SELECT * FROM Win32_SystemEnclosure Where ChassisTypes = 8 or ChassisTypes
= 9

Le problème c'est que suivant les constructeurs de PC ces infos ne sont
pas
toujours renseignées...
Rien à voir mais, tu connais Frédéric Pierre ?

Patrick





Avatar
F. Dunoyer [MVP]
Patrick PALAIS a exposé le 28/03/2008 :
"Eric Galais" wrote:

Je viens de tester une GPO de ce type c'est nickel.
Mais le problème que j'avais oublié de mentionner, c'est que je ne veux pas
toucher toutes les machines mais seulement les portables.


Bonjour Eric,

il est possible d'appliquer un filtre WMI pour ne toucher que les portables.
Voici un filtre qui recherche si la machine est équipée d'un baterie ou pas,
si oui c'est un portable :

SELECT * FROM Win32_Battery Where Availability > 0

Ce filtre fonctionne bien sur mon AD depuis 2ans.

Patrick


Intéresssant !
Mais attention si vous avez des serveurs sur Onduleur :)
S'ils sont connectés via RS323 ou USB sur l'Onduleur le système les
considère sur Battery

--
François Dunoyer [MVP Windows Server / Security]
Jours après jours avec Longhorn Server
http://fds.mvps.org/LH/index.htm


Avatar
Patrick PALAIS
Patrick


Intéresssant !
Mais attention si vous avez des serveurs sur Onduleur :)
S'ils sont connectés via RS323 ou USB sur l'Onduleur le système les
considère sur Battery

Francois, merci pour cette info.

Heureusement, nos serveurs et nos PC clients se trouvent dans des OU
distinctes, et la GPO en question ne s'applique que sur les clients.

Patrick


Avatar
Eric Galais
Petit Up:

Je cherche un moyen de mettre en mémoire un fichier texte (machines déjà
faites) afin de m'en servir de test avant de lancer le scan etc...
Histoire de ne pas refaire les machines déjà modifiées.
L'utilisation de la boucle For j=0 To UBound(arrComputerOk) est séquentielle
et lance mon script dans tous les cas sauf s'il tombe pile poil sur la même
machine dans la liste globale et les machines terminées.
Ce qui m'interesse c'est que ca vérifie toutes les machines terminées avant
de lancer pour la machine de la liste globale.
(pas envie de supprimer les machines dans la liste totale des machines à
modifier)
Puis je passer par une array? j'y connais pas grand chose de ce coté.

Ps: Pour la GPO je ne peux pas utiliser ce filon bien interessant tout de
même pour des futurs mises à jours de masse.

Merci d'avance.

Eric


"Eric Galais" a écrit dans le message de news:

Hello,

Bon, j'ai un souci avec la fonction For j=0 To UBound(arrComputerOk) dans
le début de mon script.
(adaptation d'une partie de code de Gilles)
Je m'en serts pour vérifier sir la machine n'a pas déjà été faite (lecture
du fichier Machines_Ok.txt)
Mais mon test se fait en lecture ligne par ligne alors que je pensais que
ca mettait tout dans une matrice et
que ca cherchait dans l'intégralité avant de valider ou invalider le test.
(n'étant pas du tout développeur à la base
ce genre de chose m'arrive régulièrement).

vulgairement ce que j'aimerais mettre en place c'est:

Lire nom machine dans Machines.txt
charger en mémoire la liste des machines déjà modifiées
comparer les deux pour lancer ou non la modif sur la machine en cours

Loger les groupes/comptes de la machine avant et apres modif
(strComputer.txt et strComputer_del.txt)
Loger les machines gérées (Deploiement.csv)
Loger les machines terminées (Machines_Ok.txt)
Loger les machines HorsLan ou bloquées par le firewall (Hors_Lan.csv)

reste à débugger:
Test de lancement de la modif
Log de Machine_Ok qui grossi meme si la machine est déjà modifiée.(il ne
devrait apparaitre que 1 nom de la meme machine)
Vérifier la fonctionnalité si aucun groupe/compte n'est trouvé après
filtrage.

J'esprère avoir été claire. Pour le reste tout marche.

Petit coup de pouce souhaité svp.




Avatar
Jean
Le problème c'est que suivant les constructeurs de PC ces infos ne sont pas
toujours renseignées...


Absolument et c'est trop peu dit lors de la transmission de codes wmi
concernant le matériel (même si un matériel assez récent ne devrait pas
en souffrir).
A ce niveau il manque amha une sorte de label wbem sur les boîtes de
produits hardware.
Pour le reste (l'os, la gestion des fichiers, le registre, ...) wmi est
fiable.

Amicalement,

--
Jean - JMST
Belgium

Avatar
Méta-MCI \(MVP\)
Salut, Jean !

il manque amha une sorte de label wbem


Pourtant, WMI est la version Windows du standard WBEM.
Voir : http://www.dmtf.org/standards/wbem/

Ceci dit, c'est quand même Windows qui est le plus avancé dans ce
domaine (relativement aux autres OS).

@+

Michel Claveau

Avatar
Jean
Salut, Jean !

il manque amha une sorte de label wbem


Pourtant, WMI est la version Windows du standard WBEM.
Voir : http://www.dmtf.org/standards/wbem/



Je ne dis pas le contraire, c'est la définition même de wmi.
Losrque je parlais de "label *wbem*" c'était justement pour élargir le
champ et ne pas se limiter à wmi.
"Label" c'était pour donner l'image d'un autocollant sur la boîte :
"wmi compliant" ... mais ça ne suffirait pas, il faudrait plutôt que
les fabricants de hardware indiquent sur leur site les propriétés qui
sont ou ne sont pas reconnue(s) dans la (les) classe(s) wbem/wmi
dédiée(s) au hardware précité, que ce soit une carte mère, un modem, un
percolateur, ... ou que le site wbem centralise ces infos (ça existe
peut être maintenant, pas vérifé ... mais ça m'étonnerait).
Au final ça veut dire que lancer un super script wbem/wmi ciblant du
hardware sur un parc il n'est pas garanti du tout que tout fonctionnera
à 100%.

Ceci dit, c'est quand même Windows qui est le plus avancé dans ce domaine
(relativement aux autres OS).



On serait peut être surpris ... mais je ne m'attends pas vraiment à
entendre autre chose sur le serveur MS :-)

@+

Michel Claveau


Amicalement,

--
Jean - JMST
Belgium


1 2