Question Changer le mot de passe admin des ordis de l'AD

Plus d'informations
il y a 15 ans 6 mois #3078 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

Christophe LIEFOOGHE
SUPINFO Student
www.reseau-dev.fr

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 6 mois #3079 par Laurent Dardenne
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”

:huh:

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 5 mois #3082 par Laurent Dardenne
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.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 5 mois #3093 par LIEFOOGHE
Merci pour votre aide et vos améliorations.

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


:huh:


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.

Plus d'informations
il y a 15 ans 5 mois #3100 par Laurent Dardenne
ZeuX écrit:

En C# il suffit d'utiliser le bloque Try Catch, mais en POwerShell je n'ai pas trouvé.

Il s'agit de l'instruction Trap : huddledmasses.org/trap-exception-in-powershell/

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
Propulsé par Kunena