Voici du code PowerShell pour faire ce que vous cherchez avec des comptes de domaine:
param (
[string]$oldPassword = $( Read-Host "Old password"),
[string]$newPassword = $( Read-Host "New password")
)
$ADSystemInfo = New-Object -ComObject ADSystemInfo
$type = $ADSystemInfo.GetType()
$user = [ADSI] "LDAP://$($type.InvokeMember('UserName', 'GetProperty', $null, $ADSystemInfo, $null))"
$user.ChangePassword( $oldPassword, $newPassword)
Le fournisseur ASDI prend également en charge la syntaxe WinNT://computername/username
de la ChangePassword()
méthode. L' ADSystemInfo
objet, cependant, ne fonctionnera pas pour les comptes de la machine locale, de sorte que le code modernisation ci - dessus avec la WinNT://...
syntaxe n'est pas réalisable.
(Quelqu'un veut-il suggérer une modification avec un code pour différencier les comptes locaux et les comptes de domaine?)
Sur une approche complètement différente, l'ancienne NetUserChangePassword
API fonctionnera également avec les comptes locaux (et de domaine, à condition que vous spécifiiez le nom de domaine dans la syntaxe NetBIOS):
param (
[string]$oldPassword = $( Read-Host "Old password"),
[string]$newPassword = $( Read-Host "New password")
)
$MethodDefinition = @'
[DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
public static extern bool NetUserChangePassword(string domainname, string username, string oldPassword, string newPassword);
'@
$NetAPI32 = Add-Type -MemberDefinition $MethodDefinition -Name 'NetAPI32' -Namespace 'Win32' -PassThru
$NetAPI32::NetUserChangePassword('.', $env:username, $oldPassword, $newPassword)
Ce code suppose que vous modifiez un mot de passe sur la machine locale (".").
PS1
script autonome qui peut être appelé avec ou sans paramètres. C'est aussi beaucoup plus lisible. Le code est tout au sujet des humains comprenant ce que quelqu'un d'autre a écrit, pas l'ordinateur. Aucune des deux solutions ne sera plus rapide que l'autre.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Mais cela a retourné 'Le mot de passe ne répond pas aux exigences de la politique de mot de passe ...'. Le nouveau mot de passe répond cependant à ces exigences.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
C'est en fait assez simple dans PowerShell:
la source
J'ai essayé les deux réponses ci-dessus en vain, pour changer le mot de passe d'un administrateur local qui n'est pas joint au domaine. En fouillant dans les commentaires, j'ai trouvé ce dont j'avais besoin.
Pour la deuxième partie de la réponse actuellement acceptée, vous souhaitez mettre à jour la signature à utiliser
long
au lieu de labool
valeur de retour, et celles-ci peuvent être résolues dans la documentation des codes d'erreur système . Vous vous retrouvez donc avec:Cependant, cela n'a pas fonctionné pour moi. Les codes d'erreur ont alterné entre 86 et 2221, selon la façon dont j'ai configuré les paramètres. Était sur le point d'abandonner et de creuser davantage dans les commentaires, et a finalement réussi à faire:
Absolument ridicule que le simple CHANGEMENT d'un mot de passe administrateur local est si compliqué dans Powershell. Si vous stockez des chaînes de sécurité sur votre système, la mise à jour du mot de passe doit être effectuée en fournissant l'ancien mot de passe, sinon vous risquez de perdre la capacité de décrypter correctement ces chaînes sécurisées!
la source