Veja alguns códigos do PowerShell para fazer o que você está procurando com contas de domínio:
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)
O provedor ASDI também suporta a sintaxe WinNT://computername/username
do método ChangePassword()
. O objeto ADSystemInfo
, no entanto, não funcionará para contas locais de máquinas, portanto, apenas adaptar o código acima com a sintaxe WinNT://...
não é viável.
(Alguém quer sugerir uma edição com código para diferenciar entre contas locais e de domínio?)
Em uma abordagem completamente diferente, a antiga NetUserChangePassword
API funcionará com contas locais (e de domínio, desde que você especifique o nome do domínio na sintaxe do NetBIOS) também:
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)
Este código presume que você está alterando uma senha na máquina local (".").