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 (".").