' -------------------------------------------------------------------- ' Script de sélection des comptes utilisateurs à afficher ou non ' dans l'écran de login de Windows XP ' ' Jean-Claude BELLAMY © 2001 ' -------------------------------------------------------------------- Dim network, computer, fso, ts, SAM, Item, member, oIE Set network = Wscript.CreateObject("WScript.Network") Set Shell = WScript.CreateObject("WScript.Shell") ' Création du fichier HTML qui va servir de formulaire fichtml=GetPath() & "logusers.html" computer=network.ComputerName ' nom de la machine locale Titre="Liste des comptes sur " & computer Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set ts = fso.CreateTextFile(fichtml, True) ts.writeline "" ts.writeline "" ts.writeline "" & Titre & "" ts.writeline "" ts.writeline "" ts.writeline "" ts.writeline "" ts.writeline "
" ts.writeline "

Ordinateur " & computer & "


" ts.writeline "Etat d'affichage des comptes au démarrage :

" set SAM=GetObject("WinNT://" & computer & ",computer") nbusers=0 dim username(), fullname(), state() key="HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList\" for each Item in SAM Classe=Item.Class If (Classe = "User") then ' Vérification si le compte est activé ou non ' On teste pour cela le bit 1 de la propriété "UserFlags" flags=Item.UserFlags if ((flags and 2)<>2) then nbusers=nbusers+1 redim preserve username(nbusers+1), fullname(nbusers+1), state(nbusers+1) username(nbusers)= Item.name p=instrRev(username(nbusers),computer) If p>0 Then d=len(username(nbusers))-len(computer) if p=d+1 then username(nbusers)=left(username(nbusers),d) End If fullname(nbusers)=Item.FullName if len(fullname(nbusers))=0 then fullname(nbusers)=username(nbusers) state(nbusers)="checked" ' Interception d'erreur (générée en cas de non-existence de clef) on error resume next stuser=shell.RegRead(key & Username(nbusers)) ' Par défaut, si le compte administrateur n'est pas dans la BDR, ' il n'est pas affiché au login if err.number <>0 then if (lcase(username(nbusers))="administrateur") or (lcase(username(nbusers))="administrator") then state(nbusers)="" else if ((stuser=0) or (stuser=65536)) then state(nbusers)="" end if on error goto 0 ts.writeline "" & fullname(nbusers) & "
" end if end if next ts.writeline "" ts.writeline "" ts.writeline "

" ts.writeline "" ts.writeline "" ts.Close ' Ouverture d'Internet Explorer Set oIE = WScript.CreateObject("InternetExplorer.Application", "IE_") oIE.Left = 50 oIE.Top = 100 oIE.Height = 400 oIE.Width = 400 oIE.MenuBar = 0 oIE.ToolBar = 0 oIE.StatusBar = 0 oIE.navigate fichtml oIE.Visible = 2 Do While (oIE.Busy) WScript.Sleep 200 Loop shell.AppActivate Titre ' Attente d'action sur le bouton ou fermeture de la fenêtre On Error Resume Next Do WScript.Sleep 100 Loop While (oIE.Document.Script.CheckVal() = 0) ' Si on ferme directement IE sans passer par un bouton, ' cela provoque une erreur qui est détectée et alors ' on quitte le script If Err <> 0 Then fso.DeleteFile fichtml,true Wscript.quit end if test=oIE.Document.Script.CheckVal() If test=-1 Then CloseIE Wscript.quit end if str="Etat des comptes au démarrage :" & vbcrlf ' Utilisation de la fonction execute afin de créer dynamiquement ' des commandes faisant intervenir des noms de champs variables dim f(), res() redim f(nbusers+1), res(nbusers+1) for i = 1 to nbusers f(i) = "function testusr() " & vbcrlf f(i) = f(i) & "testusr=65536" & vbcrlf f(i) = f(i) & "if oIE.Document.logusersForm.usr" & i &".Checked then testusr=1" & vbcrlf f(i) = f(i) & "end function" & vbcrlf execute f(i) res(i)=testusr() if res(i)=1 then etat="affiché" else etat="caché" str= str & vbcrlf & fullname(i) & " (" & username(i) & ") : " & etat next str=str & vbcrlf & vbcrlf & "Confirmation des modifications ?" rep=MsgBox(str , vbYesNo + vbQuestion, titre) if rep=vbYes then for i = 1 to nbusers shell.RegWrite key & Username(i), res(i), "REG_DWORD" next end if CloseIE Wscript.quit '------------------------------------------------------------ ' Fonction de récupération du répertoire courant Function GetPath() Dim path path = WScript.ScriptFullName GetPath = Left(path, InStrRev(path, "\")) End Function '------------------------------------------------------------ ' Fermeture d'Internet Explorer et suppression du fichier HTML Sub CloseIE oIE.Quit Set oIE = Nothing fso.DeleteFile fichtml,true End Sub '------------------------------------------------------------