Aide et conseils concernant AutoIt et ses outils.
alex23
Niveau 1
Messages : 2 Enregistré le : mar. 28 mai 2013 14:51
Status :
Hors ligne
#1
Message
par alex23 » mar. 28 mai 2013 15:18
Bonjour
je souhaite changer le mot de passe de PC qui sont dans un domaine.
J'ai un script
.vbs qui le fait bien mais qui oblige à le faire manuellement sur tous les postes (~2000).
Est-il possible d'automatiser l’exécution ce
.vbs 'en tant qu'admin' ?
Je pensais ouvrir un CMD avec les droits d'admin, écrire le chemin du fichier .vbs (hébergé sur le contrôleur de domaine) et le lancer.
Peut-être existe-t-il un moyen plus simple en n'utilisant que AutoIt ?
Merci de votre attention.
Bien cordialement.
jguinch
Modérateur
Messages : 2515 Enregistré le : lun. 14 févr. 2011 22:12
Status :
Hors ligne
#2
Message
par jguinch » mar. 28 mai 2013 16:28
Salut.
Oui, ce serait plus simple en n'utilisant que AutoIt.
Par contre, question sécurité c'est pas top...
Perso, j'utilise une GPO (GPP) pour faire ça (mais il faut du Windows 2008R2 comme contrôleur).
Il faut bien se dire que quel que soit le script utilisé, le mot de passe sera accessible d'une façon ou d'une autre...
Sinon ça peut donner ça :
► Afficher le texte
Code : Tout sélectionner
Global $currentPassword = "oldPassword"
Global $newPassword = "newPassword"
Global $adminLocal = _GetAdministratorName()
$oErrorHandler = ObjEvent("AutoIt.Error", "_Exit")
_RunAsAdmin($currentPassword)
_ChangeAdminPassword($newPassword)
Func _ChangeAdminPassword($strPassword)
$CPU = ObjGet("WinNT://" & @ComputerName & ",Computer")
$objUser = $CPU.GetObject("User", $adminLocal)
$objUser.SetPassword ($strPassword)
$objUser.SetInfo
EndFunc
Func _RunAsAdmin($strPassword)
If IsAdmin() Then Return 1
Local $args = ""
For $i = 1 To $CmdLine[0]
If StringInStr($CmdLine[$i], " ") Then
$args &= ' "' & $CmdLine[$i] & '"'
Else
$args &= " " & $CmdLine[$i]
EndIf
Next
RunAsWait($adminLocal, @ComputerName, $strPassword, 0, @ScriptFullPath & $args, @ScriptDir)
Exit
EndFunc
Func _GetAdministratorName()
Local Const $wbemFlagReturnImmediately = 0x10
Local Const $wbemFlagForwardOnly = 0x20
Local $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
Local $sQuery = "Select Name, SID from Win32_UserAccount WHERE Domain = '" & @ComputerName & "'"
Local $oUserAccounts = $objWMIService.ExecQuery($sQuery, "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
For $oUserAccount In $oUserAccounts
If StringRegExp($oUserAccount.SID, "\AS-1-5-21-.*-500\Z") Then Return $oUserAccount.Name
Next
Return -1
EndFunc
Func _Exit($oError)
Exit
EndFunc
Global $currentPassword = "oldPassword"
Global $newPassword = "newPassword"
Global $adminLocal = _GetAdministratorName()
$oErrorHandler = ObjEvent("AutoIt.Error", "_Exit")
_RunAsAdmin($currentPassword)
_ChangeAdminPassword($newPassword)
Func _ChangeAdminPassword($strPassword)
$CPU = ObjGet("WinNT://" & @ComputerName & ",Computer")
$objUser = $CPU.GetObject("User", $adminLocal)
$objUser.SetPassword ($strPassword)
$objUser.SetInfo
EndFunc
Func _RunAsAdmin($strPassword)
If IsAdmin() Then Return 1
Local $args = ""
For $i = 1 To $CmdLine[0]
If StringInStr($CmdLine[$i], " ") Then
$args &= ' "' & $CmdLine[$i] & '"'
Else
$args &= " " & $CmdLine[$i]
EndIf
Next
RunAsWait($adminLocal, @ComputerName, $strPassword, 0, @ScriptFullPath & $args, @ScriptDir)
Exit
EndFunc
Func _GetAdministratorName()
Local Const $wbemFlagReturnImmediately = 0x10
Local Const $wbemFlagForwardOnly = 0x20
Local $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
Local $sQuery = "Select Name, SID from Win32_UserAccount WHERE Domain = '" & @ComputerName & "'"
Local $oUserAccounts = $objWMIService.ExecQuery($sQuery, "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
For $oUserAccount In $oUserAccounts
If StringRegExp($oUserAccount.SID, "\AS-1-5-21-.*-500\Z") Then Return $oUserAccount.Name
Next
Return -1
EndFunc
Func _Exit($oError)
Exit
EndFunc
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
alex23
Niveau 1
Messages : 2 Enregistré le : mar. 28 mai 2013 14:51
Status :
Hors ligne
#3
Message
par alex23 » mer. 29 mai 2013 08:15
Bonjour jguinchard,
merci pour cette réponse détaillée.
Est-il possible d'utiliser un compte AD (admin du domaine) pour l’authentification correspondant à l'ancien mot de passe (première ligne).
Je m'explique : le mot de passe admin local n'est pas uniforme sur l'ensemble des PC (d'où cette nécessite de le changer).
Bonne journée
jguinch
Modérateur
Messages : 2515 Enregistré le : lun. 14 févr. 2011 22:12
Status :
Hors ligne
#4
Message
par jguinch » mer. 29 mai 2013 09:07
Il faut que tu effectue les modifications dans la fonction RunAsWait()
Regarde la doc, c'est assez simple.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !