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
Gilles LAURENT [MVP]
"Eric Galais" wrote:

Bonjour tout le monde,


Bonjour Eric,

Mon besoin est de faire un script qui nettoi le groupe admin local de tous
les postes de mon parc (2500 machines)


Avez-vous songé à la mise en oeuvre d'une stratégie de groupes restreints ?
<http://support.microsoft.com/kb/279301/en-us&gt;

Peut-être qu'avec une petite réorganisation des unités organisationnelles
vous serez en mesure d'exclure facilement de cette stratégie certaines
machines identifiées.

Tenez-nous au courant !

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr

Avatar
Eric Galais
Merci Gilles,
J'y avais pensé mais je n'avais pas creusé plus la question.
Je vais voir si c'est applicable chez nous.

Eric

"Gilles LAURENT [MVP]" a écrit dans le message de news:

"Eric Galais" wrote:

Bonjour tout le monde,


Bonjour Eric,

Mon besoin est de faire un script qui nettoi le groupe admin local de
tous
les postes de mon parc (2500 machines)


Avez-vous songé à la mise en oeuvre d'une stratégie de groupes restreints
?
<http://support.microsoft.com/kb/279301/en-us&gt;

Peut-être qu'avec une petite réorganisation des unités organisationnelles
vous serez en mesure d'exclure facilement de cette stratégie certaines
machines identifiées.

Tenez-nous au courant !

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr







Avatar
Eric Galais
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.
Avec une dénomination spéciale XAP012345, XRP012345, XLP012345, XNP012345
Notre AD étant composée d'au moins 200uo c'est pas gérable malheureusement.

Je ne peux que me replier sur un déploiement manuel.



"Gilles LAURENT [MVP]" a écrit dans le message de news:

"Eric Galais" wrote:

Bonjour tout le monde,


Bonjour Eric,

Mon besoin est de faire un script qui nettoi le groupe admin local de
tous
les postes de mon parc (2500 machines)


Avez-vous songé à la mise en oeuvre d'une stratégie de groupes restreints
?
<http://support.microsoft.com/kb/279301/en-us&gt;

Peut-être qu'avec une petite réorganisation des unités organisationnelles
vous serez en mesure d'exclure facilement de cette stratégie certaines
machines identifiées.

Tenez-nous au courant !

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr







Avatar
Eric Galais
Je me permets de faire un petit Up de ma demande.
Dans l'état actuel de mon script, je ne récupère que les comptes/groupes
locaux d'une machine dans un fichier texte.

Je pensais m'appuyer sur ce fichier en filtrant les compte/groupes sités en
3) pour effectuer une suppression des éléments trouvés dans le groupe admin
local.
Mais c'est la méthode qui me manque.
Petit coup de pouce possible s'il vous plais?


Merci d'avance.

Eric



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

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



Avatar
Gilles LAURENT [MVP]
"Eric Galais" wrote:

Je me permets de faire un petit Up de ma demande.


Permettez-vous :-)

Dans l'état actuel de mon script, je ne récupère que les comptes/groupes
locaux d'une machine dans un fichier texte.

Je pensais m'appuyer sur ce fichier en filtrant les compte/groupes sités en
3) pour effectuer une suppression des éléments trouvés dans le groupe admin
local.


Le script VBScript ci-dessous permet de supprimer les membres du groupes
Administrateurs de la machine local qui ne sont PAS présents dans le fichier
texte AdminMembers.txt. Le fichier AdminMembers.txt contient un compte
utilisateur ou groupe par ligne :

--- Coupez ici : CleanAdminLocalGroup.vbs ---
Set oFs=CreateObject("Scripting.FileSystemObject")
Set oFile=oFs.OpenTextFile("AdminMembers.txt")
arrMembers=Split(oFile.ReadAll,VBCrLf)

Set oGroup=GetObject("WinNT://./Administrateurs,group")
For Each oMember In oGroup.Members
bFoundúlse
For i=0 To UBound(arrMembers)
If oMember.Name=arrMembers(i) Then
bFound=True
Exit For
End If
Next

If Not bFound Then
WScript.Echo "Removing " & oMember.Name & " ..."
oGroup.Remove(oMember.AdsPath)
End If
Next
--- Coupez ici : CleanAdminLocalGroup.vbs ---

Cela devrait vous dépanner. Vous pouvez ensuite ajouter une boucle
permettant de réaliser ce traitement sur un ensemble de machine ou alors en
ligne de commande avec la commande suivante :

> for /f %i in (AdminMembers.txt) do @cscript CleanAdminLocalGroup.vbs %i

Pour cette solution, vous remplacerez le bind local (//./) par :
"//" & WScript.Arguments(0) & "/Administrateurs,group"

Tenez-nous au courant !

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr



Mais c'est la méthode qui me manque.
Petit coup de pouce possible s'il vous plais?


Merci d'avance.

Eric



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

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








Avatar
Stephane (85)
Cela devrait vous dépanner. Vous pouvez ensuite ajouter une boucle
permettant de réaliser ce traitement sur un ensemble de machine ou alors en
ligne de commande avec la commande suivante :

> for /f %i in (AdminMembers.txt) do @cscript CleanAdminLocalGroup.vbs %i


Vu que ce script m'intéresse au plus haut point aussi, je le regarde et
y'a un truc que je piqe pas. Qu'est-ce que vient faire le fichier
adminMembers.txt ici. Ce serait pas plutôt un fichier texte avec le nom
de tous les PC à faire ?

Merci

Stephane

Avatar
Gilles LAURENT [MVP]
"Stephane (85)" wrote:

Cela devrait vous dépanner. Vous pouvez ensuite ajouter une boucle
permettant de réaliser ce traitement sur un ensemble de machine ou alors en
ligne de commande avec la commande suivante :

> for /f %i in (AdminMembers.txt) do @cscript CleanAdminLocalGroup.vbs %i


Vu que ce script m'intéresse au plus haut point aussi, je le regarde et
y'a un truc que je piqe pas. Qu'est-ce que vient faire le fichier
adminMembers.txt ici. Ce serait pas plutôt un fichier texte avec le nom
de tous les PC à faire ?


hé hé :-)
Bien évidemment !

> for /f %i in (computers.txt) do ...

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr


Avatar
Eric Galais
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


"Gilles LAURENT [MVP]" a écrit dans le message de news:

"Stephane (85)" wrote:

Cela devrait vous dépanner. Vous pouvez ensuite ajouter une boucle
permettant de réaliser ce traitement sur un ensemble de machine ou
alors en
ligne de commande avec la commande suivante :

> for /f %i in (AdminMembers.txt) do @cscript CleanAdminLocalGroup.vbs
%i


Vu que ce script m'intéresse au plus haut point aussi, je le regarde et
y'a un truc que je piqe pas. Qu'est-ce que vient faire le fichier
adminMembers.txt ici. Ce serait pas plutôt un fichier texte avec le nom
de tous les PC à faire ?


hé hé :-)
Bien évidemment !

> for /f %i in (computers.txt) do ...

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr





Avatar
Patrick PALAIS
"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
moi
Patrick PALAIS wrote:
"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.

salut,


jolie ruse !!!!

HB


1 2