Question Changer le mot de passe admin des ordis de l'AD
- LIEFOOGHE
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 12
- Remerciements reçus 0
il y a 15 ans 6 mois #3078
par LIEFOOGHE
Christophe LIEFOOGHE
SUPINFO Student
www.reseau-dev.fr
Changer le mot de passe admin des ordis de l'AD a été créé par LIEFOOGHE
[code:1]Voici un petit script pour changer le mot de passe administrateur locale de tous les ordinateurs d’un domaine :
#Ignorer les erreurs ( Serveur Linux ou accès refusé )
$ErrorActionPreference = “SilentlyContinue”
#Verifie si le serveur est bien sur le réseau via WMI
Function Ping-Host {
PROCESS {
$errorActionPreference=”SilentlyContinue”
$wmi = get-wmiobject -query “SELECT * FROM Win32_PingStatus WHERE Address = ‘$_’”
if ($wmi.StatusCode -eq 0) {
return ‘OK’
}
return ‘KO’
}
}
#Recherche des Serveurs
$objCommun = ADSI]”LDAP://ou=srv, dc=reseau-dev,dc=fr”
$objRecherche = New-Object `
System.DirectoryServices.DirectorySearcher($objCommun)
$objRecherche.PageSize = 6000
$requete = ‘(&(sAMAccountType=805306369) (name=*))’
$objRecherche.Filter=$requete
foreach($serveur in $objRecherche.FindAll())
{
#CN du Serveur ( Nom Netbios )
$strComputer = $serveur.properties.cn
#Verifie si le serveur est sur le réseau
$VerifPing = $strComputer | Ping-Host
if ($VerifPing -eq ‘OK’)
{
Write-Host ‘Changement du mot de passe Admin du :’ $strComputer
#Objet WMI
$WmiOS = gwmi Win32_OperatingSystem -computer $strComputer
#Serveur FR
if ($WmiOS.OSLanguage -eq 1036)
{
$admin=[adsi](”WinNT://” + $strComputer + “/administrateur, user”)
$admin.psbase.invoke(”SetPassword”, P@ssW0rd)
$admin.psbase.CommitChanges()
}
#Serveur EN
elseif ($WmiOS.OSLanguage -eq 1033)
{
$admin=[adsi](”WinNT://” + $strComputer + “/administrator, user”)
$admin.psbase.invoke(”SetPassword”, “P@ssW0rd“)
$admin.psbase.CommitChanges()
}
}
}[/code:1]
Débutant en PowerShell, ce script n'est pas optimisé au maximum
#Ignorer les erreurs ( Serveur Linux ou accès refusé )
$ErrorActionPreference = “SilentlyContinue”
#Verifie si le serveur est bien sur le réseau via WMI
Function Ping-Host {
PROCESS {
$errorActionPreference=”SilentlyContinue”
$wmi = get-wmiobject -query “SELECT * FROM Win32_PingStatus WHERE Address = ‘$_’”
if ($wmi.StatusCode -eq 0) {
return ‘OK’
}
return ‘KO’
}
}
#Recherche des Serveurs
$objCommun = ADSI]”LDAP://ou=srv, dc=reseau-dev,dc=fr”
$objRecherche = New-Object `
System.DirectoryServices.DirectorySearcher($objCommun)
$objRecherche.PageSize = 6000
$requete = ‘(&(sAMAccountType=805306369) (name=*))’
$objRecherche.Filter=$requete
foreach($serveur in $objRecherche.FindAll())
{
#CN du Serveur ( Nom Netbios )
$strComputer = $serveur.properties.cn
#Verifie si le serveur est sur le réseau
$VerifPing = $strComputer | Ping-Host
if ($VerifPing -eq ‘OK’)
{
Write-Host ‘Changement du mot de passe Admin du :’ $strComputer
#Objet WMI
$WmiOS = gwmi Win32_OperatingSystem -computer $strComputer
#Serveur FR
if ($WmiOS.OSLanguage -eq 1036)
{
$admin=[adsi](”WinNT://” + $strComputer + “/administrateur, user”)
$admin.psbase.invoke(”SetPassword”, P@ssW0rd)
$admin.psbase.CommitChanges()
}
#Serveur EN
elseif ($WmiOS.OSLanguage -eq 1033)
{
$admin=[adsi](”WinNT://” + $strComputer + “/administrator, user”)
$admin.psbase.invoke(”SetPassword”, “P@ssW0rd“)
$admin.psbase.CommitChanges()
}
}
}[/code:1]
Débutant en PowerShell, ce script n'est pas optimisé au maximum
Christophe LIEFOOGHE
SUPINFO Student
www.reseau-dev.fr
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 15 ans 6 mois #3079
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Changer le mot de passe admin des ordis de l'AD
ZeuX écrit:
Tu peux optimiser le ping, voir ce script :
powershell-scripting.com/index.php?optio...=747&catid=5#747
Le détail de l'optimisation
thepowershellguy.com/blogs/gaurhoth/arch...nformation-ping.aspx
Ici autant utiliser des booleans :
[code:1]return ‘OK’[/code:1]
et là des constantes :
[code:1]$WmiOS.OSLanguage -eq 1036)[/code:1]
voir une hashtable
[code:1]
$AdminName=@{1036=\"Administrateur\"; ...}
[/code:1]
C'est plus mieux
Et je suis dubitatif sur cette approche :
ZeuX écrit:
Débutant en PowerShell, ce script n'est pas optimisé au maximum
Tu peux optimiser le ping, voir ce script :
powershell-scripting.com/index.php?optio...=747&catid=5#747
Le détail de l'optimisation
thepowershellguy.com/blogs/gaurhoth/arch...nformation-ping.aspx
Ici autant utiliser des booleans :
[code:1]return ‘OK’[/code:1]
et là des constantes :
[code:1]$WmiOS.OSLanguage -eq 1036)[/code:1]
voir une hashtable
[code:1]
$AdminName=@{1036=\"Administrateur\"; ...}
[/code:1]
C'est plus mieux
Et je suis dubitatif sur cette approche :
ZeuX écrit:
#Ignorer les erreurs ( Serveur Linux ou accès refusé )
$ErrorActionPreference = “SilentlyContinue”
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 15 ans 5 mois #3082
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Changer le mot de passe admin des ordis de l'AD
Une proposition d'amélioration
[code:1]
#Codepage des pays
$Fr=1036
$En=1033
#Construction de la hashtable
$LocalizedName=@{
$Fr=\"Administrateur\";
$En=\"Administrator\"
}
#Ignorer les erreurs ( Serveur Linux ou accès refusé )
$ErrorActionPreference = \"SilentlyContinue\"
#Verifie si le serveur répond à la requête WMI
Function Ping-Host {
PROCESS {
$errorActionPreference=\"SilentlyContinue\"
#$wmi = get-wmiobject -query \"SELECT * FROM Win32_PingStatus WHERE Address='$_'\"
#En plus concis
$wmi = Get-WmiObject Win32_PingStatus -Filter \"Address='$_'\"
#Renvoi false même si $Wmi ou $Wmi.StatusCode sont à $null
return ($wmi.StatusCode -eq 0)
}
}
#Recherche des Serveurs
$objCommun = ADSI]\"LDAP://ou=srv, dc=reseau-dev,dc=fr\"
$objRecherche = New-Object System.DirectoryServices.DirectorySearcher($objCommun)
$objRecherche.PageSize = 6000
$requete ='(&(sAMAccountType=805306369) (name=*))'
$objRecherche.Filter=$requete
foreach($serveur in $objRecherche.FindAll())
{
#CN du Serveur ( Nom Netbios )
$strComputer = $serveur.properties.cn
#Vérifie si le serveur est sur le réseau
if ($strComputer | Ping-Host)
{
Write-Host \"Changement du mot de passe Admin du : $strComputer\"
#Objet WMI
$WmiOS = gwmi Win32_OperatingSystem -computer $strComputer
#$WmiOS.OSLanguage renvoi un entier non signé UInt mais 1036
# ou $Asm::GetCultureInfo(\"Fr-fr\"«»).Lcid renvoi un Int
#Ce qui fait que la construction suivante ne fonctionne pas :
# $LocalName=$LocalizedName.Item($WmiOS.OSLanguage)
#On doit donc caster la valeur
$LocalName=$LocalizedName.Item([int]$WmiOS.OSLanguage)
$admin=[adsi](\"WinNT://$strComputer/$LocalName, user\"«»)
$admin.psbase.invoke(\"SetPassword\", P@ssW0rd)
$admin.psbase.CommitChanges()
} #If
}#Foreach
[/code:1]
Pour l'initialisation de la hashtable on peut aussi autodocumenter le code en faisant :
[code:1]
$Asm=[System.Globalization.CultureInfo]
#[void][Reflection.Assembly]::LoadWithPartialName(\"System.Globalization\"«»)
#Construction de la hashtable
$LocalizedName=@{
$Asm::GetCultureInfo(\"Fr-fr\"«»).Lcid=\"Administrateur\";
$Asm::GetCultureInfo(\"En-Us\"«»).Lcid=\"Administrator\"
}
...
[/code:1]
Une autre approche un peu plus ardue que ce soit sous PowerShell ou pas:
support.microsoft.com/kb/157234
Ce qui permettrait d'adresser les \"Well-known users\" sur la machine distante au lieu de construire une hashtable via WMI.
[code:1]
#Codepage des pays
$Fr=1036
$En=1033
#Construction de la hashtable
$LocalizedName=@{
$Fr=\"Administrateur\";
$En=\"Administrator\"
}
#Ignorer les erreurs ( Serveur Linux ou accès refusé )
$ErrorActionPreference = \"SilentlyContinue\"
#Verifie si le serveur répond à la requête WMI
Function Ping-Host {
PROCESS {
$errorActionPreference=\"SilentlyContinue\"
#$wmi = get-wmiobject -query \"SELECT * FROM Win32_PingStatus WHERE Address='$_'\"
#En plus concis
$wmi = Get-WmiObject Win32_PingStatus -Filter \"Address='$_'\"
#Renvoi false même si $Wmi ou $Wmi.StatusCode sont à $null
return ($wmi.StatusCode -eq 0)
}
}
#Recherche des Serveurs
$objCommun = ADSI]\"LDAP://ou=srv, dc=reseau-dev,dc=fr\"
$objRecherche = New-Object System.DirectoryServices.DirectorySearcher($objCommun)
$objRecherche.PageSize = 6000
$requete ='(&(sAMAccountType=805306369) (name=*))'
$objRecherche.Filter=$requete
foreach($serveur in $objRecherche.FindAll())
{
#CN du Serveur ( Nom Netbios )
$strComputer = $serveur.properties.cn
#Vérifie si le serveur est sur le réseau
if ($strComputer | Ping-Host)
{
Write-Host \"Changement du mot de passe Admin du : $strComputer\"
#Objet WMI
$WmiOS = gwmi Win32_OperatingSystem -computer $strComputer
#$WmiOS.OSLanguage renvoi un entier non signé UInt mais 1036
# ou $Asm::GetCultureInfo(\"Fr-fr\"«»).Lcid renvoi un Int
#Ce qui fait que la construction suivante ne fonctionne pas :
# $LocalName=$LocalizedName.Item($WmiOS.OSLanguage)
#On doit donc caster la valeur
$LocalName=$LocalizedName.Item([int]$WmiOS.OSLanguage)
$admin=[adsi](\"WinNT://$strComputer/$LocalName, user\"«»)
$admin.psbase.invoke(\"SetPassword\", P@ssW0rd)
$admin.psbase.CommitChanges()
} #If
}#Foreach
[/code:1]
Pour l'initialisation de la hashtable on peut aussi autodocumenter le code en faisant :
[code:1]
$Asm=[System.Globalization.CultureInfo]
#[void][Reflection.Assembly]::LoadWithPartialName(\"System.Globalization\"«»)
#Construction de la hashtable
$LocalizedName=@{
$Asm::GetCultureInfo(\"Fr-fr\"«»).Lcid=\"Administrateur\";
$Asm::GetCultureInfo(\"En-Us\"«»).Lcid=\"Administrator\"
}
...
[/code:1]
Une autre approche un peu plus ardue que ce soit sous PowerShell ou pas:
support.microsoft.com/kb/157234
Ce qui permettrait d'adresser les \"Well-known users\" sur la machine distante au lieu de construire une hashtable via WMI.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- LIEFOOGHE
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 12
- Remerciements reçus 0
il y a 15 ans 5 mois #3093
par LIEFOOGHE
Christophe LIEFOOGHE
SUPINFO Student
www.reseau-dev.fr
Réponse de LIEFOOGHE sur le sujet Re:Changer le mot de passe admin des ordis de l'AD
Merci pour votre aide et vos améliorations.
Laurent Dardenne écrit:
J'ai essayé d'utiliser le framekorks mais j'ai eu quelque problème pour gérer les exceptions en POwerShell.
Si j'utilise le framekorks et que mon hote n'existe pas, problème de résolution DNS et mon script plante.
En C# il suffit d'utiliser le bloque Try Catch, mais en POwerShell je n'ai pas trouvé.
Laurent Dardenne écrit:
ZeuX écrit:
Débutant en PowerShell, ce script n'est pas optimisé au maximum
Tu peux optimiser le ping, voir ce script :
powershell-scripting.com/index.php?optio...=747&catid=5#747
Le détail de l'optimisation
thepowershellguy.com/blogs/gaurhoth/arch...nformation-ping.aspx
J'ai essayé d'utiliser le framekorks mais j'ai eu quelque problème pour gérer les exceptions en POwerShell.
Si j'utilise le framekorks et que mon hote n'existe pas, problème de résolution DNS et mon script plante.
En C# il suffit d'utiliser le bloque Try Catch, mais en POwerShell je n'ai pas trouvé.
Christophe LIEFOOGHE
SUPINFO Student
www.reseau-dev.fr
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 15 ans 5 mois #3100
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Changer le mot de passe admin des ordis de l'AD
ZeuX écrit:
Mais c'est vrai que la gestion des erreurs n'est pas aussi aisée que sous C# et le bloc finally n'existe pas dans la version 1 de PS.
Il s'agit de l'instruction Trap : huddledmasses.org/trap-exception-in-powershell/En C# il suffit d'utiliser le bloque Try Catch, mais en POwerShell je n'ai pas trouvé.
Mais c'est vrai que la gestion des erreurs n'est pas aussi aisée que sous C# et le bloc finally n'existe pas dans la version 1 de PS.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.078 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- Changer le mot de passe admin des ordis de l'AD