Aquí hay un código de PowerShell para hacer lo que está buscando con las cuentas de 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)
El proveedor ASDI también admite la sintaxis WinNT://computername/username
para el ChangePassword()
método. El ADSystemInfo
objetivo, sin embargo, no funcionará para las cuentas de equipo local, por lo que sólo reequipamiento el código anterior con la WinNT://...
sintaxis no es viable.
(¿Alguien quiere sugerir una edición con código para diferenciar entre cuentas locales y de dominio?)
En una táctica completamente diferente, la antigua NetUserChangePassword
API también funcionará con cuentas locales (y de dominio, siempre que especifique el nombre de dominio en la sintaxis de 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)
Este código supone que está cambiando una contraseña en la máquina local (".").
PS1
script independiente que se puede invocar con o sin parámetros. También es mucho más legible. El código se trata de que los humanos entiendan lo que alguien más ha escrito, no la computadora. Ninguna de las soluciones será más rápida que la otra.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Pero eso devolvió 'La contraseña no cumple con los requisitos de la política de contraseña ...'. Sin embargo, la nueva contraseña cumple con esos requisitos.([ADSI]'WinNT://localhost/USERNAME').ChangePassword("OLDPASS", "NEWPASS")
Esto es realmente bastante simple en PowerShell:
fuente
Intenté ambas respuestas anteriores en vano, para cambiar la contraseña de un administrador local que no está unido al dominio. Sin embargo, hurgar en los comentarios arrojó lo que necesitaba.
Para la segunda parte de la respuesta actualmente aceptada, desea actualizar la firma para usar en
long
lugar delbool
valor de retorno, y estos pueden solucionarse en los documentos de códigos de error del sistema . Entonces terminas con:Sin embargo, eso no funcionó para mí. Los códigos de error alternaban entre 86 y 2221, dependiendo de cómo configuré los parámetros. Estaba a punto de rendirme y profundizar más en los comentarios, y finalmente encontré éxito al hacer:
Absolutamente ridículo que el CAMBIO simple de una contraseña de administrador local sea tan complicado en Powershell. Si almacena cadenas de seguridad en su sistema, entonces la actualización de la contraseña debe hacerse con el suministro de la contraseña anterior, ¡o corre el riesgo de perder la capacidad de descifrar esas cadenas seguras correctamente!
fuente