Ecco un po 'di codice PowerShell per fare ciò che stai cercando con gli account di dominio:
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)
Il provider ASDI supporta anche la sintassi WinNT://computername/username
per il ChangePassword()
metodo. L' ADSystemInfo
oggetto, tuttavia, non funzionerà per gli account macchina-locali, quindi non è possibile modificare semplicemente il codice sopra con la WinNT://...
sintassi.
(Qualcuno vuole suggerire una modifica con codice per distinguere tra account locali e di dominio?)
Su una virata completamente diversa, la vecchia NetUserChangePassword
API funzionerà anche con account locali (e di dominio, purché tu specifichi il nome di dominio nella sintassi 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)
Questo codice presuppone che tu stia modificando una password sul computer locale (".").