' ---------------------------------------------------------- ' Script de modification du mot de passe d'un compte donné ' sur toutes les machines d'un domaine ou workgroup ' Syntaxe: ' chgallpwd [/d] /u /a /n ' : nom du domaine ou workgroup concerné ' si ce nom est omis, on prend le domaine ' de la machine locale ' : nom du compte utilisateur ' si absent => utilisateur courant ' : ancien mot de passe ' : nouveau mot de passe ' ' JC BELLAMY © 2002 ' ---------------------------------------------------------- Const SW_HIDE=0 Const SW_SHOWNORMAL=1 Dim net,shell,computer, args, fso,oWinnt, oDomain, oDomainItem, SAM Set net = Wscript.CreateObject("WScript.Network") Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set Shell= Wscript.CreateObject("WScript.Shell") Set args = Wscript.Arguments nbargs=args.count defmoteur="cscript" If nbargs=0 or testarg("?") or testarg("h") Then Syntaxe "" ' Test du moteur utilisé Call TestHost(true) If testarg("u") Then user=getarg("u") Else user=net.UserName End If user=lcase(user) If not testarg("a") then Syntaxe "Ancien mot de passe absent" If not testarg("n") then Syntaxe "Nouveau mot de passe absent" OldPassword=getarg("a") NewPassword=getarg("n") If OldPassword=NewPassword Then Syntaxe "Le nouveau mot de passe est égal à l'ancien" domain="" If testarg("d") Then domain=getarg("d") If domain="" Then Set ComputerSystem = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf ("Win32_ComputerSystem") for each ComputerItem in ComputerSystem domain=ComputerItem.Domain next End If Wscript.echo "Modification de mot de passe sur les ordinateurs du domaine " & domain set oWinnt=GetObject("WinNT://" & domain) For each oDomainItem in oWinnt classe=oDomainItem.Class Computer=oDomainItem.Name If classe="Computer" Then chgpwd(Computer) Next ' Wscript.quit '-------------------------------------------------------------------- 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 '-------------------------------------------------------------------- ' Sous programme de test du moteur 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 ' ------------------------------------- Sub Syntaxe(info) If info="" Then msg= "Script VBS de modification de mot de passe d'un compte donné" & VBCRLF msg=msg & "sur toutes les machines d'un domaine ou workgroup" & VBCRLF & VBCRLF msg=msg & "JC BELLAMY © 2002" & VBCRLF Else msg="*** " & info & " ***" & VBCRLF End If msg=msg & "------------------------------------------" & VBCRLF msg=msg & "Syntaxe : " & VBCRLF msg=msg & " chgallpwd [/d] /u /a /n" & VBCRLF msg=msg & " chgallpwd [-d] -u -a -n" & VBCRLF msg=msg & " : nom du domaine ou workgroup concerné" & VBCRLF msg=msg & " si ce nom est omis, on prend le domaine" & VBCRLF msg=msg & " de la machine locale" & VBCRLF msg=msg & " : nom du compte utilisateur" & VBCRLF msg=msg & " si absent => utilisateur courant" & VBCRLF msg=msg & " : ancien mot de passe" & VBCRLF msg=msg & " : nouveau mot de passe" & VBCRLF & VBCRLF msg=msg & "NB : les mots de passe sont sensibles à la casse (minuscules/majuscules)" & VBCRLF & VBCRLF wscript.echo msg wscript.quit End Sub ' ------------------------------------- Sub chgpwd(computer) root="\\" & computer & "\c$" If not fso.FolderExists(root) Then wscript.echo "*** L'ordinateur """ & computer & """ n'a pas été trouvé sur le réseau" exit sub End If OKuser=false set SAM=GetObject("WinNT://" & computer & ",computer") for each Item in SAM Classe=Item.Class If Classe = "User" and lcase(Item.name)=user Then OKuser=true exit for end if next If not OKuser Then wscript.echo "*** """ & user & """ n'est pas un utilisateur de " & computer exit sub End If Set ObjNT = GetObject("WinNT:") on error resume next Set ObjUser = ObjNT.OpenDSObject("WinNT://" & computer & "/" & User, User, OldPassword, 1) If Err.Number<>0 Then Erreur "OpenDSObject" ObjUser.ChangePassword OldPassword, NewPassword If Err.Number<>0 Then Erreur "ChangePassword" else wscript.echo "Mot de passe de """ & user & """ sur """ & computer & """ correctement modifié!" end if End Sub '-------------------------------------------------------------------- Sub erreur(module) hexerr=Hex(Err.Number) desc=Err.Description If InStr(hexerr,"8007")>0 Then hexerr=eval("&H"& Right(hexerr,4)) If hexerr=1376 Then desc="Mot de passe initial incorrect" End If msg="*** Modification du mot de passe de """ & user & """ sur " & Computer & " non effectuée" & VBCRLF msg=msg & "Fonction " & module & " - code " & hexerr & " : " & VBCRLF msg=msg & desc wscript.echo msg End Sub ' -------------------------------------