' ---------------------------------------------------------- ' Script de test d'appartenance d'un compte à un ' groupe donné ' Syntaxe: ' ismember /c [/g] [/m] ' ismember -c [-g] [-m] ' Paramètres: ' : le compte utilisateur à tester ' : le groupe éventuel ' S'il est absent, il y a affichage de ' la liste des groupes auxquels ' appartient le compte ' : le nom NetBIOS de l'ordinateur concerné ' S'il est absent, l'ordinateur local ' est retenu ' Code de retour (à tester avec ERRORLEVEL) ' 0 : le compte appartient au groupe indiqué ' 1 : le compte n'appartient pas au groupe indiqué ' 2 : le compte n'existe pas ' 3 : le groupe n'existe pas ' ' JC BELLAMY © 2002 ' ---------------------------------------------------------- Dim net, shell, computer, args, fso,TabGrp,GDict,UDict Set net = Wscript.CreateObject("WScript.Network") Set shell = WScript.CreateObject("WScript.Shell") Set fso=WScript.CreateObject("Scripting.FileSystemObject") Set args = Wscript.Arguments nbargs=args.count If testarg("?") or testarg("h") Then msg= "Script VBS de test d'appartenance d'un compte" & VBCRLF msg=msg & "à un groupe donné" & VBCRLF msg=msg & "JC BELLAMY © 2002" & VBCRLF msg=msg & "------------------------------------------" & VBCRLF msg=msg & "Syntaxe : " & VBCRLF msg=msg & " ismember /c [/g] [/m] [/s]" & VBCRLF msg=msg & " ismember -c [-g] [-m] [-s]" & VBCRLF msg=msg & "Paramètres:" & VBCRLF msg=msg & " : le compte utilisateur à tester" & VBCRLF msg=msg & " : le groupe éventuel" & VBCRLF msg=msg & " S'il est absent, il y a affichage de" & VBCRLF msg=msg & " la liste des groupes auxquels" & VBCRLF msg=msg & " appartient le compte" & VBCRLF msg=msg & " : le nom NetBIOS de l'ordinateur concerné" & VBCRLF msg=msg & " S'il est absent, l'ordinateur local est retenu" & VBCRLF msg=msg & " /s Si ce commutateur est présent, mode silencieux" & VBCRLF msg=msg & " (absence de messages)" & VBCRLF msg=msg & "Code de retour (à tester avec ERRORLEVEL)" & VBCRLF msg=msg & " 0 : le compte appartient au groupe indiqué" & VBCRLF msg=msg & " 1 : le compte n'appartient pas au groupe indiqué" & VBCRLF msg=msg & " 2 : le compte n'existe pas" & VBCRLF msg=msg & " 3 : le groupe n'existe pas" & VBCRLF & VBCRLF wscript.echo msg wscript.quit end if TestHost true Silence=testarg("s") If Testarg("c") Then Compte=getarg("c") Else Print "compte","",2,"" End If If TestArg("g") Then Groupe=getarg("g") Else Groupe="" End If If testarg("m") Then computer=Ucase(GetArg("m")) Else computer=net.ComputerName End If Set GUset = GetObject("winmgmts:{impersonationLevel=impersonate}!//" & Computer).InstancesOf _ ("Win32_GroupUser") Set GDict = WScript.CreateObject("Scripting.Dictionary") Set UDict = WScript.CreateObject("Scripting.Dictionary") GDict.CompareMode=vbTextCompare UDict.CompareMode=vbTextCompare for each GU in GUset set Grp=GetObject("winmgmts:" & GU.GroupComponent) set Usr =GetObject("winmgmts:" & GU.PartComponent) GName=Grp.Name Uname=Usr.Name If not GDict.Exists(GName) Then GDict.Add GName, Uname else OldUsr=GDict.Item(GName) GDict.Item(GName)=OldUsr & VBCRLF & UName end if If not UDict.Exists(UName) Then UDict.Add UName, """" & Gname & """" else OldGrp=UDict.Item(UName) UDict.Item(UName)=OldGrp & VBCRLF & """" & GName & """" end if next If not UDict.Exists(Compte) Then Print "compte",Compte,2,"" If Groupe="" Then Print "compte",Compte,0, ":" & VBCRLF & UDict.Item(Compte) If not GDict.Exists(Groupe) Then Print "groupe",Groupe,3,"" TabGrp=Split(UDict.Item(Compte),VBCRLF) For i = lbound(TabGrp) To Ubound(TabGrp) If lcase(TabGrp(i))=lcase("""" & Groupe & """") Then Print "compte",Compte,0,TabGrp(i) Next Print "compte",Compte,1,Groupe '-------------------------------------------------------------------- 'Sous-programme de test du moteur 'Vu les sorties générées, c'est CSCRIPT (et non pas WSCRIPT) 'qui doit être utilisé de préférence Sub TestHost(force) dim rep strappli=lcase(Wscript.ScriptFullName) strFullName =lcase(WScript.FullName) i=InStr(1,strFullName,".exe",1) j=InStrRev(strFullName,"\",i,1) strCommand=Mid(strFullName,j+1,i-j-1) if strCommand<>"cscript" then If force then Init="Ce script doit être lancé avec CSCRIPT" Else Init="Il est préférable de lancer ce script avec CSCRIPT" End If rep=MsgBox(Init & VBCRLF & _ "Cela peut être rendu permanent avec la commande" & VBCRLF & _ "cscript //H:CScript //S /Nologo" & VBCRLF & _ "Voulez-vous que ce soit fait automatiquement?", _ vbYesNo + vbQuestion,strappli) if rep=vbYes then nomcmd="setscript.bat" Set ficcmd = fso.CreateTextFile(nomcmd) ficcmd.writeline "@echo off" ficcmd.writeline "cscript //H:CScript //S /Nologo" ficcmd.writeline "pause" params="" For i = 0 To nbargs-1 params=params & " " & args(i) next ficcmd.writeline chr(34) & strappli & chr(34) & params ficcmd.writeline "pause" ficcmd.close shell.Run nomcmd, SW_SHOWNORMAL,true force=true end if If force then WScript.Quit end if end sub '-------------------------------------------------------------------- Function testarg(param) testarg=false For i = 0 To nbargs-1 curarg=lcase(args(i)) If left(curarg,1)="/" or left(curarg,1)="-" Then If mid(curarg,2,len(param))=param Then testarg=true exit function End If End If Next End Function '-------------------------------------------------------------------- Function getarg(param) getarg="" For i = 0 To nbargs-1 curarg=lcase(args(i)) If left(curarg,1)="/" or left(curarg,1)="-" Then If mid(curarg,2,len(param))=param Then getarg=mid(args(i),2+len(param)) exit function End If End If Next End Function '-------------------------------------------------------------------- Sub Print(prompt,var1,test,var2) If not silence Then Select Case test Case 0 verb=" appartient à " Case 1 verb=" n'appartient pas à " Case 2,3 verb=" n'existe pas" End Select var2=Replace(var2,VBCRLF,VBCRLF & chr(9)) wscript.echo "Le " & prompt & " """ & var1 & """ de " & Computer & verb & var2 end if wscript.quit test End Sub '--------------------------------------------------------------------